>> |
No.16174
Может, можно на время хода проиграть движение "в реальном времени"? И для этих целей может подойти дифференциация логических координат и физических. Прям как в современных ААА-играх графика и физика. Вкратце как сделано там: для графики используется многополигональная карта, с бампингом и тесселяцией, а физика обрабатывается на ооочень упрощенной модели уровня.
Так и тебе, возможно, стоит для игровой логики использовать дискретное пространство, а для модуля, рассчитывающего движение - полноценную систему координат с флоатами или даблами и реальным временем.
Как я это реализовал бы: в течение хода каждый юнит движется к "полноценным" координатам центра соседнего целла дискретного пространства, находящегося по вектору цели хода. Радиус коллизии (при котором юнит не может двигаться, поскольку пространство занято другим юнитом) очевидно должен быть меньше физических координат целла (я б для начала поигрался бы с 0,6 - 0,8 размеров целла). Получаем, что юниты будут ходить от клетки к клетке по направлению хода все вместе.
Очевидно, что будут возникать ситуации, когда на одном целле два юнита. В случае "гуська" это норм и они нормально разрулятся - первый пройдет в следующий целл, второй пройдет в целл первого и они не столкнутся. Во второй половине случаев произойдет коллизия. Это, вероятно, будут те случаи, когда у юнитов различные векторы движения. Хоть я и не могу представить, как такое может получиться в описанной в ОП-посте задаче, но это нужно разрешить. Я б послал инициатора столкновения в обход, хотя можно и остановить юнит/послать на предыдущий целл (например "не дошел", так как вражеский персонаж раньше пришел). Соответственно хозяином целла считать того, кто ближе к его центру. Как только не осталось движущихся персонажей - ход завершен.
|