flash on 2013-11-21

by mutantleg
followup to: http://wonderfl.net/c/g3Fr
move with WASD or arrows
♥0 | Line 286 | Modified 2013-11-21 20:53:50 | 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/3nUH
 */

package {
    import flash.ui.Keyboard;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.display.Sprite;
    
    
    public class FlashTest extends Sprite {
        public function FlashTest() {
  
            deb = new TextField();
            deb.mouseEnabled = false;
            deb.width = 320;
            deb.height = 240;
            addChild(deb);
            
            
            
            myShape = new xShape();
            myShape.cx = 200;
            myShape.cy = 200;
            
            stage.addEventListener(KeyboardEvent.KEY_DOWN, kdown);
            stage.addEventListener(KeyboardEvent.KEY_UP, kup);           
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mdown);
            stage.addEventListener(Event.ENTER_FRAME, onEnter);
        }//ctor
        
        public var vecKey:Vector.<Boolean> = new Vector.<Boolean>(512,false);
        public function kdown(e:KeyboardEvent):void { if (e.keyCode > 511) { return;}vecKey[e.keyCode]=true; }
        public function kup(e:KeyboardEvent):void { if (e.keyCode > 511) { return;}vecKey[e.keyCode]=false; }
        
        public function isKeyDown(k:int):Boolean { return vecKey[k];  }
        
        public function mdown(e:MouseEvent):void
        {
           myShape.genShape();
           cx = 200;
           cy =  50;
           vx =0; vy =0;
           
        }//mdown
   
         public var myShape:xShape;
          public var deb:TextField;
 
         public var dir:int = 0;
 
         
        public function onEnter(e:Event):void
        {
            
            movePlat();
            
            myShape.ma = myShape.roll;
            myShape.mx = myShape.cx;
            myShape.my = myShape.cy;
            
            
                  if (dir == 0)
            { myShape.cx += 1; }
            else { myShape.cx -= 1;}
            
            if (myShape.cx > 300) { dir = 1;}
            else if (myShape.cx < 100) { dir = 0;}
 
             myShape.roll += 0.01;

            
            myShape.ma = angDiff(myShape.roll, myShape.ma);
            myShape.mx = myShape.cx - myShape.mx;
            myShape.my = myShape.cy - myShape.my;
            
            deb.text = " " + myShape.ma + " " + myShape.mx + " " + myShape.my;
 
             //when travelling on the shape ->
             // transform us by the change in the shapes position/rotation
             
             var bnear:Boolean;
             bnear = nearLeft || nearRight || nearUp;
             
             if (bStartGround || bnear)
             {
                 cx += myShape.mx;
                 cy += myShape.my;
                 
                 var kx:Number;
                 var ky:Number;
                 var rx:Number;
                 var ry:Number;
                 var ma:Number;
                 var ca:Number;
                 var sa:Number;
                 ma = myShape.ma;
                 kx = cx - myShape.cx;
                 ky = cy - myShape.cy;
                 ca = Math.cos(ma);
                 sa = Math.sin(ma);
                 rx = kx * ca - ky * sa;
                 ry = kx * sa + ky * ca;
                 rx += myShape.cx;
                 ry += myShape.cy;
                 cx = rx;
                cy = ry; 
                //graphics.drawCircle(rx,ry, xrad); 
              }
 
            graphics.clear();
            
            graphics.lineStyle(2, 0);
            myShape.drawShape(graphics, 0);
            
            graphics.beginFill(0xFF,0.5);
            //graphics.drawCircle(cx,cy, xrad);
            graphics.drawEllipse(cx-xrad,cy-yrad,xrad+xrad,yrad+yrad);
            graphics.endFill();
        }//onenter
  
        public function isWall(wx:Number, wy:Number):Boolean
        {
            return myShape.isPointInside(wx,wy);
        }//iswall
           
        public static function angDiff(a:Number, b:Number):Number
        {
          a -= b;
          if (a > 3.14) { a -= 6.28; }
          if (a < -3.14) { a += 6.28;}
          return a;
        }//angdiff
      
        public var keyLeft:Boolean = false;
        public var keyRight:Boolean = false;
        public var keyDown:Boolean = false;
        public var keyUp:Boolean = false;
        public var bStartGround:Boolean = false;
        public var cx:Number = 200;
        public var cy:Number = 50;
        public var vx:Number = 0;
        public var vy:Number = 0;
        public var xrad:Number = 8;
        public var yrad:Number = 16;  
        
        public var nearUp:Boolean = false;
        public var nearLeft:Boolean = false;
        public var nearRight:Boolean = false;
        
  
        public function movePlat():void
        {
          keyLeft = (isKeyDown(Keyboard.A) || isKeyDown(Keyboard.LEFT));
          keyRight = (isKeyDown(Keyboard.D) || isKeyDown(Keyboard.RIGHT));
          keyUp = (isKeyDown(Keyboard.W) || isKeyDown(Keyboard.UP));
          keyDown = (isKeyDown(Keyboard.S) || isKeyDown(Keyboard.DOWN));

          bStartGround = isWall(cx,cy+yrad+1) || isWall(cx,cy+yrad);
          var s:Number;
          var maxs:Number;
          s = 1;
          maxs = 4;
          
          vy += 0.4;

          if (keyDown) { vy += s; }
          if (keyUp) { vy -= s; }
          if (keyLeft) { if (vx > -maxs) { vx -= s; }  }
          if (keyRight) { if (vx < maxs) { vx += s; } }
          
          if (vx < 0 && isWall(cx - xrad, cy)) { vx = 0; }
          else if (vx > 0 && isWall(cx + xrad, cy)) { vx = 0; }
          if (vy < 0 && isWall(cx, cy - yrad)) { vy = 0; }
          else if (vy > 0 && isWall(cx, cy + yrad)) { vy = 0; }
          
          vx *= 0.9;
          vy *= 0.98;
          
          cx += vx;
          cy += vy;
          
          if (cy > 250 && vy >= 0) { vy = 0; cy = 250; }
            
           if (bStartGround && vy >= 0) { checkSlope(12); }
  
          if (isWall(cx-xrad+1, cy)) { cx+= 1; }
          if (isWall(cx+xrad-1, cy)) { cx-= 1; }
          
  
           nearLeft = isWall(cx-xrad, cy);
           nearRight = isWall(cx+xrad, cy);
           nearUp = isWall(cx, cy-yrad);
        }//moveplat
        
  
      public function checkSlope(pow:int = 8):void
      {
        var i:int;
      
        if (isWall(cx,cy+yrad+pow)==true)
        for (i = 0; i < pow; i++)
        {
          if (isWall(cx, cy + yrad + 1) == true) { break;  }
          cy += 1;
        }
        
        if (isWall(cx,cy+yrad-pow)==false)
        for (i = 0; i < pow; i++)
        {
          if (isWall(cx, cy + yrad - 1) == false) { break;  }
          cy -= 1;
        }
      
    }//checkslop
       
    }//classend
}
import flash.display.Graphics;

internal class xShape
{
  public var vecLine:Vector.<xLine>;
    
  public var cx:Number = 0;
  public var cy:Number = 0;
  public var roll:Number = 0;
  
  public var mx:Number = 0;
  public var my:Number = 0;
  public var ma:Number = 0;
  
  public function xShape()
  { 
      genShape(); 
  }//ctor

  //see  http://wonderfl.net/c/n5Ja
  //for readable version
  public function isPointInside(kx:Number, ky:Number):Boolean
  {
     var a:xLine;     var i:int;         var num:int;
     var w:int;       var wz:Number;     var ax:Number;
     var ay:Number;   var bx:Number;     var by:Number;
     var kx:Number; var ky:Number;
     var c:uint;
     var ca:Number; var sa:Number;
     var px:Number; var py:Number;
     
     //transform point to the shape's space
     kx -= cx;
     ky -= cy;
     ca = Math.cos(-roll);
     sa = Math.sin(-roll);
     px = ca*kx - sa*ky;
     py = sa*kx + ca*ky;
     
     
       w = 0;       
       num = vecLine.length;       
       for (i = 0; i < num; i++)
       {
           a = vecLine[i];                   
           if (a.y0 <= py && a.y1 <= py) { continue; }
           if (a.y0 > py && a.y1 > py) { continue; }           
           //which side of the line we are on?
           //(using cross product)              
           ax = px - a.x0;           ay = py - a.y0;
           bx = a.x1 - a.x0;           by = a.y1 - a.y0; 
           wz = (ax*by)-(ay*bx);     
           if (wz > 0) { c = 0x0000FF; w+= 1;}
           else if (wz < 0) { c = 0xFF0000; w -= 1;}       
       }//nexti      
      return (w != 0);
  }//ispointin
  
  public function drawShape(g:Graphics, c:uint=0):void
  {
     var i:int; var num:int; var a:xLine;
     var rx:Number;
     var ry:Number;
     var ca:Number;
     var sa:Number;
     
     ca = Math.cos(roll);
     sa = Math.sin(roll);
     
     g.beginFill(c,0.5);
     //g.lineStyle();
     num = vecLine.length;
     for (i = 0; i < num; i++)
     {
       a = vecLine[i];
          if (i == 0)
         {
           rx = a.x0*ca - a.y0*sa+cx;
           ry = a.x0*sa + a.y0*ca+cy;  
             
          g.moveTo(rx, ry);
          
           rx = a.x1*ca - a.y1*sa+cx;
           ry = a.x1*sa + a.y1*ca+cy;  
          
          g.lineTo(rx, ry);
         }
         else
         { 
           rx = a.x1*ca - a.y1*sa+cx;
           ry = a.x1*sa + a.y1*ca+cy;          
           g.lineTo(rx, ry);
        
           //g.lineTo(a.x1+cx, a.y1+cy);
         
         }//endif
              
     }//nexti
     /*a = vecLine[0];
     
     rx = a.x0*ca - a.y0*sa+cx;
     ry = a.x0*sa + a.y0*ca+cy;  
      
     g.lineTo(a.x0+cx, a.y0+cy);    
      */   
     g.endFill();
  }//drawshape
    
    
         
 public function genShape():void
 {           
     vecLine = new Vector.<xLine>(0,false);
     
     var ang:Number;
     var kx:Number;     var ky:Number;
     var px:Number;     var py:Number;
     var d:Number;
     var nx:Number;     var ny:Number;
     var mag:Number;
     px = 0; py = 0;
     for (ang = 0; ang < 6.28; ang+=0.5)
     {
         d = (Math.random()*60 + 30);

         kx = Math.cos(ang) * d;
         ky = Math.sin(ang) * d;
         
         if (ang == 0) { px =kx; py= ky; continue; }
         
         vecLine.push(new xLine(px,py,kx,ky) );
        
         nx = -(py - ky);
         ny = px - kx;
         mag = Math.sqrt(nx*nx+ny*ny);
         if (mag == 0) { mag =0.00001;}
         nx /= mag;         ny /= mag;
         px = kx;         py = ky;
     }//nextang
     
     vecLine.push(new xLine(kx,ky,vecLine[0].x0,vecLine[0].y0));
       
 }//genshape
         
    
}//xshape



internal class xLine
{
    public var x0:Number = 0;
    public var y0:Number = 0;
    public var x1:Number = 0;
    public var y1:Number = 0;
    
    public function xLine(ax:Number,ay:Number, bx:Number, by:Number):void
    {
        x0 = ax; y0 = ay;  x1 = bx; y1 = by;
        
        //calc normal (and midpoint) only needed for debugging
        var mag:Number;
        nx = -(y0 - y1);
        ny = (x0 - x1);
        mag = Math.sqrt(nx*nx+ny*ny);
        if (mag == 0) { mag = 0.00001;}
        nx /= mag;
        ny /= mag;
        cx = x0 +(x1-x0)*0.5;
        cy = y0 +(y1-y0)*0.5;
    }//xline
    
    public var cx:Number = 0;
    public var cy:Number = 0;
    public var nx:Number = 0;
    public var ny:Number = 0;
    
    
    
}//xline