Вторая плитка, на которую делается шаг, имеет координату x из path [1 ][0 ] и координату y из path [1 ][1 ].
В этой реализации алгоритма A* нет встроенной поддержки для различным типов поверхности, хотя это было бы нетрудно добавить (см. следующую подсекцию для дополнительной информации). В этой реализации плитка либо доступна для прохождения, либо нет. Нет никакого другого отличия между плитками.
Тонкая настройка чисел для реализма
Объект astar включает свойство с именем preventClipping. Если это значение равно false, то поиск будет на самом деле возвращать кратчайший путь. В этом случае, персонаж может идти от одной плитки к другой по диагонали, и половина персонажа будет появляться на двух соседних плитках, когда он движется от одной плитки к следующей. Если соседи не содержат никаких препятствий, то это то, что нам хотелось бы. Однако, если сосед содержит препятствие, то персонаж будет появляться частично проходящим через угол этого препятствия. К счастью, есть метод для преодоления этого нереалистичного поведения. По умолчанию, свойство preventClipping имеет значение true. Когда оно равно true, алгоритм не будет возвращать диагональное перемещение из одной плитки к другой, если один из соседей содержит препятствие. Это дает путь, который более реален, но не обязательно кратчайший путь. Однако, это кратчайший путь, который выглядит достаточно хорошо.
WITH CLIPPING
СО СРЕЗАНИЕМ ПУТИ
WITHOUT CLIPPING
БЕЗ СРЕЗАНИЯ ПУТИ
В этой реализации алгоритма A* я модифицировал функцию cost() для возвращения очень больших значений диагональных перемещений, которые были бы обычно срезаны. Результатом является то, что с preventClipping установленной в true, путь проходит вокруг объекта более натурально, без срезания. Диагональное перемещение по-прежнему делается – только не тогда, когда произошло бы срезание. Если вы предпочитаете чистый путь A*, установите preventClipping в false.
Если никаких путей не найдено, то путь возвращается как null