RU

Модуль карты

Bumbr #465 17.07.2013 11:35 31 comments 21626 views

Пишу на досуге рпг, занимаюсь пока разными техническими вопросами. Пока закончил генерацию персонажа и сейчас работаю над модулем карты. Поскольку выяснилось, что в AeroQSP нельзя привязать действия к клавиатуре, пришлось делать мышиное управление. Хочется узнать ваше мнение.
Кнопки вверху справа пока что все очищают окно доп. описания, потому что в этом модуле они не задействованы.
Сундуки и трупы только выводят содержимое в окно доп. описания.
NPC не генерятся потому что не сделана система боя и диалогов.

Больше всего меня беспокоит система передвижения. Как организовать выбор действия, нужно ли объединить некоторые действия, например передвижение с взаимодействием, или наоборот сделать более специфичные действия?

Тест работы с картой

Edited at 17.07.2013 11:35 (12 years ago)
Aleks Versus Moderator 17.07.2013 20:16 (12 years ago)

Симпатично. Мне нравится. Особенно то, что герой сам прокладывает маршрут.
Основной недостаток: карта каждый раз долго перестраивается. Я как будто снова столкнулся со сбоем кадровой развёртки на стареньком “темпе”.

Передвижение со взаимодействием определённо нужно сделать. Фактически щелчок по предмету мышью должен говорить герою: подойди и провзаимодействуй. Не обязательно делать отдельные действия: взять, осмотреть, двигаться. Завяжи всё на ссылки. Щёлкнул по трупу - герой подошёл к трупу и открыл его (ну как сундук тот же). Не стоит городить кучу лишних действий, к которым необходимо всё время возвращаться.

К сожалению, я не придумал как можно избавиться от мерцания при перестроении карты. единственный способ - это уменьшить кол-во тайлов на экран, чтобы выводить приходилось меньше. Однако выигрыш не существенный, а обзор сокращается.

Соединять взаимодействие с передвижением, я боюсь из-за того что те же трупы, являясь контейнерами и проходимыми клетками могут привести к тому, что игрок вместо того чтобы пройти в нужную точку будет доходить до неё и открывать окно инвенторя.

Я никак не могу придумать, как сделать движение прерываемым. Сейчас если вы начали движение его нельзя остановить, что не есть хорошо. Переложить wait на локацию-счётчик, пока не выходит.

Aleks Versus Moderator 18.07.2013 18:27 (12 years ago)

Bumbr:

игрок вместо того чтобы пройти в нужную точку будет доходить до неё и открывать окно инвенторя

А. В том смысле, что если щёлкнул на труп, то придётся дойти и осмотреть в любом случае, даже если не хочешь его осматривать? Или я не правильно понял? Если правильно, то можно решить через меню. Если кликнул труп, то выводишь меню с двумя пунктами: “встать сюда” и “подойти и осмотреть”. Если выбрал точку без никто, меню не выводится, герой просто перемещается к ней. Если выбрал сундук, само собой понятно, что ты хочешь его осмотреть, значит без всякого меню герой подходит и осматривает.

По мерцанию подумаю. Надо сделать так, чтобы не приходилось всякий раз прогонять цикл в 225 кругов.

Aleks Versus Moderator 20.07.2013 19:20 (12 years ago)

Поколдовал на досуге над твоим кодом и решил проблему мерцания. Единственно, устроит ли тебя такой способ отрисовки карты.

Смысл в чём. Происходит нечто вроде рендеринга. Область карты, которая видна игроку, запоминается в специальном массиве. Когда герой перемещается по карте, карта не перестраивается всякий раз вокруг него, а отрисовывается одна и та же. Перерисовываются только две клетки. Клетка, в которой герой сейчас находится, и клетка, в которой герой был до этого. Когда герой достигает границы экрана, производится вычисление новой видимой области и герою открывается другой квадрат 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-таблицы, в то время как игрок является содержимым этой таблицыи накладывается на этот фон. Перенастроил генератор, чтобы было меньше блоков.
Вид будет вертикально сверху, так понадобится меньше различных тайлов.

Модуль карты

Aleks Versus Moderator 23.07.2013 20:02 (12 years ago)

Nex:

Не проще ли взять готовый RPG-конструктор?

Bumbr:

тут интереснее процесс.

Аналогично. Вот я ни одной игры ещё не написал, но под завязку увлечен QSP уже больше пяти лет. Ну не знаю, как это объяснить. Любовью создавать себе проблемы и решать их?

Bumbr:

Модуль карты

Всё же некоторые препятствия герой обходит за границами карты. Судя по тому, как распознаются проходимые и непроходимые клетки, тебе просто надо поменять значения map. Для проходимых сделать 1, для непроходимых 0. Ну и в алгоритме, который просчитывает путь, соответственно переписать значения и сравнения. Тогда все окружающие карту клетки будут по умолчанию непроходимыми.

Это я просто забыл доделать малость. По плану при генерации карты по границе будет выставлена невидимая стена.
На приоритете у меня сейчас сделать крышу домам, чтобы она исчезала когда внутрь заходишь и возможно ограниченную область обзора, если придумаю как её быстро рассчитывать.

Aleks Versus Moderator 23.07.2013 20:19 (12 years ago)

То есть поменять значения сложнее, чем генерировать стену? Я не вникал в принципы просчёта пути, но мне кажется нецелесообразной генерация лишних стен. Тем более невидимых. Впрочем, хозяин - барин.

Невидимые стены никому там не помешают, потому что задать движение за пределы карты - нельзя, а если менять значения, то надо выискивать все проверки на проходимость, ничего невозможного конечно, но неудобно. Хотя с точки зрения логики так проще, не нужно код усложнять. Еще надо будет в генераторе карты переписать этот атрибут.
Вобщем надо подумать.

Добавил крыши домам.
Переделал сундуки и трупы.
Пофиксил хождение сквозь угловые стены.
Пофиксил хождение за пределами карты.

Из новых багов: Клетка в которой был игрок до перемещения отображается некорректно (не отображаются крыши и объекты)
но это несложно поправить.
Тест работы с картой

Из важного осталось сделать работающие двери, NPC и точки перехода с карты на карту.

Переделал действия. Теперь персонаж подходит к сундуку или трупу если приказать открыть их. Добавил возможность осмотреть соседние зоны.
Добавил три режима движения.
Учитывается время затраченное на путь, однако оно пока нигде не отображается.
в редакторе из-за изменений в механики карты пока можно только сгенерировать карту, однако делать на ней ничего нельзя.
Из багов пока нашёл, только что можно осмотреть пол и дай команду на движений к сундукам через крышу здания, однако это самоустранится когда я сделаю систему проверки радиуса обзора.

Тест работы с картой

Log in or Register to post comments.