Advertisement
liuwong

nape example: laser 2

Jun 5th, 2013
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package example
  2. {
  3.     import flash.display.DisplayObjectContainer;
  4.     import flash.display.Sprite;
  5.     import flash.filters.GlowFilter;
  6.     import nape.geom.Ray;
  7.     import nape.geom.RayResult;
  8.     import nape.geom.Vec2;
  9.     import nape.phys.Body;
  10.     import nape.phys.BodyType;
  11.     import nape.shape.Circle;
  12.    
  13.     /**
  14.      * ...
  15.      * @author liu wong
  16.      *
  17.      */
  18.    
  19.     public class laserExample02 extends baseExample
  20.     {
  21.         private var laserBody:Body;
  22.        
  23.         private var laserSprite:Sprite;
  24.         private var points:Array;
  25.        
  26.         public function laserExample02(prnt:DisplayObjectContainer):void
  27.         {
  28.             super(prnt);
  29.         }
  30.        
  31.         override protected function init():void
  32.         {
  33.             super.init();
  34.            
  35.             space.gravity.setxy(0, 0);
  36.             space.worldAngularDrag = Math.PI;
  37.             space.worldLinearDrag = 0.9;
  38.            
  39.             laserSprite = new Sprite();
  40.             laserSprite.filters = [new GlowFilter(0x007700, 1, 4, 4, 4, 3)];
  41.             addChild(laserSprite);
  42.            
  43.             addWalls();
  44.            
  45.             addHand();
  46.            
  47.             laserBody = addCircle(320, 240, 32, (Math.PI / 180) * -0);
  48.            
  49.             points = new Array();
  50.            
  51.             var k:int = 10;
  52.             var i:int;
  53.            
  54.             for (i = 0; i < k; i++)
  55.             {
  56.                 addCircle(random(40, 600), random(40, 440), random(16, 32));
  57.                 addRectangle(random(40, 600), random(40, 440), random(32, 64), random(32, 64), Math.random() * Math.PI * 2, false);
  58.             }
  59.         }
  60.        
  61.         override public function free():void
  62.         {
  63.             laserBody.space = null;
  64.             laserBody = null;
  65.            
  66.             points.length = 0;
  67.             points = null;
  68.            
  69.             super.free();
  70.         }
  71.        
  72.         private function doLaser(src:Vec2, dir:Vec2, normal:Vec2, dst:Vec2):Boolean
  73.         {
  74.             var r:Ray = new Ray(src, dir);
  75.            
  76.             var rr:RayResult = space.rayCast(r);
  77.             if (rr == null)
  78.                 return false;
  79.            
  80.             normal.set(rr.normal.reflect(dir));
  81.             dst.set(r.at(rr.distance * 0.999));
  82.            
  83.             return true;
  84.         }
  85.        
  86.         private function doAllLasers():void
  87.         {
  88.             const maxLen:Number = 6400;
  89.            
  90.             var v1:Vec2 = laserBody.position.copy();
  91.             var v2:Vec2 = Vec2.fromPolar(1, laserBody.rotation);
  92.             var v3:Vec2 = new Vec2(0, 0);
  93.             var v4:Vec2 = new Vec2(0, 0);
  94.            
  95.             points.length = 0;
  96.             points.push(v1.copy());
  97.            
  98.             var len:Number = 0;
  99.            
  100.             while (true)
  101.             {
  102.                 var b:Boolean = doLaser(v1, v2, v3, v4);
  103.                 if (b == false)
  104.                     return;
  105.                    
  106.                 len += v1.sub(v4).length;
  107.                    
  108.                 points.push(v4.copy());
  109.                
  110.                 if (len >= maxLen)
  111.                     return;
  112.                
  113.                 v1.set(v4);
  114.                 v2.set(v3);
  115.             }
  116.         }
  117.        
  118.         private function updateLaser():void
  119.         {
  120.             doAllLasers();
  121.            
  122.             laserSprite.graphics.clear();
  123.             laserSprite.graphics.lineStyle(2, 0x00ff00);
  124.            
  125.             var k:int = points.length;
  126.             if (k > 1)
  127.             {
  128.                 laserSprite.graphics.moveTo(points[0].x, points[0].y);
  129.                
  130.                 var i:int;
  131.                 for (i = 1; i < k; i++)
  132.                 {
  133.                     laserSprite.graphics.lineTo(points[i].x, points[i].y);
  134.                 }
  135.             }
  136.         }
  137.        
  138.         override public function update():void
  139.         {
  140.             super.update();
  141.            
  142.             updateLaser();
  143.         }
  144.     }
  145.    
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement