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 }