flash on 2012-9-12
♥0 |
Line 186 |
Modified 2012-09-12 21:29:15 |
MIT License
archived:2017-03-30 23:00:01
ActionScript3 source code
/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/t6vp
*/
package {
import flash.text.TextField;
import flash.text.engine.SpaceJustifier;
import flash.events.MouseEvent;
import flash.display.Graphics;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
// write as3 code here..
layerDeb = new Sprite();
addChild(layerDeb);
var g:Graphics;
sp = new Sprite();
g = sp.graphics;
g.clear();
g.beginFill(0x00FF00,0.5);
g.drawRect(0,0,8,8);
g.endFill();
addChild(sp);
ep = new Sprite();
g = ep.graphics;
g.clear();
g.beginFill(0xFF0000,0.5);
g.drawRect(0,0,8,8);
g.endFill();
addChild(ep);
deb = new TextField();
addChild(deb);
graphics.clear();
initMap(32,32);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mdown);
}//ctor
public var sp:Sprite;
public var ep:Sprite;
public var deb:TextField;
public function mdown(e:MouseEvent):void
{
if (bf == 0)
{
bf = 1;
bx = Math.floor(mouseX / 8);
by = Math.floor(mouseY / 8);
sp.x = bx*8;
sp.y = by*8;
}
else
{
bf = 0;
ep.x = Math.floor(mouseX /8)*8;
ep.y = Math.floor(mouseY / 8)*8;
findPath(bx,by, Math.floor(mouseX/8),Math.floor(mouseY/8));
}
}//mdown
public var bf:int = 0;
public var bx:int = 0;
public var by:int = 0;
public var vecMap:Vector.<cNode>;
public var mwidth:int = 0;
public var mheight:int = 0;
public var curFrame:int = 0;
public var layerDeb:Sprite;
public function initMap(w:int, h:int):void
{
var n:cNode;
var num:int;
var i:int;
mwidth = w;
mheight = h;
num = w * h;
vecMap = new Vector.<cNode>(num, false);
for (i = 0; i < num; i++)
{
n = new cNode();
vecMap[i] = n;
n.obst = int (Math.random() * 2);
}//nexti
var k:int;
graphics.lineStyle(1,0);
for (i = 0; i < mheight; i++)
{
for (k = 0; k < mwidth; k++)
{
n = vecMap[k + (i*mwidth)];
n.x = k;
n.y = i;
if (n.obst > 0) { continue;}
graphics.drawRect(k*8,i*8,8,8);
}//nextk
}//nexti
}//initmap
public function findPath(sx:int, sy:int, ex:int, ey:int):void
{
var g:Graphics;
g = layerDeb.graphics;
g.clear();
it = 0;
curFrame += 1;
addOpen(sx,sy, null);
deb.text = " " + sx + " " + sy;
var m:cNode;
gx = ex;
gy = ey;
// deb.text = "reach";
while(true)
{
if (it <= 0) { return;}
// deb.text = "meh";
m = getLow();
if (m.x == ex && m.y == ey) { break;}
addOpen(m.x + 1, m.y, m);
addOpen(m.x - 1, m.y, m);
addOpen(m.x , m.y+1, m);
addOpen(m.x , m.y-1, m);
// deb.text = "Reach";
}//wend
while (m != null)
{
g.beginFill(0, 1);
g.drawRect(m.x*8, m.y*8,8,8);
g.endFill();
m = m.par;
}//wend
}//findpath
public function addOpen(tx:int, ty:int, p:cNode):void
{
// deb.text = "add";
// deb.text = " " + tx + " " +ty + " " + mwidth + " " + mheight;
if (tx < 0) { return; }
if (ty < 0) { return; }
if (tx >= mwidth) { return; }
if (ty >= mheight) { return; }
var n:cNode;
n = vecMap[tx + (ty*mwidth)];
// deb.text = "ok1";
//if (n.obst > 0) { return;}
if (n.frame == curFrame) { return;}
n.frame = curFrame;
if (n.obst != 0) { return;}
n.par = p;
var dx:Number;
var dy:Number;
dx = n.x - gx;
dy = n.y - gy;
var mag:Number;
mag = Math.sqrt(dx*dx + dy*dy);
//n.dist = Math.abs(n.x - gx) + Math.abs(n.y - gy);
n.dist= mag;
// deb.text = "hnng";
if (it >= maxOpen) {return;}
vecOpen[it] = n;
it += 1;
//deb.text = "reacch";
var g:Graphics;
g = layerDeb.graphics;
g.lineStyle(2,0x0000FF);
g.drawCircle(n.x*8+4,n.y*8+4,4);
}//addopen
public var maxOpen:int = 2048;
public var it:int = 0;
public var vecOpen:Vector.<cNode> = new Vector.<cNode>(maxOpen,false);
public var gx:int = 0;
public var gy:int = 0;
public function getLow():cNode
{
var a:cNode;
var ret:cNode;
var i:int;
var k:int;
if (it <= 0) { return null;}
ret = vecOpen[0];
k = 0;
for (i = 1; i < it; i++)
{
a = vecOpen[i];
if (a.dist < ret.dist)
{
k = i;
ret = a;
}
}//nexti
vecOpen[k] = vecOpen[it - 1];
it -= 1;
return ret;
}//getlow
}//classend
}
internal class cNode
{
public var x:int = 0;
public var y:int = 0;
public var dist:Number = 0;
public var obst:int = 0;
public var par:cNode;
public var frame:int = -1;
public function cNode()
{}
}//classend