flash on 2016-3-15
♥0 |
Line 120 |
Modified 2016-03-15 06:47:30 |
MIT License
archived:2017-03-20 16:21:21
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/QKt0
*/
package {
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
stage.quality= "LOW";
var i:int; var k:int; var yt:int;
var a:xNode;
mw=12;mh=12;
vecNode = new Vector.<xNode>(mw*mh,false);
for (i=0;i<mh;i+=1)
{
yt = i*mw;
for (k=0;k<mw;k+=1)
{
a = new xNode();
vecNode[k+yt] = a;
a.cx = k*cw+cw*0.5;
a.cy = i*ch+ch*0.5;
a.tx = k;
a.ty = i;
a.wall = Math.random()>0.75?1:0;
}//nextk
}//nexti
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var vecNode:Vector.<xNode> = new Vector.<xNode>(0, false);
public var mw:int = 16; public var mh:int = 16;
public var cw:Number = 32; public var ch:Number = 32;
public function getNode(ax:Number,ay:Number):xNode
{ var tx:int;var ty:int;
tx =Math.floor(ax/cw); ty = Math.floor(ay/ch) ;
if(tx<0||ty<0||tx>=mw||ty>=mh){return null; }
return vecNode[tx+ty*mw];
}//getnode
public function getNode2(tx:int,ty:int):xNode
{ if(tx<0||ty<0||tx>=mw||ty>=mh){return null; } return vecNode[tx+ty*mw]; }
public function onEnter(e:Event):void
{
graphics.clear();
graphics.lineStyle(2, 0);
fillNode(stage.mouseX,stage.mouseY);
var a:xNode;var b:xNode;
var i:int; var num:int;
num=vecNode.length;
for (i=0;i<num;i+=1)
{
a = vecNode[i];
if (a.wall>0)
{
graphics.drawRect(a.tx*cw,a.ty*ch,cw,ch);
continue;
}//endif
if (a.frame!=curFrame){continue;}
var k:int; var w:int;
for (k=-1;k<2;k+=1)
{ for (w=-1;w<2;w+=1) {
if (w!=0 &&k!=0){continue;}
b=getNode2(a.tx+k,a.ty+w);
if (b==null){continue;}
if (b.wall>0){continue;}
if(b.frame!=curFrame){continue;}
if (b.d>=a.d){continue; }
//graphics.moveTo(a.cx,a.cy); graphics.lineTo(b.cx, b.cy);
var ta:Number;
ta= Math.atan2(b.cy-a.cy,b.cx-a.cx);
graphics.moveTo(a.cx,a.cy);
graphics.lineTo(a.cx+Math.cos(ta)*12,a.cy+Math.sin(ta)*12);
}}//nextkw
graphics.drawCircle(a.cx,a.cy,4);
// if (a.parent !=null)
// { b =a.parent; graphics.moveTo(a.cx,a.cy); graphics.lineTo(b.cx, b.cy); }
}//nexti
}//onenter
public var vecTemp:Vector.<xNode> = new Vector.<xNode>(2048, false);
public var curFrame:int = 0;
public function fillNode(ax:Number, ay:Number):void
{
var it:int; var a:xNode; var i:int;
var b:xNode;
curFrame+=1;
a = getNode(ax,ay);
if (a ==null){return;}
vecTemp[0] =a;
it=1;
a.d =0;
a.frame = curFrame;
for (i=0;i<4096;i+=1)
{
it -=1; if (it<0){ return; }
a = vecTemp[it];
var k:int; var w:int;
for (k=-1;k<2;k+=1)
{ for (w=-1;w<2;w+=1) {
if (w!=0 &&k!=0){continue;}
b=getNode2(a.tx+k,a.ty+w);
if (b==null){continue;}
if (b.wall>0){continue;}
if(b.frame==curFrame){continue;}
b.frame=curFrame;
b.parent=a;
// b.d =a.d+1;
b.d = getMag2(b.cx-ax,b.cy-ay) + a.d;
vecTemp[it]=b;it+=1; if (it>=2048){it-=1;}
}}//nextkw
}//nexti
}//fillnode
public function getMag(ax:Number,ay:Number):Number
{return Math.sqrt(ax*ax+ay*ay); }
public function getMag2(ax:Number,ay:Number):Number
{return (ax*ax+ay*ay); }
}//classend
}
internal class xNode
{
public var cx:Number = 0;
public var cy:Number = 0;
public var tx:int = 0;
public var ty:int = 0;
public var wall:int =0;
public var parent:xNode = null;
public var frame:int = -1;
public var d:int = 0;
}//xnode