Coverage Summary for Class: CollisionManager (com.mygdx.game.Managers)
| Class | Class, % | Method, % | Line, % |
|---|---|---|---|
| CollisionManager | 100% (1/1) | 100% (6/6) | 97.6% (40/41) |
1 package com.mygdx.game.Managers; 2 3 import com.badlogic.gdx.physics.box2d.*; 4 import com.mygdx.game.Entitys.Entity; 5 import com.mygdx.game.Physics.CollisionCallBack; 6 import com.mygdx.game.Physics.CollisionInfo; 7 8 /** 9 * Handles collision callbacks for box2d 10 */ 11 public class CollisionManager implements ContactListener { 12 private static boolean initialized = false; 13 14 public CollisionManager() { 15 if (initialized) { 16 throw new RuntimeException("Collision manager cant be instantiated more then once"); 17 } 18 initialized = true; 19 } 20 21 /** 22 * called for every contact that box2d detects prior to collision restitution (doesn't matter if it is a trigger/sensor) 23 * 24 * @param contact the contact data 25 */ 26 @Override 27 public void beginContact(Contact contact) { 28 // generally calls the correct callback on the appropriate objects (not as intuitive as id like though) 29 Fixture fa = contact.getFixtureA(); 30 Body ba = fa.getBody(); 31 Object oa = ba.getUserData(); 32 CollisionCallBack cbA = (CollisionCallBack) oa; 33 34 Fixture fb = contact.getFixtureB(); 35 Body bb = fb.getBody(); 36 Object ob = bb.getUserData(); 37 CollisionCallBack cbB = (CollisionCallBack) ob; 38 39 final CollisionInfo info = new CollisionInfo(fa,fb,ba,bb,(Entity) cbA,(Entity) cbB); 40 41 if (cbA != null) { 42 // fa is sensor but not fb 43 if (fa.isSensor() && cbB != null && !fb.isSensor()) { 44 cbB.EnterTrigger(info); 45 } else { 46 cbA.BeginContact(info); 47 } 48 } 49 50 if (cbB != null) { 51 if (fb.isSensor() && cbA != null && !fa.isSensor()) { 52 cbA.EnterTrigger(info); 53 } else { 54 cbB.BeginContact(info); 55 } 56 } 57 } 58 59 /** 60 * called for every contact that box2d detects after collision restitution (doesn't matter if it is a trigger/sensor) 61 * 62 * @param contact the contact data 63 */ 64 @Override 65 public void endContact(Contact contact) { 66 // generally calls the correct callback on the appropriate objects (not as intuitive as id like though) 67 Fixture fa = contact.getFixtureA(); 68 Body ba = fa.getBody(); 69 Object oa = ba.getUserData(); 70 CollisionCallBack cbA = (CollisionCallBack) oa; 71 72 Fixture fb = contact.getFixtureB(); 73 Body bb = fb.getBody(); 74 Object ob = bb.getUserData(); 75 CollisionCallBack cbB = (CollisionCallBack) ob; 76 77 final CollisionInfo info = new CollisionInfo(fa,fb,ba,bb,(Entity) cbA,(Entity) cbB); 78 79 if (cbA != null) { 80 if (fa.isSensor() && cbB != null && !fb.isSensor()) { 81 cbB.ExitTrigger(info); 82 } else { 83 cbA.EndContact(info); 84 } 85 } 86 87 if (cbB != null) { 88 if (fb.isSensor() && cbA != null && !fa.isSensor()) { 89 cbA.ExitTrigger(info); 90 } else { 91 cbB.EndContact(info); 92 } 93 } 94 } 95 96 @Override 97 public void preSolve(Contact contact, Manifold oldManifold) { 98 99 } 100 101 @Override 102 public void postSolve(Contact contact, ContactImpulse impulse) { 103 104 } 105 }