forked from: PathResolver base
/**
* Copyright coolljp ( http://wonderfl.net/user/coolljp )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vIro
*/
// forked from snamura's PathResolver base
package
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.setTimeout;
[SWF(width="465",height="465",frameRate="24",backgroundColor="#ffffff")]
public class PathResolveBase extends Sprite
{
private var _text:TextField;
// 経路計算テスト用マップのための配列
// とりあえず正方形のみ
// 0 = 通路
// 1 = スタート地点
// 2 = ゴール地点
// 8 = 壁
private var map:Array = [
1, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0,
0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0,
0, 8, 0, 8, 0, 0, 8, 0, 8, 8, 8, 8, 8, 8, 8, 0,
0, 8, 0, 8, 0, 8, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0,
0, 0, 0, 8, 0, 0, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8,
8, 8, 8, 8, 0, 0, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 8, 0, 0, 8, 0, 8, 8, 8, 8, 8, 0,
0, 0, 0, 8, 8, 0, 0, 8, 0, 0, 8, 0, 0, 8, 0, 0,
0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8,
8, 8, 0, 8, 8, 8, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0,
0, 0, 0, 0, 0, 8, 0, 8, 8, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 8, 0, 8, 0, 0, 8, 0, 8, 8, 8, 0, 8, 8,
8, 8, 8, 0, 0, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 8, 8, 0, 0, 8, 0,
0, 0, 8, 8, 0, 0, 8, 0, 0, 0, 8, 0, 8, 8, 8, 0,
0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 8, 2
];
// フィールドの大きさ(1辺のノード数)
private var fieldLength:int;
// スタート地点
private var start:Node;
// ゴール地点
private var goal:Node;
// ノード配列
private var nodes:Array = [
];
public function PathResolveBase()
{
initNodes();
drawPath();
}
/**
* 初期ノードを構成します。
*/
private function initNodes():void
{
// 正方形を前提としてノードの幅を取得
fieldLength = Math.sqrt(map.length);
for (var x:int = 0; x < fieldLength; x++)
{
for (var y:int = 0; y < fieldLength; y++)
{
// ノードの配列番号を取得
var index:int = x + y * fieldLength;
// ノードの種類を取得
var type:int = map[index];
var node:Node = new Node(x, y, true);
if (type == 8)
{
// 壁タイプ
node.walkable = false;
node.draw(0x333333);
}
else
{
// 通行可能タイプ
if (type == 1)
{
// スタート地点
start = node;
node.draw(0xcc6666);
}
else if (type == 2)
{
// ゴール地点
goal = node;
node.draw(0x66cc66);
}
else
{
node.draw(0xffffff);
}
}
nodes[index] = node;
addChild(node);
}
}
}
/**
* 最短経路を取得し、経路を色づけします。
*/
private function drawPath():void
{
var path:Array = resolvePath();
for (var i:int = 0; i < path.length; i++)
{
var node:Node = path[i];
setTimeout(node.draw, i * 100, 0xcc9999);
}
}
/**
* スタート地点からゴール地点までの最短経路を計算し、
* 経路となるノードの配列を返却します。
*/
private function resolvePath():Array
{
// 手動による計算。最短経路を求めるアルゴリズムに変更します。
return state1;
}
/**
*/
private function state1(x:int, y:int):Array
{
//x+1 y+1 x-1 y-1
return [
nodes[16],nodes[31],nodes[48],nodes[64],nodes[65],nodes[66],nodes[50],nodes[34],nodes[18],
nodes[19],nodes[20],nodes[36],nodes[52],nodes[68],nodes[84],nodes[100],nodes[99],nodes[98],
nodes[114],nodes[130],nodes[146],nodes[162],nodes[163],nodes[164],nodes[180],nodes[196],
nodes[195],nodes[211],nodes[210],nodes[209],nodes[225],nodes[241],nodes[242],nodes[243],
nodes[244],nodes[245],nodes[229],nodes[213],nodes[214],nodes[215],nodes[231],nodes[232],
nodes[233],nodes[217],nodes[201],nodes[202],nodes[203],nodes[204],nodes[205],nodes[206],
nodes[207],nodes[223],nodes[239]
];
}
/**
* 指定位置のノードを取得します。
*/
private function getNode(x:int, y:int):Node
{
return nodes[x + y * fieldLength];
}
}
}
import flash.display.Sprite;
import flash.events.EventDispatcher;
// 経路探索のためのノードクラス
internal class Node extends Sprite {
internal var fieldX:int;
internal var fieldY:int;
internal var walkable:Boolean;
public function Node(fieldX:int, fieldY:int, walkable:Boolean)
{
this.fieldX = fieldX;
this.fieldY = fieldY;
this.walkable = walkable;
this.x = fieldX * 20 + 70;
this.y = fieldY * 20 + 70;
}
internal function draw(background:uint):void
{
graphics.clear();
graphics.lineStyle(1);
graphics.beginFill(background);
graphics.drawRect(0,0,20,20);
}
}