Coverage Summary for Class: RigidBody (com.mygdx.game.Components)
Class |
Method, %
|
Line, %
|
RigidBody |
92.9%
(13/14)
|
98.3%
(57/58)
|
RigidBody$1 |
100%
(1/1)
|
100%
(1/1)
|
Total |
93.3%
(14/15)
|
98.3%
(58/59)
|
1 package com.mygdx.game.Components;
2
3 import com.badlogic.gdx.math.Vector2;
4 import com.badlogic.gdx.physics.box2d.*;
5 import com.mygdx.game.Managers.PhysicsManager;
6 import com.mygdx.game.Physics.CollisionCallBack;
7 import com.mygdx.game.Physics.PhysicsBodyType;
8
9 /**
10 * Defines parameters related to collisions of sprites.
11 */
12 public class RigidBody extends Component {
13 int bodyId;
14 private final Vector2 halfDim;
15
16 /**
17 * Sets up the base values of the RigidBody component
18 */
19 public RigidBody() {
20 super();
21 type = ComponentType.RigidBody;
22 halfDim = new Vector2();
23 setRequirements(ComponentType.Transform, ComponentType.Renderable);
24 }
25
26 /**
27 * Calls constructor with is trigger false
28 *
29 * @param type defines how it interacts with other objects
30 * @param r used for creating the fixture (aka the collider)
31 * @param t used for positioning and scaling the collider
32 */
33 public RigidBody(PhysicsBodyType type, Renderable r, Transform t) {
34 this(type, r, t, false);
35 }
36
37 /**
38 * Can create body that is trigger or callable
39 *
40 * @param type defines how it interacts with other objects
41 * @param r used for creating the fixture (aka the collider)
42 * @param t used for positioning and scaling the collider
43 * @param isTrigger false allows for collision true doesn't
44 */
45 public RigidBody(PhysicsBodyType type, Renderable r, Transform t, boolean isTrigger) {
46 this();
47 BodyDef def = new BodyDef();
48 switch (type) {
49 case Static:
50 def.type = BodyDef.BodyType.StaticBody;
51 break;
52 case Dynamic:
53 def.type = BodyDef.BodyType.DynamicBody;
54 break;
55 case Kinematic:
56 def.type = BodyDef.BodyType.KinematicBody;
57 break;
58 }
59 float h_x = r.sprite.getWidth() * 0.5f;
60 float h_y = r.sprite.getHeight() * 0.5f;
61 halfDim.set(h_x, h_y);
62
63 def.position.set(t.getPosition().x, t.getPosition().y); //Removed halfDim addition for Assessment 2
64 h_x *= t.getScale().x;
65 h_y *= t.getScale().y;
66
67 def.angle = t.getRotation();
68
69 PolygonShape shape = new PolygonShape();
70 shape.setAsBox(h_x, h_y);
71
72 FixtureDef f = new FixtureDef();
73 f.isSensor = isTrigger;
74 f.shape = shape;
75 f.density = type == PhysicsBodyType.Static ? 0.0f : 1.0f;
76 f.restitution = 0; // prevents bouncing
77 f.friction = 0;
78
79 bodyId = PhysicsManager.createBody(def, f, null);
80
81 shape.dispose();
82 }
83
84 /**
85 * Adds a new circular fixture to the body as a trigger
86 */
87 public void addTrigger(float radius, Object data) {
88 Body b = getBody();
89
90 FixtureDef fDef = new FixtureDef();
91 fDef.isSensor = true;
92 CircleShape shape = new CircleShape();
93 shape.setRadius(radius);
94
95 fDef.shape = shape;
96
97 fDef.density = 0.0f;
98 fDef.restitution = 0.0f;
99 fDef.friction = 0.0f;
100
101 Fixture f = b.createFixture(fDef);
102 f.setUserData(data);
103 }
104
105 /**
106 * Is used during collision phase to add more functionality
107 * @param data class that inherits from CollisionCallBack
108 */
109 public void setCallback(CollisionCallBack data) {
110 getBody().setUserData(data);
111 }
112
113 public void setVelocity(Vector2 vel) {
114 Body b = PhysicsManager.getBody(bodyId);
115 b.setLinearVelocity(vel);
116 }
117
118 public void setVelocity(float x, float y) {
119 setVelocity(new Vector2(x, y));
120 }
121
122 /**
123 * Sets the center pos of the object
124 */
125 public void setPosition(Vector2 position) {
126 Body b = PhysicsManager.getBody(bodyId);
127 /* Removed in Assessment 2
128 if (offset) {
129 position.add(halfDim);
130 }
131 */
132 b.setTransform(position, 0);
133 }
134
135 /**
136 * Gets the current player position.
137 * // Change for Assessment 2 //
138 * @return player position.
139 */
140 public Vector2 getPosition(){
141 Body b = getBody();
142 return b.getTransform().getPosition();
143 }
144
145 /**
146 * @return the Body of this object
147 */
148 public Body getBody() {
149 return PhysicsManager.getBody(bodyId);
150 }
151
152 /**
153 * Called every frame translates the transform to match with the box2d body's position factoring offset
154 */
155 @Override
156 public void update() {
157 super.update();
158 // parent.getComponent(Transform.class).setPosition(PhysicsManager.getBody(bodyId).getPosition());
159 Transform t = parent.getComponent(Transform.class);
160 Body b = getBody();
161 Vector2 p = b.getPosition().cpy();
162 //p.sub(halfDim); //Removed in Assessment 2
163 t.setPosition(p, false);
164 }
165
166 /**
167 * @return the Linear Velocity of this object
168 */
169 public Vector2 getVelocity() {
170 return getBody().getLinearVelocity();
171 }
172
173 /**
174 * @return the Angular Velocity of this object
175 */
176 public float getAngularVelocity() {
177 return getBody().getAngularVelocity();
178 }
179
180 /**
181 * @param force the force to apply to the center of the object
182 */
183 public void applyForce(Vector2 force) {
184 getBody().applyForceToCenter(force, true);
185 }
186 }