поле боя — формирование позиционной сетки

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

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

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

Для начала, стоит определиться в местоположении поля. Тут возникает ряд проблем. Если поле боя находится в пределах некой равнины, где от края до края глаза не хватает, то все хорошо. Но бой может проходить на участках с ограниченным пространством, тут уже все сложнее.

И так, в поле, все просто. Надо лишь определить стартовую позицию, откуда начать построение. Тут есть несколько вариантов.

Определение позиции стартовой клетки в поле боя.

Вариант первый: Определить позицию атакующего и формирование начать относительно него, в заданную сторону.

Поле боя формируется от атакующего, в заданном направлении.

Поле боя формируется от атакующего, в заданном направлении.

 

Вариант второй: Определить позицию атакующего и атакуемого. Далее определить кто из участников «южнее», и начинать формирование поля от южного, раскладывая доску в северном направлении. По сути в этом варианте, можно определить и кто например восточнее, раскладывая на запад.

Поле боя формируется от южного, при "северном" ориентировании поля.

Поле боя формируется от южного, при «северном» ориентировании поля.

 

Вариант третий более интересный. Прежде чем сформировать поле, необходимо найти центральную точку между двумя игроками. Для этого достаточно найти их позиции скажем по X и по Y. Скажем игрок1 имеет позицию где X = 3 а Y = 5, а игрок2 X=1 Y=2.

Находим центр: X1-X2 = 2 Y1-Y2 = 3 (естественно полный поиск выглядит иначе, тут пример на пальцах).

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

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

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

 

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

 

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

Двигаемся дальше, определение возможности построения клеток в поле боя.

 

Массив точек формируемого поля.

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

Схема построения поля, методом вложенного цикла (линейное построение)

Схема построения поля, методом вложенного цикла (линейное построение)

 

Райкаст вам в помощь!

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

Поле сформировано, но оно не формируется за обрывом

Поле сформировано, но оно не формируется за обрывом

Главная задача, это не формировать точки там, где герой не сможет пройти.

Выполнение условия запрета формирования в пустоте

Выполнение условия запрета формирования в пустоте

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

Получив точку, необходимо узнать, в какой плоскости находится полигон, на котором находится точка. Допустим мы имеем модель земли, по которой передвигается герой. Вот ее полигоны и надо отслеживать. Как получить плоскость полигона? Необходимо просто найти его нормаль. Найдя нормаль полигона, можно понять, под каким углом он лежит относительно героя. Т.к. герой передвигается горизонтально, следовательно вертикальный вектор героя, можно считать «нулевым», и вот как раз расчет угла между нормалью героя и нормалью полигона, позволяют нам понять, может ли герой, наступить на этот полигон.

Для понятности: Идеальный угол в данном случае равен 90 градусам. Т.е. земля, перпендикулярна герою, герой может передвигаться по таким участкам.

Но не все отклонения от идеала могут быть непроходимыми. Допустим, отклонение в 30 градусов не является критичным моментом. Угол относительно героя составит 60 градусов, а это не смертельно. Это склон, но не на столько крутой, что бы не преодолеть его.

Основные условия, формирования корректной сетки на  поле боя.

И так, условие первое: Угол между нормалью полигона и вертикальным вектором героя не должен составлять менее 60 градусов. (в целом, угол зависит от поставленных задач, вертикальные стены тоже можно пройти, если есть веревка например). Но стоит помнить, что герой может быть не только у подножья, он может быть и на вершине, по этому стоит применить второе условие, которое ограничит угол уже в противоположную сторону, в данном примере это 120 градусов.

Вывод: Угол >60 и угол < 120.

Угол между проверенными полигонами, в приделах условия. Угол между вектором персонажа и вектором  нормали полигона, так же в приделах условия.

Угол между проверенными полигонами, в приделах условия. Угол между вектором персонажа и вектором нормали полигона, так же в приделах условия.

Вот первую пачку непроходимых полигонов мы отсеяли. Но есть еще одна партия — угол между смежными полигонами.

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

Условие второе: Угол между нормалями смежных полигонов, не должен превышать заданных норм.

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

И так, получив положительный результат после проверки этими условиями, можно смело записывать данные точки в массив, и рисовать клеточку с центром в указанной позиции.

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

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

Условие третье: Разница высот смежных клеток.

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

А смысл его в том, чтобы не формировать поля, недоступные изначально. Но и тут все просто. Если между последней сформированной клеткой и клеткой формируемой расстояние более чем расстояние в одну клетку — она недоступна. Другими словами, сформирован ряд клеток, следующий оказался на стене и не был сформирован, третий ряд, формируется следом за вторым, но!

Но тут, проверив все предыдущие условия, мы добавляем финальное — дистанция. Мы знаем позицию последней клетки, скажем в плоскости Х, мы можем вычислить разницу, между Х уже созданной и Х создаваемой. Получив значение, мы можем его сравнить с размером клетки, и если разница превышает размер, следовательно клетка третьего ряда, недоступна из клетки первого ряда, так как второй ряд был на стене и не был создан. Вот и все, наше поле, из планируемых 64 клеток превратился в 8 клеток в один ряд.

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

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

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

Заключение

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

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

 Другие статьи по теме

 

[wysija_form id=»1″]

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

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

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