/* マップ全体を示すmapfield配列 */ private var mapfield:Array = [MAP_HEIGHT]; /* 探索地点を集めるバッファ */ private const SEARCHQUE_LIMIT:int = 50; private var searchque:Array = [SEARCHQUE_LIMIT]; private var searchque_head:int = 0;
public function Display(source_01:BitmapData, source_02:BitmapData) { map_init(); root_search(ROBO_XPOS, ROBO_YPOS, GOAL_XPOS, GOAL_YPOS);
// mapfield配列に格納されているノードオブジェクトを表示する for (var i:int = 0; i < MAP_HEIGHT; i++ ) { for (var j:int = 0; j < MAP_WIDTH; j++ ) { trace(mapfield[i][j].cost); } } }
/* マップの初期化 */ public function map_init():void { var j:int, i:int;
for (i = 0; i < MAP_HEIGHT; i++) { mapfield[i] = new Array(MAP_WIDTH); for (j = 0; j < MAP_WIDTH; j++) { mapfield[i][j] = new t_node(); mapfield[i][j].pos.x = j; mapfield[i][j].pos.y = i; } }
/* 障害物の設定 */ for (i = 0; i < 4; i++) { mapfield[i][10].attr = ATTR_WALL; mapfield[(MAP_HEIGHT - 1) - i][4].attr = ATTR_WALL; } }
/* -------------------------------------------------------- */ /* 2点間の距離を測る */ public function distance(pos1:t_point, pos2:t_point):int { var dx:int, dy:int, d:int;
dx = Math.abs(pos1.x - pos2.x); dy = Math.abs(pos1.y - pos2.y);
d = ((dx < dy) ? dx : dy) / 2; return dx + dy - d; }
/* コストを計る */ public function poscost(pos:t_point, checkpos:t_point):int { var cost:int;
/* -------------------------------------------------------- */ /* キューに探索候補を追加 */ public function que_push(node:t_node):void { var tmpnode:t_node; var i:int, j:int;
if (searchque_head >= SEARCHQUE_LIMIT) return; searchque[searchque_head] = node; searchque_head++;
// コストの低い順でソートしておく if (searchque_head <= 1) return; for (i = 0; i < searchque_head; i++) { for (j = 1; j < searchque_head - i; j++) { if (searchque[j - 1].cost < searchque[j].cost) { tmpnode = searchque[j - 1]; searchque[j - 1] = searchque[j]; searchque[j] = tmpnode; } } } }
/* キューから探索候補を取り出す */ public function que_pop():t_node { if (searchque_head == 0) return null; searchque_head--; return searchque[searchque_head]; }
/* -------------------------------------------------------- */ /* 探索されたパスをたどる */ public function path_check(goaly:int, goalx:int):void { var x:int, y:int, nextx:int, nexty:int;
nextx = mapfield[goaly][goalx].backpos.x; nexty = mapfield[goaly][goalx].backpos.y; do { x = nextx; y = nexty; mapfield[y][x].attr = ATTR_PATH; nextx = mapfield[y][x].backpos.x; nexty = mapfield[y][x].backpos.y; } while(mapfield[nexty][nextx].attr != ATTR_START); }
package { /** * ノードクラス */ public class t_node { public var pos:t_point = new t_point(); /* 自分の場所 */ public var backpos:t_point = new t_point(); /* 探索を始めた場所 */ public var cost:int = 0; /* 現在位置のコスト */ public var attr:int = 0; /* その地点が探索済みかどうか */
public function t_node() {
}
}
}
t_point.as
package { /** * x, y の2点間を示すクラス */ public class t_point { public var x:int, y:int;