
Асинхронный A* (часть 2)
n0uk написал статью как использовать Асинхронный A*. Я хочу привести наглядный пример, как использовать данные классы в своих играх.

Сразу хочу сказать спасибо за помощь n0uk и WeslomPo.
Сначала нарисуем карту. Белая область — проходимая часть, чёрная — препятствие. Называем например этот мувик WallGraphic.

Затем добавляем его на сцену и создаём зону проходимости в пиксельном виде для того чтобы можно было определить по цвету где может персонаж идти, а где нет.
Затем создаём карту с ячейками. Т.к. разрешение экрана 550*400, карту создаем 55*40, чтобы каждая ячейка была с размером 10*10. Пробегаемся по всей карте и если цвет не белый, значит там препятствие setCell(x, y, -1)
После чего высчитываем путь прохождения от героя до нужной нам точки. Т.к. у нас карта стотит из 10ти пиксельных ячеек, все значения делим на «10».
После чего двигаем героя к цели в методе moveHero().
Вот исходник: pathfindinggame.rar
управленние:
клавиши 1 — режим хотьбы, 2 — режим стрельбы
клик мыши — аквтивировать режим

Сразу хочу сказать спасибо за помощь n0uk и WeslomPo.
Сначала нарисуем карту. Белая область — проходимая часть, чёрная — препятствие. Называем например этот мувик WallGraphic.

Затем добавляем его на сцену и создаём зону проходимости в пиксельном виде для того чтобы можно было определить по цвету где может персонаж идти, а где нет.
// добавляем прпятсивте
var _wall:Sprite = new WallGraphic();
_wall.x = 0;
_wall.y = 0;
addChild(_wall);
//переводим зону проходимости в пиксельный вид
var _bmdWall:BitmapData = new BitmapData(_wall.width, _wall.height, false, 0x000000);
_bmdWall.draw(_wall);
_wall.visible = false;
Затем создаём карту с ячейками. Т.к. разрешение экрана 550*400, карту создаем 55*40, чтобы каждая ячейка была с размером 10*10. Пробегаемся по всей карте и если цвет не белый, значит там препятствие setCell(x, y, -1)
// Создаем карту заполненную пустыми клетками
var _map:PFMap = new PFMap(55, 40);
// Значения для клеток меньшие 0 являются непроходимыми,
//0 - идеально проходимая точка
//Все что выше нуля - вес клетки, который учитывается при построении пути (желательно делать кратным 10)
var sx:int = Main.SCREEN_WIDTH / _map.width;
var sy:int = Main.SCREEN_HEIGHT /_map.height;
// sx, sy - размер клетки по х и у
for (var x:int = 0; x < _map.width; x++){
for (var y:int = 0; y < _map.height; y++)
{
if (_bmdWall.getPixel(x * sx, y * sy) != 0xFFFFFF)
{
_map.setCell(x, y, -1);
}
}
}
После чего высчитываем путь прохождения от героя до нужной нам точки. Т.к. у нас карта стотит из 10ти пиксельных ячеек, все значения делим на «10».
var _pointClickX:int = mouseX;
var _pointClickY:int = mouseY;
var _pointHeroX:int = _hero.x;
var _pointHeroY:int = _hero.y;
var _path:Vector.<Array> = _map.findPath(_pointHeroX / 10, _pointHeroY / 10, _pointClickX / 10, _pointClickY / 10);
После чего двигаем героя к цели в методе moveHero().
Вот исходник: pathfindinggame.rar
управленние:
клавиши 1 — режим хотьбы, 2 — режим стрельбы
клик мыши — аквтивировать режим
- +15
- J0x
Комментарии (2)