flash on 2013-6-21

by mutantleg
♥0 | Line 231 | Modified 2013-06-24 06:07:23 | 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/y99k
 */

package {
    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 = 256;
            deb.height = 256;
            addChild(deb);
           
           
            var i:int;
            var num:int;
           vecAct = new Vector.<xActor>(128, false);
           
           num = vecAct.length; 
             for (i = 0; i < num; i++)
             { vecAct[i] = new xActor(); }
       
           vecBul = new Vector.<xActor>(128, false);
           
           num = vecBul.length
           for (i = 0; i < num; i++)
           {  vecBul[i] = new xActor();  }
            
            
            for (i = 0; i < 64; i++)
            {
               addActor(Math.random()*465, Math.random()*465, Math.random()*(vecTeam.length));
             //  addActor(Math.random()*465, Math.random()*465, 2);
                  
            } //nexti
            
            
            stage.addEventListener(Event.ENTER_FRAME, onEnter);
        }//ctor
        
        
        public function reset():void
        {
            var i:int;
            for (i = 0; i < 64; i++)
            {
               addActor(Math.random()*465, Math.random()*465, Math.random()*(vecTeam.length));
      
            } //nexti
        }//reset
        
        
        
        //using some oldschool C style actor handling game tech stuff because im bored
        public var vecAct:Vector.<xActor>;
        public var vecBul:Vector.<xActor>;
        
        public var vecTeam:Vector.<uint> = Vector.<uint>([0, 0xFF0000, 0xFF, 0xFF00, 0xFFFF00, 0xFF00FF, 0x808080, 0x123456]);
        
        
          public var deb:TextField;      
          
          
        public function findTarget(m:xActor, range:Number):xActor
        {
            
            
            var i:int;
            var num:int;
            var a:xActor;
            var dist:Number;
            
            var close:Number;
            var ret:xActor;
            
            ret = null;
            close = 999999999999;
            
            range *= range;
            
            num = vecAct.length;
            
            for (i = 0; i < num; i++)
            {
                a = vecAct[i];
                if (a == m) { continue; } // self
                if (a.hp <= 0) { continue; } //not exist
                if (a.team == m.team) { continue; } //same team

                dist = ((a.cx-m.cx)*(a.cx-m.cx))+((a.cy-m.cy)*(a.cy-m.cy));
                
                if ( dist > range) { continue; }                 
                
                if ( dist > close) { continue; }
                
                close = dist;
                ret = a;
              //  return a;
            }//nexti        
            
            return ret;
        }//findtarget  
          
        
        public function addActor(ax:Number, ay:Number, t:int):void
        {
            var i:int;
            var num:int;
            var a:xActor;
            
            num = vecAct.length;
            
            for (i = 0; i < num; i++)
            {
                a = vecAct[i];
                if (a.hp > 0) { continue; }
                a.cx = ax;
                a.cy = ay;
                a.vx = 0;
                a.vy = 0;
                a.hp = 100;
                a.team = t;
                a.target = null;
                a.mode = 0;
                break;
            }//nexti
            
        }//addactor
        
        public function fireBul(ax:Number, ay:Number, vx:Number, vy:Number, t:int):void
        {
            var i:int;
            var num:int;
            var a:xActor;
            
            num = vecBul.length;
            
            for (i = 0; i < num; i++)
            {
                a = vecBul[i];
                if (a.hp > 0) { continue; }
                a.cx = ax;
                a.cy = ay;
                a.vx = vx;
                a.vy = vy;
                a.rad = 2;
                a.hp = 20;
                a.team = t;
                break;
            }//nexti
        }//fire
        
        public function onEnter(e:Event):void
        {
            
            graphics.clear();
            graphics.lineStyle(2, 0);
            
            var k:int;
            var numk:int;
            var i:int;
            var num:int;
            var a:xActor;
            var b:xActor;
            
            var dx:Number;
            var dy:Number;
            var alive:int;
            
            alive = 0;
            
            num = vecAct.length;
            numk = vecBul.length;
            for (i = 0; i < num; i++)
            {
                a = vecAct[i];
                if (a.hp <=0) { continue;}
                alive += 1;
                
                if (a.reload > 0) { a.reload -= 1;}
                
                if (a.mode == 0)
                {
                    a.vx += (Math.random()-Math.random()) *0.1;
                    a.vy += (Math.random()-Math.random()) *0.1;
                  
                   a.wait += Math.random() * 4;
                   if (a.wait >= 20) { a.wait = 0; a.mode = 1; }
             /*     
                    if (Math.random() < 0.02 && a.reload <= 0)
                    {
                        a.reload = 20;
                        a.ang = Math.random() * 6.28;
                        fireBul(a.cx, a.cy, Math.cos(a.ang)*8, Math.sin(a.ang)*8, a.team);
                    }
                    */
                } else
                if (a.mode == 1)
                {
                   a.target = findTarget(a, 200);   a.mode = 2;    
                   if (a.target == null) { a.mode = 0; continue;}   
                }else
                if (a.mode == 2)
                {
                  if (a.target.hp <= 0) { a.target = null; a.mode = 0; continue; }   
                    
                    dx =  a.target.cx - a.cx;;
                    dy =  a.target.cy - a.cy;
                    a.ang = Math.atan2(dy, dx);
                    dx = dx < 0 ? -dx : dx;
                    dy = dy < 0 ? -dy : dy;
                    
                    if (dx > 120 || dy > 120) { a.mode = 0; continue;}
                    if (dx > 20 && dy > 20)
                    {  a.vx = Math.cos(a.ang)*0.6; a.vy = Math.sin(a.ang)*0.6;   }
                    else { a.vx *= 0.97; a.vy *=0.97;}
                    
                    
                    //if (dx < 70 && dy < 70)
                    if (a.reload <= 0)
                    {
                        a.reload = 20;
                        fireBul(a.cx, a.cy, Math.cos(a.ang)*8, Math.sin(a.ang)*8, a.team);
                    }//endif2
                    
                    //randomly lose interest
                    if (Math.random() < 0.0001) { a.target = null; a.mode = 0; continue;}
                    
                }//endif2
                
                a.vx *= 0.99;
                a.vy *= 0.99;
                
                if (a.vx < 0 && a.cx < 0) { a.cx = 0; a.vx = -a.vx; }
                if (a.vx > 0 && a.cx > 465) { a.cx = 465; a.vx = -a.vx; }
                if (a.vy < 0 && a.cy < 0) { a.cy = 0; a.vy = -a.vy; }
                if (a.vy > 0 && a.cy > 465) { a.cy = 465; a.vy = -a.vy; }
                
                a.cx += a.vx;
                a.cy += a.vy;   
                
                for (k = 0; k < numk; k++)
                {
                    b = vecBul[k];
                    if (b.hp <= 0) { continue; } //bullet not alive
                    if (b.team == a.team) { continue; } //same team (or own bullet)
                    
                    //aabb test
                     if (b.cx + b.rad < a.cx-a.rad) { continue; }
                     if (a.cx + a.rad < b.cx-b.rad) { continue; }
                     if (b.cy + b.rad < a.cy-a.rad) { continue; }
                     if (a.cy + a.rad < b.cy-b.rad) { continue; }
                  
                      a.hp -= 30;
                      b.hp = -1;  
                    
                }//nextk
                 
            }//nexti
            
            
            num = vecBul.length;
            for (i = 0; i < num; i++)
            {
             a = vecBul[i];
             if (a.hp <= 0) { continue;}
                a.hp -=1;
                a.cx += a.vx;
                a.cy += a.vy;
            }//nexti2
            
           
           
            num = vecAct.length;
            for (i = 0; i < num; i++)
            {
             a = vecAct[i];
             if (a.hp <= 0) { continue;}
                 
                // graphics.beginFill(a.team == 1 ? 0:0xFF0000, 1);
                 graphics.beginFill(vecTeam[a.team], 1);
             
                  graphics.drawCircle(a.cx, a.cy, a.rad);    
                 graphics.endFill();
                 
                 
                 if (a.target != null)
                 {
                   graphics.moveTo(a.cx, a.cy);   
                   graphics.lineTo(a.cx+Math.cos(a.ang)*a.rad, a.cy+Math.sin(a.ang)*a.rad);
                 }
                 
                 //debug
                 
                 /*
                 if (a.target != null)
                 {
                     graphics.moveTo(a.cx, a.cy);
                     graphics.lineTo(a.target.cx, a.target.cy);
                 }
                 */
            }//nexti2
          
            num = vecBul.length;  
            for (i = 0; i < num; i++)
            {
             a = vecBul[i];
             if (a.hp <= 0) { continue;}
                 graphics.drawCircle(a.cx, a.cy, a.rad);    
            }//nexti2
            
            
            
            if (alive <= 8) { reset(); }
            
        }//onenter
        
        
        
    }//classend
}

internal class xActor
{
  public var cx:Number = 0;
  public var cy:Number = 0;
  public var vx:Number = 0;
  public var vy:Number = 0;
  public var rad:Number = 8;
  
  public var ang:Number = 0;
  
  public var target:xActor = null;
  
  public var mode:int = 0;   
  public var shape:int = 0;
  public var type:int = 0;
  public var team:int = 0;
    
  public var hp:Number = 0;
    
  public var reload:int = 0;  
  public var wait:int = 0;
    
}//xactor