flash on 2012-9-12

by mutantleg
♥0 | Line 186 | Modified 2012-09-12 21:29:15 | MIT License
play

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