позиционирование на сформированном поле

Вновь возвращаясь к теме боевой механики, хотел бы затронуть позиционирование игроков и их передвижение в рамках поля.

Из предыдущей статьи (формирование поля боя), стало ясно, как формировать поле там, где возможно, а не где попало, теперь необходимо привязать игроков к ячейкам — клеткам.

Первое что нам необходимо, это определить стартовые позиции игроков.

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

Остановимся на варианте автоматической расстановки.

Вводные данные + стартовое позиционирование.

Определимся с вводными данными. Мы знаем ширину и длину нашего поля. Эти параметры мы получили при прошлом формировании поля. Если кому не ясно, то проясняю: Клетки с придельными значениями по Х и Y будут являться пограничными, а их позиции — границами.

Если использовалось «северное развертывание», следовательно, перебрав список позиций, можно найти минимальный Y- это будет южная граница. А максимальный Y будет северной границей. Тоже самое и с Х, наименьший — это запад, а наибольший восток.

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

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

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

Данные 1: Границы поля по горизонту, общая зона боевых действий.

Далее, опять же, исходя из предыдущего метода, мы знаем, кто из героев находится ближе к какой границе.

Выполнив первое условие, мы сократили количество клеток, в которые можно приземлить игрока на старте.

Выполнив первое условие, мы сократили количество клеток, в которые можно приземлить игрока на старте.

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

Данные 2: Положение игрока относительно поля (на юге или севере).

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

Если игрок инициировал формирование поля, относительно противника с ориентацией поля на север, следовательно остается определить местонахождение северной границы, т.е. Ymax.

Если игрок инициировал формирование поля, относительно противника с ориентацией поля на север, следовательно остается определить местонахождение северной границы, т.е. Ymax.

Данные 3 : Стартовая позиция игрока по оси oY.

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

Для нахождения середины есть два пути. Первый путь, это применить формулу, где методом разности позиций по X, будет найдена середина между западной и восточной границей. Но спешу заметить, что такой метод подойдет лишь там, где поле не имеет проблем с формированием в полном размере. В случае, если поле формируется в труднодоступных местах и количество клеток может меняться в зависимости от наличия препятствий и проходимых участков, такой метод не подойдет.

В случае сложной схемы, стоит применить иной подход. Необходимо вновь обратиться к списку позиций, найти все позиции имеющие отношение к необходимой границе( т.е. все клетки, находящиеся на Y равной Y-границе). Далее, проверять Х каждой найденной клетки, и сверять расстояния до относительной середины границы. Сравнение естественно берется от минимума. От чьей X- позиции ближе до центра, ту и оставляем. Т.е. проверили позицию первой найденной клетки, дистанцию записали в переменную, проверили следующую, и если дистанция следующей клетки меньше, чем предыдущая, то перезаписываем переменную. В переменную понятное дело записываем значение X- координаты. Так, перебрав все позиции на границы, мы найдем самую ближнюю к желаемой середине. Теперь остается только указать позицию X для игрока.

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

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

Результат:

В результате перечисленных манипуляций, нам удалось получить желаемые координаты X и Y. Для противника выполняется тот-же алгоритм, но только с условием, что Y берется от противоположной границе.

Еще один плюс, заключается в том, что игрок получил истинные координаты середины клетки,  в которую он будет помещен и это нам позволяет разместить его максимально точно, относительно поля. Следовательно, начинается второй этап — привязка к клеткам поля.

Вкусное

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

Получив поле, необходимо определиться, в какую сторону на север или восток протяженность поля больше. Исходя из этого производится следующая проверка, определяющая, позиции по горизонту игроков, т.е. кто восточнее, кто севернее. Например при восточной протяжке поля, требуется найти кто из игроков самый «восточный». Это необходимо, для правильного выбора границы, вдоль которой будет устанавливаться позиция игрока. При таком подходе, возникает положительная ситуация при формировании поля на ограниченных участках с разным родом доступности. Если мост пролегает с запада на восток, следовательно игроки разместятся на западно- восточных гранях, если с севера на юг, то на юг-северных гранях. К сожалению, в предыдущей статье я не рассматривал центрированное позиционирование, поэтому я не привожу примеров в картинках для этого типа. Если в этом есть необходимость, пишите, я постараюсь описать это отдельной статьей, в которой сразу и развертывание поля и позиционирование игроков будут рассмотрены.

Движение в точку, или бежать только в центр клетки, а не рядом!

Решив проблему со стартовым позиционированием игроков, пришло время, не дать им вести себя на поле так, как им вздумается. Для этого необходимо решить две задачи. Первая — расчет конечной позиции, и вторая — расчет пути согласно поля.

Конечное позиционирование.

Используем raycast

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

И если клетка есть, то достаточно просто снять ее координаты по X и Y, и передать их, а не те, что указывает мышь, игроку. При таком подходе, персонаж всегда будет стремиться в центр клетки, в зоне которой произведен щелчок мышью. Все просто, но можно заметить, что произведено две! проверки. Первая, это наличие грунта в зоне тычка, вторая наличие клетки, входящей в состав боевой зоны. В случае, если этап формирования вашего поля, предусмотрел все неожиданности, то первую проверку на грунт можно исключить.

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

Используем перебор без raycast

Кроме райкаста, возможен и вариант простого пересчета. Зная, размер клеток и их позиции, достаточно получить XY мыши на момент клика и пройтись по списку клеток. Проходя список, необходимо выставить условие, что XY мыши должны находиться в приделах клеток относительно размера. Т.е. клеткаX + ее ширина, КлеткаX-ширина, если мышиный X находится между этими значениями, то проверяем Y по тому же принципу. Если оба условия выполняются, то значит позиция верна и находится в зоне одной из клеток, следовательно конечную позицию можно указать равной позиции XY найденной клетки.

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

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

Но об этом я поведаю в следующей статье…

[wysija_form id=»1″]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Проверка * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.