Сделал. Решение придумал такое:
При первом запуске, после расстановки всех тел нейпа, происходит пробежка по всей карте через установленные промежутки (60 пикселей оказалось вполне достаточно), и в каждой из этих точек делается проверка
Код AS3:
private function calculateWalkableSurface():Array {
var tilesX: int = stage.stageWidth / _tileSize;
var tilesY: int = stage.stageHeight / _tileSize;
var tiles: Array = [];
for (var i:int = 0; i < tilesY; i++) {
var posY:int = (i * _tileSize) + _tileSize * .5;
tiles[i] = [];
for (var j:int = 0; j < tilesX; j++) {
var posX:int = (j * _tileSize) + _tileSize * .5;
var tileValue:int = getTileValue(posX, posY);
tiles[i][j] = tileValue;
}
}
return tiles;
}
/// возвращает 1 если плитка непроходима, и 0 если препятствия нет
private function getTileValue(x:int, y:int):int {
var bodies:BodyList = _space.bodiesUnderPoint(new Vec2(x, y));
var value:int = 0;
if (bodies.length) {
// динамические и кинематические тела не считаются препятствием
if (bodies.at(0).type == BodyType.STATIC) {
value = 1;
}
}
return value;
}
В итоге формируется двумерный массив с числами 0 или 1, который и скармливается алгоритму A* Star. Сам алгоритм взял вот
этот
Путь конечно не идеальный, можно и более плавным сделать, какими-нибудь кривыми безье или просто
рулёжкой. Но для моей цели вполне подойдет и такой.
Щелкаем в любом месте мышью, чтобы переставить игрока (треугольник). Или щелчок + пробел, чтобы переставить врага (круг)