home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Diversos / Beez.swf / scripts / core / objects / Platform.as < prev    next >
Encoding:
Text File  |  2008-09-03  |  7.3 KB  |  225 lines

  1. package core.objects
  2. {
  3.    import Box2D.Collision.Shapes.b2CircleDef;
  4.    import Box2D.Collision.Shapes.b2PolygonDef;
  5.    import Box2D.Collision.Shapes.b2Shape;
  6.    import Box2D.Collision.Shapes.b2ShapeDef;
  7.    import Box2D.Collision.b2ContactPoint;
  8.    import Box2D.Common.Math.b2Math;
  9.    import Box2D.Common.Math.b2Vec2;
  10.    import Box2D.Dynamics.Joints.b2RevoluteJointDef;
  11.    import Box2D.Dynamics.b2Body;
  12.    import Box2D.Dynamics.b2BodyDef;
  13.    import core.BContactListener;
  14.    import core.Input;
  15.    import core.events.CoreEvent;
  16.    import flash.display.Sprite;
  17.    import flash.geom.Point;
  18.    import flash.media.Sound;
  19.    import flash.media.SoundTransform;
  20.    
  21.    public class Platform extends BaseObject
  22.    {
  23.       
  24.       public static const NORMAL_TORQUE:Number = 1000;
  25.       
  26.       public static const POWERUP_TORQUE:Number = NORMAL_TORQUE * 3;
  27.        
  28.       
  29.       private var minImpulse:Number = 10;
  30.       
  31.       private var torque:Number;
  32.       
  33.       private var input:Input;
  34.       
  35.       public var platformDef:PlatformDef;
  36.       
  37.       protected var sndCollide:Sound;
  38.       
  39.       private var inputEnabled:Boolean;
  40.       
  41.       public var torqueMult:int;
  42.       
  43.       private var maxImpulse:Number = 100;
  44.       
  45.       public function Platform(def:PlatformDef)
  46.       {
  47.          platformDef = def;
  48.          super(def);
  49.       }
  50.       
  51.       override protected function createShapeDef() : b2ShapeDef
  52.       {
  53.          var shapeDef:b2PolygonDef = new b2PolygonDef();
  54.          shapeDef.SetAsBox(platformDef.width / 2 / engine.m_physScale,platformDef.height / 2 / engine.m_physScale);
  55.          shapeDef.density = 3;
  56.          shapeDef.friction = 0.5;
  57.          shapeDef.restitution = 0.2;
  58.          return shapeDef;
  59.       }
  60.       
  61.       private function updateHandler(e:CoreEvent) : void
  62.       {
  63.          updateSkin();
  64.       }
  65.       
  66.       public function disableInput() : void
  67.       {
  68.          inputEnabled = false;
  69.       }
  70.       
  71.       private function collideAddHandler(e:CoreEvent) : void
  72.       {
  73.          var otherBody:b2Body = null;
  74.          var v1:b2Vec2 = null;
  75.          var dot:Number = NaN;
  76.          var impulse:Number = NaN;
  77.          var pos:Point = null;
  78.          var playerShape:b2Shape = null;
  79.          var point:b2ContactPoint = e.data as b2ContactPoint;
  80.          var body1:b2Body = point.shape1.m_body;
  81.          var body2:b2Body = point.shape2.m_body;
  82.          if(body1.m_userData == this || body2.m_userData == this)
  83.          {
  84.             otherBody = body1.m_userData == this ? body2 : body1;
  85.             if(otherBody.m_userData is PlayerBall)
  86.             {
  87.                playerShape = otherBody == body1 ? point.shape1 : point.shape2;
  88.                if(playerShape != engine.playerBall.mainShape)
  89.                {
  90.                   return;
  91.                }
  92.             }
  93.             v1 = otherBody.m_linearVelocity;
  94.             dot = Math.abs(b2Math.b2Dot(v1,point.normal));
  95.             impulse = dot * otherBody.m_mass;
  96.             if(impulse < minImpulse)
  97.             {
  98.                return;
  99.             }
  100.             if(impulse > maxImpulse)
  101.             {
  102.                impulse = maxImpulse;
  103.             }
  104.             pos = new Point(point.position.x * engine.m_physScale,point.position.y * engine.m_physScale);
  105.             ballCollide(impulse / maxImpulse,pos);
  106.          }
  107.       }
  108.       
  109.       public function setTorque(value:Number) : void
  110.       {
  111.          torque = value;
  112.       }
  113.       
  114.       public function enableInput() : void
  115.       {
  116.          inputEnabled = true;
  117.       }
  118.       
  119.       override protected function init() : void
  120.       {
  121.          input = Input.getInstance();
  122.          torque = NORMAL_TORQUE;
  123.          torqueMult = 1;
  124.          inputEnabled = true;
  125.          super.init();
  126.          fix();
  127.          updateSkin();
  128.          initSounds();
  129.          engine.dispatcher.addEventListener(CoreEvent.PRE_UPDATE,preUpdateHandler);
  130.          engine.dispatcher.addEventListener(CoreEvent.UPDATE,updateHandler);
  131.          engine.contactListener.dispatcher.addEventListener(BContactListener.COLLIDE_ADD,collideAddHandler);
  132.       }
  133.       
  134.       override protected function createSkin() : Sprite
  135.       {
  136.          var SkinClass:Class = engine.assets.getAssetClass("PlatformAsset");
  137.          var skin:Sprite = new SkinClass();
  138.          engine.canvas.playerContainer.addChild(skin);
  139.          return skin;
  140.       }
  141.       
  142.       private function fix() : void
  143.       {
  144.          var pos:b2Vec2 = body.GetPosition().Copy();
  145.          var shapeDef:b2CircleDef = new b2CircleDef();
  146.          shapeDef.radius = 10 / engine.m_physScale;
  147.          shapeDef.density = 0;
  148.          shapeDef.isSensor = true;
  149.          var bodyDef:b2BodyDef = new b2BodyDef();
  150.          bodyDef.position.Set(pos.x,pos.y);
  151.          var fixBody:b2Body = engine.m_world.CreateBody(bodyDef);
  152.          fixBody.CreateShape(shapeDef);
  153.          fixBody.SetMassFromShapes();
  154.          var rjd:b2RevoluteJointDef = new b2RevoluteJointDef();
  155.          rjd.Initialize(body,fixBody,body.GetWorldCenter());
  156.          engine.m_world.CreateJoint(rjd);
  157.       }
  158.       
  159.       private function preUpdateHandler(e:CoreEvent) : void
  160.       {
  161.          if(!inputEnabled)
  162.          {
  163.             return;
  164.          }
  165.          if(input.isKeyPressed(Input.KEY_LEFT))
  166.          {
  167.             body.ApplyTorque(-torqueMult * torque);
  168.          }
  169.          else if(input.isKeyPressed(Input.KEY_RIGHT))
  170.          {
  171.             body.ApplyTorque(torqueMult * torque);
  172.          }
  173.       }
  174.       
  175.       override protected function createBodyDef() : b2BodyDef
  176.       {
  177.          var bodyDef:b2BodyDef = new b2BodyDef();
  178.          bodyDef.position.Set(platformDef.x / engine.m_physScale,platformDef.y / engine.m_physScale);
  179.          bodyDef.userData = this;
  180.          bodyDef.angularDamping = 5;
  181.          return bodyDef;
  182.       }
  183.       
  184.       private function particleCompleteHandler(particle:Sprite) : void
  185.       {
  186.          particle.parent.removeChild(particle);
  187.       }
  188.       
  189.       override public function destroy(e:CoreEvent = null) : void
  190.       {
  191.          super.destroy(e);
  192.          engine.dispatcher.removeEventListener(CoreEvent.PRE_UPDATE,preUpdateHandler);
  193.          engine.dispatcher.removeEventListener(CoreEvent.UPDATE,updateHandler);
  194.       }
  195.       
  196.       protected function initSounds() : void
  197.       {
  198.          var CollideClass:Class = engine.assets.getAssetClass("SndBallCollide");
  199.          sndCollide = new CollideClass();
  200.       }
  201.       
  202.       override protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef) : b2Body
  203.       {
  204.          var body:b2Body = engine.m_world.CreateBody(bodyDef);
  205.          body.CreateShape(shapeDef);
  206.          body.SetMassFromShapes();
  207.          return body;
  208.       }
  209.       
  210.       private function ballCollide(strength:Number, pos:Point) : void
  211.       {
  212.          var particle:BounceParticle = null;
  213.          var sndTransform:SoundTransform = new SoundTransform(engine.sndTransform.volume);
  214.          sndTransform.volume *= strength;
  215.          engine.sndChannel = sndCollide.play(0,0,sndTransform);
  216.          var ParticleClass:Class = engine.assets.getAssetClass("CollideParticleAsset");
  217.          var particlesNum:Number = Math.round(strength * 5);
  218.          for(var i:uint = 0; i < particlesNum; i++)
  219.          {
  220.             particle = new BounceParticle(pos.x,pos.y);
  221.          }
  222.       }
  223.    }
  224. }
  225.