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 }