Модуль карты
Пишу на досуге рпг, занимаюсь пока разными техническими вопросами. Пока закончил генерацию персонажа и сейчас работаю над модулем карты. Поскольку выяснилось, что в AeroQSP нельзя привязать действия к клавиатуре, пришлось делать мышиное управление. Хочется узнать ваше мнение.
Кнопки вверху справа пока что все очищают окно доп. описания, потому что в этом модуле они не задействованы.
Сундуки и трупы только выводят содержимое в окно доп. описания.
NPC не генерятся потому что не сделана система боя и диалогов.
Больше всего меня беспокоит система передвижения. Как организовать выбор действия, нужно ли объединить некоторые действия, например передвижение с взаимодействием, или наоборот сделать более специфичные действия?
Симпатично. Мне нравится. Особенно то, что герой сам прокладывает маршрут.
Основной недостаток: карта каждый раз долго перестраивается. Я как будто снова столкнулся со сбоем кадровой развёртки на стареньком “темпе”.
Передвижение со взаимодействием определённо нужно сделать. Фактически щелчок по предмету мышью должен говорить герою: подойди и провзаимодействуй. Не обязательно делать отдельные действия: взять, осмотреть, двигаться. Завяжи всё на ссылки. Щёлкнул по трупу - герой подошёл к трупу и открыл его (ну как сундук тот же). Не стоит городить кучу лишних действий, к которым необходимо всё время возвращаться.
К сожалению, я не придумал как можно избавиться от мерцания при перестроении карты. единственный способ - это уменьшить кол-во тайлов на экран, чтобы выводить приходилось меньше. Однако выигрыш не существенный, а обзор сокращается.
Соединять взаимодействие с передвижением, я боюсь из-за того что те же трупы, являясь контейнерами и проходимыми клетками могут привести к тому, что игрок вместо того чтобы пройти в нужную точку будет доходить до неё и открывать окно инвенторя.
Я никак не могу придумать, как сделать движение прерываемым. Сейчас если вы начали движение его нельзя остановить, что не есть хорошо. Переложить wait на локацию-счётчик, пока не выходит.
Bumbr:
игрок вместо того чтобы пройти в нужную точку будет доходить до неё и открывать окно инвенторя
А. В том смысле, что если щёлкнул на труп, то придётся дойти и осмотреть в любом случае, даже если не хочешь его осматривать? Или я не правильно понял? Если правильно, то можно решить через меню. Если кликнул труп, то выводишь меню с двумя пунктами: “встать сюда” и “подойти и осмотреть”. Если выбрал точку без никто, меню не выводится, герой просто перемещается к ней. Если выбрал сундук, само собой понятно, что ты хочешь его осмотреть, значит без всякого меню герой подходит и осматривает.
По мерцанию подумаю. Надо сделать так, чтобы не приходилось всякий раз прогонять цикл в 225 кругов.
Поколдовал на досуге над твоим кодом и решил проблему мерцания. Единственно, устроит ли тебя такой способ отрисовки карты.
Смысл в чём. Происходит нечто вроде рендеринга. Область карты, которая видна игроку, запоминается в специальном массиве. Когда герой перемещается по карте, карта не перестраивается всякий раз вокруг него, а отрисовывается одна и та же. Перерисовываются только две клетки. Клетка, в которой герой сейчас находится, и клетка, в которой герой был до этого. Когда герой достигает границы экрана, производится вычисление новой видимой области и герою открывается другой квадрат 15х15. Это сопровождается известным нам мерцанием. Недостатком такого способа отображения нахожу одно: когда происходит переключение областей, отображаемое положение героя может сбивать с толку игрока. Впрочем, это проблема легко решается правильным дизайном карты.
Вот список правок, которые я внёс:
1. локация “Тест Движения Мышь” - строки 3 и 4. Переменными s_x и s_y определяются координаты точки начала отрисовки карты.
2. локация “Создание случайной карты” - строка 23. Добавлен вывод надписи “Карта создана…”, когда закончено создание случайной карты.
3. Локация “Обработка клика” - строка 12 закоментирована. Не имеет смысла производить обработку карты, если попросту нет пути.
4. Локация “Обработка карты” - переписана полностью.
5. Добавлена локация “map.reRendering”, которая заполняет массив $object_cell[’<<x>>,<<y>>’] видимыми клетками.
В остальном ничего вроде бы не менял.
Обнаружил баг. Если герой стоит у края карты, он может проложить новый маршрут за пределами карты. Особенно заметно, если надо обойти препятствие на той же линии, где стоит герой.
Я думал над таким решением, были даже заготовки. Проблема еще в том, что я не знаю как буду реализовывать в игре бой, понадобится там карта или нет. Однако ваш вариант кажется лучшим.
Я сейчас переписываю генерацию случайной карты для работы не заготовками разных размеров, а не генерировать каждую. Также добавляю стены между клетками, отрисовку домов с внутренними помещениями, чтобы когда вы снаружи отображалась крыша. В связи с такими внушительными изменениями в механике, я позже сам перепишу код отображения карты, чтобы не мерцало.
Благодарю за помощь.
Не проще ли взять готовый RPG-конструктор?
Ну во первых - это не так интересно. QSP - очень интересная платформа, с очень широкими возможностями. В какой-то степени это забивание гвоздей микроскопом, или наоборот - исследование клеток молотком…
Делается же это не с какой-то конкретной целью, а так, для себя. Вот дернуло меня как-то: “А что, если попытаться сделать рпг с видом как в wasteland в qsp? Реально ли это?” Делать было нечего, сел и начал писать. В ходе работы узнал много интересного, например узнал о разных алгоритмах поиска путей и областях их применения.
Ставь я себе целью именно написать игру - тогда действительно готовый RPG-конструтор был бы очевиденым решением, но тут интереснее процесс.
А мерцание это вы про что говорите? у вас там затемнение происходит при переходе. Это кажется отключается в настройках.
Даже точно отключается.
Мерцание происходит не из-за перехода с локации на локацию, а из-за того что описание убирается, а новое выводится циклом в 255 тиков.
Переделал обработку карты, как советовал Aleks Versus, добавил генерацию стен и корректный поиск пути с их учётом.
Карта теперь записывается как фон HTML-таблицы, в то время как игрок является содержимым этой таблицыи накладывается на этот фон. Перенастроил генератор, чтобы было меньше блоков.
Вид будет вертикально сверху, так понадобится меньше различных тайлов.
Nex:
Не проще ли взять готовый RPG-конструктор?
Bumbr:
тут интереснее процесс.
Аналогично. Вот я ни одной игры ещё не написал, но под завязку увлечен QSP уже больше пяти лет. Ну не знаю, как это объяснить. Любовью создавать себе проблемы и решать их?
Bumbr:
Модуль карты
Всё же некоторые препятствия герой обходит за границами карты. Судя по тому, как распознаются проходимые и непроходимые клетки, тебе просто надо поменять значения map. Для проходимых сделать 1, для непроходимых 0. Ну и в алгоритме, который просчитывает путь, соответственно переписать значения и сравнения. Тогда все окружающие карту клетки будут по умолчанию непроходимыми.
Это я просто забыл доделать малость. По плану при генерации карты по границе будет выставлена невидимая стена.
На приоритете у меня сейчас сделать крышу домам, чтобы она исчезала когда внутрь заходишь и возможно ограниченную область обзора, если придумаю как её быстро рассчитывать.
То есть поменять значения сложнее, чем генерировать стену? Я не вникал в принципы просчёта пути, но мне кажется нецелесообразной генерация лишних стен. Тем более невидимых. Впрочем, хозяин - барин.
Невидимые стены никому там не помешают, потому что задать движение за пределы карты - нельзя, а если менять значения, то надо выискивать все проверки на проходимость, ничего невозможного конечно, но неудобно. Хотя с точки зрения логики так проще, не нужно код усложнять. Еще надо будет в генераторе карты переписать этот атрибут.
Вобщем надо подумать.
Добавил крыши домам.
Переделал сундуки и трупы.
Пофиксил хождение сквозь угловые стены.
Пофиксил хождение за пределами карты.
Из новых багов: Клетка в которой был игрок до перемещения отображается некорректно (не отображаются крыши и объекты)
но это несложно поправить.
Тест работы с картой
Из важного осталось сделать работающие двери, NPC и точки перехода с карты на карту.
Переделал действия. Теперь персонаж подходит к сундуку или трупу если приказать открыть их. Добавил возможность осмотреть соседние зоны.
Добавил три режима движения.
Учитывается время затраченное на путь, однако оно пока нигде не отображается.
в редакторе из-за изменений в механики карты пока можно только сгенерировать карту, однако делать на ней ничего нельзя.
Из багов пока нашёл, только что можно осмотреть пол и дай команду на движений к сундукам через крышу здания, однако это самоустранится когда я сделаю систему проверки радиуса обзора.