flash on 2016-9-12

by mutantleg
♥0 | Line 217 | Modified 2016-09-12 07:03:51 | 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/mhKZ
 */

package {
    import flash.text.TextField;
    import flash.display.StageQuality;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        public function FlashTest() {
       
           stage.quality =  StageQuality.MEDIUM;
           
           vecLine = new Vector.<xLine>(0, false);


            deb = new TextField();
            deb.width=320; deb.height=240;
            deb.mouseEnabled=false;
            addChild(deb);

          var a:xLine;          
          var x0:Number; var y0:Number;
          var i:int;
          
          x0 = 0; y0 = 430;
          
          for (i=0;i<32;i+=1)
          {
              a = new xLine(); vecLine.push(a);
              a.x0 = x0; a.y0 = y0;
              x0 += 16; if (i==13){x0+=128;}
              a.x1 = x0; a.y1 = y0;
              a = new xLine(); vecLine.push(a);
              a.x0 = x0; a.y0 = y0;
              y0 -= 8+Math.random()*16;
              a.x1 = x0; a.y1 = y0;
          }//nexti

              a = new xLine(); vecLine.push(a);
              a.x0 = 0; a.y0 = 120;
              a.x1 = 500; a.y1 = 120;

              a = new xLine(); vecLine.push(a);
              a.x0 = 30; a.y0 = 0;
              a.x1 = 30; a.y1 = 520;

              a = new xLine(); vecLine.push(a);
              a.x0 = 30; a.y0 = 0;
              a.x1 = 300; a.y1 = 120;

            cx= 230; cy = 100;          
       
           stage.addEventListener(MouseEvent.MOUSE_DOWN, onMdown);
           stage.addEventListener(MouseEvent.MOUSE_UP, onMup); 
           stage.addEventListener(Event.ENTER_FRAME, onEnter);             
        }//ctor
        
        public var deb:TextField;
        
        public function onMdown(e:MouseEvent):void { mbutton=1;}
        public function onMup(e:MouseEvent):void {mbutton=0;}
        
        public var mbutton:int = 0;
        
        public var vecLine:Vector.<xLine>;
        
        
            
        public var cx:Number =230;
        public var cy:Number =230;
        public var vx:Number =0;
        public var vy:Number =0;
        public var ang:Number =0;
        public var vang:Number=0;
        
        public var camx:Number = 0;
        public var camy:Number = 0;

        public var gang:Number = 1.57;

        public var gt:int = 0;
        
        public function getMag(ax:Number,ay:Number):Number
        { return Math.sqrt(ax*ax+ay*ay); }

        public function onEnter(e:Event):void
        {
           graphics.clear();
           graphics.lineStyle(2, 0); 

            //gang =0.48;
            gang = 0.1;

            ang = gang;

            var nx:Number; var ny:Number;
            nx = Math.cos(gang);
            ny = Math.sin(gang);
             
           vx+=nx*0.4;
           vy+=ny*0.4;  
                        
           // vang *=0.9;
           // vang = vx*0.1; ang+=vang;
            vx*=0.99;vy*=0.99;
            //vy+=0.4;
            if (vy>8){vy=8;}

           var mx:Number; var my:Number;
           mx = stage.mouseX; my =stage.mouseY;
           if (mbutton > 0) { cx = mx+camx; cy = my+camy; }
           var ta:Number;
           ta = Math.atan2(my-cy, mx-cx);
           vx += Math.cos(ta)*0.25;
           vy += Math.sin(ta)*0.25;
           
           
           
           if (cy > 500) { cx = 235; cy =135; vx=0;vy=0;}
           
          // camx +=  ((cx-230)-camx)*0.1;
          // camy +=  ((cy-230)-camy)*0.1;

           var r:Number;
           var wr:Number;
           r=16;
           wr=16; 
           wr =2;
           
           var px:Number; var py:Number;
            
           px =cx; py=cy;
            
           graphics.drawCircle(px-camx,py-camy,r);
           graphics.moveTo(px-camx,py-camy);
           graphics.lineTo(px+Math.cos(ang)*r-camx,py+Math.sin(ang)*r-camy);
           
            
          
          var a:xLine;          
          var i:int; var num:int;
          var k:int;

          num = vecLine.length;
          for (i=0; i<num; i+=1)
          {           
            a = vecLine[i];
            
           graphics.drawCircle(a.x0-camx,a.y0-camy,4);
           graphics.drawCircle(a.x1-camx,a.y1-camy,4);
           graphics.moveTo(a.x0-camx,a.y0-camy);
           graphics.lineTo(a.x1-camx,a.y1-camy);
          }//nexti 
          
          var kx:Number; var ky:Number; 
          var u:Number;          
          var kx2:Number; var ky2:Number; 
          var t2:Number;  var u2:Number;
 
          kx2 =cx-nx*64*2; ky2 = cy-ny*64*2;
 
          
          kx =cx+nx*64*2; ky = cy+ny*64*2;
          graphics.moveTo(cx,cy);
          graphics.lineTo(kx,ky);
          
          t=1; t2 = 1;
          num = vecLine.length;
          for (i=0; i<num; i+=1)
          {           
            a = vecLine[i];
 
            //u = segInter(a.x0,a.y0,a.x1,a.y1, cx,cy, kx,ky);          
            u = segInter(cx,cy, kx,ky, a.x0,a.y0,a.x1,a.y1);          
            if (u<t && u > 0) { t = u; } 
 
            u2 = segInter(cx,cy, kx2,ky2, a.x0,a.y0,a.x1,a.y1);          
            if (u2<t2 && u2 > 0) { t2 = u2; } 
            
          }//nexti

            //if (t<1 && vy>0) { vy=0; }
          
           kx = cx+(kx-cx)*t;
           ky = cy+(ky-cy)*t;
           graphics.drawCircle(kx,ky,12);
           graphics.drawCircle(kx+nx*-8,ky+ny*-8,6);
           kx2 = cx+(kx2-cx)*t2;
           ky2 = cy+(ky2-cy)*t2;
           graphics.drawCircle(kx2,ky2,8);
           graphics.drawCircle(kx2+nx*8,ky2+ny*8,4);
           
           
           nx=-nx; ny=-ny;
           var dist:Number; var dist2:Number;
           dist = (cx-kx)*nx + (cy-ky)*ny;
           dist2 = (cx-kx2)*-nx + (cy-ky2)*-ny;
           dot = nx * vx + ny * vy;             
           deb.text = " d "+dist+"\n d2 "+dist2+"\n dot "+dot;
           
  
            gt += 1;
            var standh:Number;
            standh = 64;
          // if (gt & 64) { standh = 32; }           
           
            if (dist < standh && dot < 0)
            {
              //dot*=1.5;
              
              vx -= nx * dot;
              vy -= ny * dot;  
              
              if (dist < (standh-1) && dist2 > 32 && dot < 0)
              {
               dist = standh-dist;
               cx += nx*dist;               
               cy += ny*dist;
               dist2 = (cx-kx2)*-nx + (cy-ky2)*-ny;
                 if (dist2 < 16)
                   {
                       dist2 = 16-dist2;
                       cx += -nx*dist2;               
                       cy += -ny*dist2;
                   }//endif3
               
              }//endif2
            }//endif 
         //  if ( (ky-cy)<63){ vy-=0.8;}
         /*
           if ( (ky-cy)<64)
           { 
             //cy = ky-64;
             if (Math.abs(ky-cy)<0.1){cy=ky-64;}
             cy += ((ky-64)-cy)*0.2;
             if (cy < (ky2+17)){cy=ky2+17;}
           }
          */
                    
          num = vecLine.length;
          for (k=0; k<4; k+=1)
          for (i=0; i<num; i+=1)
          {           
            a = vecLine[i];
            
          var t:Number;
           t = getClose(px,py,a.x0,a.y0,a.x1,a.y1);
           //graphics.drawCircle(closex-camx,closey-camy,wr);
            
            var dx:Number; var dy:Number;
            var mag:Number;
            dx= (px)-closex;dy=(py)-closey;
            mag = getMag(dx,dy);
            if (mag==0){mag=0.001;}
            dx/=mag;dy/=mag;
            if (mag<(r+wr))
            {
              var dot:Number;
              dot = vx*dx+vy*dy;  
              if (dot<0)
              {  
                vx += -dx*dot;
                vy += -dy*dot;  
                
               //vang += (((vy*dx)+(dy*vx)) / -r)*0.3;
              } 
              
              /*
             graphics.moveTo(closex-camx,closey-camy);
             graphics.lineTo(closex-camx+dx*32,closey-camy+dy*32);   

             t = dx; dx=-dy; dy=t;
             vx+=dx*0.1; vy+=dy*0.1;
             graphics.moveTo(px-camx, py-camy);
             graphics.lineTo(px-camx+dx*32, py-camy+dy*32);   
              */
            }//endif
          }//nexti
          
          cx+=vx; cy+=vy;
            
        }//onenter
        
        public var closex:Number =0;
        public  var closey:Number =0;
        public function getClose(px:Number,py:Number, x0:Number,y0:Number,x1:Number,y1:Number):Number
        {
           var t:Number;
           var ax:Number; var ay:Number;
           var bx:Number; var by:Number;
           ax = px-x0; ay=py-y0;
           bx=x1-x0; by=y1-y0;
           t = (ax*bx+ay*by)/(bx*bx+by*by);
           if(t<0){t=0;} if(t>1){t=1;}
            closex=x0+bx*t;
            closey=y0+by*t;
           return t; 
        }//getclose
        
         public function segInter(x0:Number, y0:Number, x1:Number, y1:Number,
          x2:Number, y2:Number, x3:Number, y3:Number ):Number
          {   var ua:Number;    var ub:Number;  var bot:Number;
            bot = ((y3-y2)*(x1-x0))-((x3-x2)*(y1-y0));
            if (bot == 0) { return 999;}
            ua = (((x3-x2)*(y0-y2))-((y3-y2)*(x0-x2))) / bot;
            ub = (((x1-x0)*(y0-y2))-((y1-y0)*(x0-x2))) / bot;
            if (ua > 1 || ua < 0 || ub > 1 || ub < 0) { return 999; }          
            return ua;
          }//lineline  
        
        
        
        
        
        
        
    }//classend
}

internal class xLine
{
  public var x0:Number = 0;
  public var y0:Number = 0;
  public var x1:Number = 0;
  public var y1:Number = 0;
  
}//xline