home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Diversos / Beez.swf / scripts / Box2D / Dynamics / Contacts / b2CircleContact.as next >
Encoding:
Text File  |  2008-09-03  |  4.3 KB  |  123 lines

  1. package Box2D.Dynamics.Contacts
  2. {
  3.    import Box2D.Collision.Shapes.b2CircleShape;
  4.    import Box2D.Collision.Shapes.b2Shape;
  5.    import Box2D.Collision.b2Collision;
  6.    import Box2D.Collision.b2ContactPoint;
  7.    import Box2D.Collision.b2Manifold;
  8.    import Box2D.Collision.b2ManifoldPoint;
  9.    import Box2D.Common.Math.b2Vec2;
  10.    import Box2D.Dynamics.b2Body;
  11.    import Box2D.Dynamics.b2ContactListener;
  12.    
  13.    public class b2CircleContact extends b2Contact
  14.    {
  15.       
  16.       private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
  17.        
  18.       
  19.       private var m_manifolds:Array;
  20.       
  21.       public var m_manifold:b2Manifold;
  22.       
  23.       private var m0:b2Manifold;
  24.       
  25.       public function b2CircleContact(shape1:b2Shape, shape2:b2Shape)
  26.       {
  27.          m_manifolds = [new b2Manifold()];
  28.          m0 = new b2Manifold();
  29.          super(shape1,shape2);
  30.          m_manifold = m_manifolds[0];
  31.          m_manifold.pointCount = 0;
  32.          var point:b2ManifoldPoint = m_manifold.points[0];
  33.          point.normalImpulse = 0;
  34.          point.tangentImpulse = 0;
  35.       }
  36.       
  37.       public static function Destroy(contact:b2Contact, allocator:*) : void
  38.       {
  39.       }
  40.       
  41.       public static function Create(shape1:b2Shape, shape2:b2Shape, allocator:*) : b2Contact
  42.       {
  43.          return new b2CircleContact(shape1,shape2);
  44.       }
  45.       
  46.       override public function Evaluate(listener:b2ContactListener) : void
  47.       {
  48.          var v1:b2Vec2 = null;
  49.          var v2:b2Vec2 = null;
  50.          var mp0:b2ManifoldPoint = null;
  51.          var mp:b2ManifoldPoint = null;
  52.          var b1:b2Body = m_shape1.m_body;
  53.          var b2:b2Body = m_shape2.m_body;
  54.          m0.Set(m_manifold);
  55.          b2Collision.b2CollideCircles(m_manifold,m_shape1 as b2CircleShape,b1.m_xf,m_shape2 as b2CircleShape,b2.m_xf);
  56.          var cp:b2ContactPoint = s_evalCP;
  57.          cp.shape1 = m_shape1;
  58.          cp.shape2 = m_shape2;
  59.          cp.friction = m_friction;
  60.          cp.restitution = m_restitution;
  61.          if(m_manifold.pointCount > 0)
  62.          {
  63.             m_manifoldCount = 1;
  64.             mp = m_manifold.points[0];
  65.             if(m0.pointCount == 0)
  66.             {
  67.                mp.normalImpulse = 0;
  68.                mp.tangentImpulse = 0;
  69.                if(listener)
  70.                {
  71.                   cp.position = b1.GetWorldPoint(mp.localPoint1);
  72.                   v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
  73.                   v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
  74.                   cp.velocity.Set(v2.x - v1.x,v2.y - v1.y);
  75.                   cp.normal.SetV(m_manifold.normal);
  76.                   cp.separation = mp.separation;
  77.                   cp.id.key = mp.id._key;
  78.                   listener.Add(cp);
  79.                }
  80.             }
  81.             else
  82.             {
  83.                mp0 = m0.points[0];
  84.                mp.normalImpulse = mp0.normalImpulse;
  85.                mp.tangentImpulse = mp0.tangentImpulse;
  86.                if(listener)
  87.                {
  88.                   cp.position = b1.GetWorldPoint(mp.localPoint1);
  89.                   v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
  90.                   v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
  91.                   cp.velocity.Set(v2.x - v1.x,v2.y - v1.y);
  92.                   cp.normal.SetV(m_manifold.normal);
  93.                   cp.separation = mp.separation;
  94.                   cp.id.key = mp.id._key;
  95.                   listener.Persist(cp);
  96.                }
  97.             }
  98.          }
  99.          else
  100.          {
  101.             m_manifoldCount = 0;
  102.             if(m0.pointCount > 0 && Boolean(listener))
  103.             {
  104.                mp0 = m0.points[0];
  105.                cp.position = b1.GetWorldPoint(mp0.localPoint1);
  106.                v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1);
  107.                v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2);
  108.                cp.velocity.Set(v2.x - v1.x,v2.y - v1.y);
  109.                cp.normal.SetV(m0.normal);
  110.                cp.separation = mp0.separation;
  111.                cp.id.key = mp0.id._key;
  112.                listener.Remove(cp);
  113.             }
  114.          }
  115.       }
  116.       
  117.       override public function GetManifolds() : Array
  118.       {
  119.          return m_manifolds;
  120.       }
  121.    }
  122. }
  123.