2015-04-20 5 views
3

Я решил забрать свой старый 2D-движок с самого начала и продолжить работу над ним. Это моя первая попытка попытаться реализовать некоторый базовый ИИ для врагов, и у меня есть некоторые вопросы. Ниже приведен пример того, как я отношусь к ИИ для врагов.A * Algorithm 2D Game Pathing issues

  • Если игрок находится в пределах определенного диапазона противника, противник движется по направлению к игроку, просто проверяя, если он вверх или вниз, влево или вправо от игрока и корректируя это координаты соответственно.

  • Если враг попадает на препятствие, которое блокирует его движение в направлении игрока, я вызываю алгоритм My A * для определения кратчайшего пути к игроку и перемещения по препятствиям.

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

Способ, которым я реализовал A *, я проверяю смежные квадраты на основе размеров Врага. Так, например, если у меня есть 60X60 Enemy, я буду проверять соседние плитки в этом измерении, а также враги могут быть разных размеров. Проблема я столкнулся выглядит следующим образом:

enter image description here


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

enter image description here


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


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

+0

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

ответ

0

Я предполагаю, что вы заполняете А * по размеру противника блоки размером

, что это неправильно вам нужно кормить по одной ячейке/пиксел, что когда-либо

Так, при заполнении заполнить смежную линию (не вся коробка)

если не освободить всю строку, то не заполнить его на всех

A* with block filling

вам нужно закодировать некоторую дополнительную информацию для A * карты, как:

  • это горизонтальные, вертикальные или обе линии
  • если угол или коробка позиция

знать каким образом вы можете вырастить

[Примечания]

A * заполнение должно всегда соответствовать вашим возможностям движения

+0

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

+0

@DavidSleep рад оказать помощь – Spektre

 Смежные вопросы

  • Нет связанных вопросов^_^