Advertisement
liuwong

nape example: laser

Jun 5th, 2013
133
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 laserExample extends baseExample
  20.     {
  21.         private var laserBody:Body;
  22.        
  23.         private var laserSprite:Sprite;
  24.         private var points:Array;
  25.        
  26.         public function laserExample(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(0x770000, 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.             var k:int = 10;
  89.             var i:int;
  90.            
  91.             var v1:Vec2 = laserBody.position.copy();
  92.             var v2:Vec2 = Vec2.fromPolar(1, laserBody.rotation);
  93.             var v3:Vec2 = new Vec2(0, 0);
  94.             var v4:Vec2 = new Vec2(0, 0);
  95.            
  96.             points.length = 0;
  97.             points.push(v1.copy());
  98.            
  99.             for (i = 0; i < k; i++)
  100.             {
  101.                 var b:Boolean = doLaser(v1, v2, v3, v4);
  102.                 if (b == false)
  103.                     return;
  104.                    
  105.                 points.push(v4.copy());
  106.                
  107.                 v1.set(v4);
  108.                 v2.set(v3);
  109.             }
  110.         }
  111.        
  112.         private function updateLaser():void
  113.         {
  114.             doAllLasers();
  115.            
  116.             laserSprite.graphics.clear();
  117.             laserSprite.graphics.lineStyle(2, 0xff0000);
  118.            
  119.             var k:int = points.length;
  120.             if (k > 1)
  121.             {
  122.                 laserSprite.graphics.moveTo(points[0].x, points[0].y);
  123.                
  124.                 var i:int;
  125.                 for (i = 1; i < k; i++)
  126.                 {
  127.                     laserSprite.graphics.lineTo(points[i].x, points[i].y);
  128.                 }
  129.             }
  130.         }
  131.        
  132.         override public function update():void
  133.         {
  134.             super.update();
  135.            
  136.             updateLaser();
  137.         }
  138.     }
  139.    
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement