Асинхронный A* (часть 2)

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

Сразу хочу сказать спасибо за помощь 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

Комментарии (2)

0
А на картинке какой-то кусок мяса и два брокколи…
+2
В качестве продолжения к desktop td будет dinner table td вот и всё
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.