예제 #1
0
 private void PostSolveHandler(Contact contact, ContactConstraint impulse)
 {
     var gob1 = ((CollisionArea)contact.FixtureA.UserData).Owner;
     var gob2 = ((CollisionArea)contact.FixtureB.UserData).Owner;
     var eventKey = new CollisionEventKey(gob1, gob2);
     var previousMaxImpulse = 0f;
     _collisionImpulses.TryGetValue(eventKey, out previousMaxImpulse);
     _collisionImpulses[eventKey] = Math.Max(previousMaxImpulse, impulse.Points.Take(impulse.PointCount).Max(p => p.NormalImpulse));
 }
예제 #2
0
 private bool BeginContactHandler(Contact contact)
 {
     var areaA = (CollisionArea)contact.FixtureA.UserData;
     var areaB = (CollisionArea)contact.FixtureB.UserData;
     if (areaA.Owner.Owner == areaB.Owner.Owner && (areaA.Owner.Cold || areaB.Owner.Cold)) return false;
     // Remember which gobs collided.
     var eventKey = new CollisionEventKey(areaA.Owner, areaB.Owner);
     CollisionEvent collisionEvent = null;
     if (!_collisionEvents.TryGetValue(eventKey, out collisionEvent))
     {
         collisionEvent = new CollisionEvent { SkipIrreversibleSideEffects = Game.NetworkMode == NetworkMode.Client };
         _collisionEvents.Add(eventKey, collisionEvent);
     }
     collisionEvent.SetCollisionAreas(areaA, areaB);
     return true;
 }