Advertisement
liuwong

nape example: platformer

Feb 25th, 2014
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package example
  2. {
  3.     import example.baseExample;
  4.     import example.kinematicplatform.kinematicBodyInfo;
  5.     import example.platformer.physPlayer;
  6.     import flash.display.DisplayObjectContainer;
  7.     import flash.events.KeyboardEvent;
  8.     import nape.callbacks.CbEvent;
  9.     import nape.callbacks.CbType;
  10.     import nape.callbacks.InteractionListener;
  11.     import nape.callbacks.InteractionType;
  12.     import nape.callbacks.PreCallback;
  13.     import nape.callbacks.PreFlag;
  14.     import nape.callbacks.PreListener;
  15.     import nape.geom.Vec2;
  16.     import nape.phys.Body;
  17.     import nape.phys.BodyType;
  18.     import nape.phys.Compound;
  19.     import nape.shape.Polygon;
  20.    
  21.     /**
  22.      * ...
  23.      * @author Liu Wong
  24.      *
  25.      */
  26.    
  27.     public class platformerExample extends baseExample
  28.     {
  29.         private var player:physPlayer;
  30.        
  31.         private var playerCb:CbType;
  32.         private var playerExCb:CbType;
  33.         private var oneWayPlatformCb:CbType;
  34.        
  35.         private var keys:Array = [false, false, false];
  36.        
  37.         private var kinemticBodies:Array/*kinematicBodyInfo*/;
  38.        
  39.         public function platformerExample(prnt:DisplayObjectContainer):void
  40.         {
  41.             super(prnt);
  42.         }
  43.        
  44.         override protected function init():void
  45.         {
  46.             super.init();
  47.            
  48.             space.gravity.setxy(0, 980);
  49.            
  50.             addHand();
  51.            
  52.             addWalls();
  53.            
  54.             playerCb = new CbType();
  55.             playerExCb = new CbType();
  56.             oneWayPlatformCb = new CbType();
  57.            
  58.             player = new physPlayer(space, new Vec2(100, 50), playerCb, playerExCb);
  59.            
  60.             addBlock(200, 380, 200, 200);
  61.             addBlock(320, 430, 100, 100);
  62.             addBlock(400, 450, 50, 50);
  63.            
  64.             kinemticBodies = new Array();
  65.            
  66.             var k:int = 8;
  67.             var i:int;
  68.            
  69.             const platformSize:Number = 64;
  70.            
  71.             for (i = 0; i < k; i++)
  72.             {
  73.                 var v1:Vec2 = new Vec2(100 + i * platformSize, 100);
  74.                 var v2:Vec2 = new Vec2(100 + i * platformSize, 450);
  75.                 var speed:Number = 100 + Math.random() * 50;
  76.                 var tmp:kinematicBodyInfo = addPlatform(v1, v2, speed);
  77.                 var b:Body = tmp.body;
  78.                
  79.                 b.userData.trigger = true;
  80.                 b.userData.speed = speed;
  81.                 b.userData.v1 = v1;
  82.                 b.userData.v2 = v2;
  83.                
  84.                 b.userData.normal = Vec2.fromPolar(1, Math.PI * 0.25);
  85.                 b.userData.normal2 = Vec2.fromPolar(1, Math.PI * 0.75);
  86.                
  87.                 b.shapes.add(new Polygon(Polygon.box(platformSize, platformSize)));
  88.                
  89.                 b.cbTypes.add(oneWayPlatformCb);
  90.                
  91.                 kinemticBodies.push(tmp);
  92.             }
  93.            
  94.             space.listeners.add(new InteractionListener(CbEvent.ONGOING, InteractionType.COLLISION, CbType.ANY_BODY, playerExCb, player.onCollision));
  95.             space.listeners.add(new PreListener(InteractionType.COLLISION, oneWayPlatformCb, playerCb, onPlatform, 0, true));
  96.            
  97.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  98.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  99.         }
  100.        
  101.         private function addBlock(xx:Number, yy:Number, ww:Number, hh:Number):void
  102.         {
  103.             var b:Body = addRectangle(xx, yy, ww, hh);
  104.             b.userData.normal = Vec2.fromPolar(1, Math.PI * 0.25);
  105.             b.userData.normal2 = Vec2.fromPolar(1, Math.PI * 0.75);
  106.             b.cbTypes.add(oneWayPlatformCb);
  107.         }
  108.        
  109.         private function addPlatform(pos:Vec2, finish:Vec2, time:Number):kinematicBodyInfo
  110.         {
  111.             var tmp:Body = new Body(BodyType.KINEMATIC, pos);
  112.            
  113.             var bi:kinematicBodyInfo = new kinematicBodyInfo(tmp);
  114.             bi.onFinish = onFinish;
  115.             bi.updateFinish(finish);
  116.             bi.updateSpeed(time);
  117.            
  118.             tmp.space = space;
  119.            
  120.             return bi;
  121.         }
  122.        
  123.         private function onFinish(src:kinematicBodyInfo):void
  124.         {
  125.             var b:Boolean = src.body.userData.trigger;
  126.             src.body.userData.trigger = !b;
  127.            
  128.             var v:Vec2;
  129.            
  130.             if (b)
  131.                 v = src.body.userData.v1.copy()
  132.             else
  133.                 v = src.body.userData.v2.copy();
  134.            
  135.             src.updateFinish(v);
  136.             src.updateSpeed(src.body.userData.speed);
  137.         }
  138.        
  139.         private function onPlatform(cb:PreCallback):PreFlag
  140.         {    
  141.             var v1:Vec2 = cb.arbiter.collisionArbiter.normal.copy();
  142.             if (!cb.swapped)
  143.                 v1.muleq( -1);
  144.            
  145.             var body:Body = cb.int1.castBody;
  146.            
  147.             if (body.userData.normal.dot(v1) > 0)
  148.                 if (body.userData.normal2.dot(v1) > 0)
  149.                     return PreFlag.ACCEPT;
  150.            
  151.             return PreFlag.IGNORE;
  152.         }
  153.        
  154.         protected function onKeyDown(event:KeyboardEvent):void
  155.         {
  156.             switch (event.keyCode)
  157.             {
  158.                 case 37://left
  159.                     keys[0] = true;
  160.                     return;
  161.                    
  162.                 case 39://right
  163.                     keys[1] = true;
  164.                     return;
  165.                    
  166.                 case 38://jump
  167.                     keys[2] = true;
  168.                     return;
  169.             }
  170.            
  171.             return;
  172.         }
  173.        
  174.         protected function onKeyUp(event:KeyboardEvent):void
  175.         {
  176.             switch (event.keyCode)
  177.             {
  178.                 case 37://left
  179.                     keys[0] = false;
  180.                     return;
  181.                    
  182.                 case 39://right
  183.                     keys[1] = false;
  184.                     return;
  185.                    
  186.                 case 38://jump
  187.                     keys[2] = false;
  188.                     player.resetJump();
  189.                     return;
  190.             }
  191.         }
  192.        
  193.         private function updatePlayerControl():void
  194.         {
  195.             var b:Boolean = false;
  196.                
  197.             if (keys[0])
  198.             {
  199.                 player.left();
  200.                    
  201.                 b = true;
  202.             }
  203.                
  204.             if (keys[1])
  205.             {
  206.                 player.right();
  207.                
  208.                 b = true;
  209.             }
  210.            
  211.             if (keys[2])
  212.             {
  213.                 player.jump();
  214.             }
  215.            
  216.             if (b == false)
  217.                 player.applyDamping();
  218.         }
  219.        
  220.         override protected function miniUpdate(delta:Number):void
  221.         {
  222.             player.resetCounter();
  223.            
  224.             super.miniUpdate(delta);
  225.         }
  226.        
  227.         override protected function miniPostUpdate(delta:Number):void
  228.         {
  229.             super.miniPostUpdate(delta);
  230.            
  231.             player.update();
  232.            
  233.             updatePlayerControl();
  234.         }
  235.        
  236.         override public function update():void
  237.         {
  238.             super.update();
  239.            
  240.             var k:int = kinemticBodies.length;
  241.             var i:int;
  242.            
  243.             if (k > 0)
  244.             {
  245.                 for (i = 0; i < k; i++)
  246.                 {
  247.                     kinemticBodies[i].update();
  248.                 }
  249.             }
  250.         }
  251.        
  252.         override public function free():void
  253.         {
  254.             player.free();
  255.             player = null;
  256.            
  257.             kinemticBodies.length = 0;
  258.             kinemticBodies = null;
  259.            
  260.             super.free();
  261.            
  262.             stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  263.             stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  264.         }
  265.     }
  266.    
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement