Coverage Summary for Class: PhysicsManager (com.mygdx.game.Managers)

Class Class, % Method, % Line, %
PhysicsManager 100% (1/1) 50% (6/12) 37.3% (19/51)


1 package com.mygdx.game.Managers; 2  3 import com.badlogic.gdx.maps.MapLayer; 4 import com.badlogic.gdx.maps.MapLayers; 5 import com.badlogic.gdx.maps.MapObject; 6 import com.badlogic.gdx.maps.MapObjects; 7 import com.badlogic.gdx.maps.objects.RectangleMapObject; 8 import com.badlogic.gdx.math.Rectangle; 9 import com.badlogic.gdx.math.Vector2; 10 import com.badlogic.gdx.physics.box2d.*; 11 import com.mygdx.game.Components.TileMap; 12  13 import java.util.ArrayList; 14 import java.util.Objects; 15  16 import static com.mygdx.utils.Constants.PHYSICS_TIME_STEP; 17  18 /** 19  * Manages the box2D world and bodies for the collision detection and physics 20  */ 21 public final class PhysicsManager { 22  private static final float TILE_SIZE_INV = 1.0f; 23  public static boolean initialized = false; 24  public static World box2DWorld; 25  private static ArrayList<Body> box2DBodies; 26  private static Box2DDebugRenderer debug; 27  28  public static void Initialize() { 29  Initialize(false); 30  } 31  32  /** 33  * Draw the box2D world with debug borders shown. 34  * 35  * @param drawDebug true to show debug borders 36  */ 37  public static void Initialize(boolean drawDebug) { 38  if (initialized) { 39  return; 40  } 41  initialized = true; 42  43  box2DWorld = new World(new Vector2(0, 0), true); 44  box2DBodies = new ArrayList<>(); 45  box2DWorld.setContactListener(new CollisionManager()); 46  if (drawDebug) { 47  debug = new Box2DDebugRenderer(true, false, true, true, false, true); 48  } 49  } 50  51  public static int createBody(BodyDef bDef, FixtureDef fDef, Object userData) { 52  tryInit(); 53  bDef.fixedRotation = true; 54  Body b = box2DWorld.createBody(bDef); 55  b.createFixture(fDef); 56  b.setUserData(userData); 57  box2DBodies.add(b); 58  return box2DBodies.size(); 59  } 60  61  private static Shape tile_getShape(Rectangle rectangle) { 62  PolygonShape polygonShape = new PolygonShape(); 63  polygonShape.setAsBox( 64  rectangle.width * 0.5f * TILE_SIZE_INV, 65  rectangle.height * 0.5f * TILE_SIZE_INV); 66  return polygonShape; 67  } 68  69  private static Vector2 tile_getCenter(Rectangle rectangle) { 70  Vector2 center = new Vector2(); 71  rectangle.getCenter(center); 72  return center.scl(TILE_SIZE_INV); 73  } 74  75  /** 76  * Populates the map with box2D bodies necessary for collisions to happen. 77  * @param map tilemap we are operating on 78  */ 79  public static void createMapCollision(TileMap map) { 80  MapLayers layers = map.getTileMap().getLayers(); 81  MapObjects objects = null; 82  for (MapLayer layer : layers) { 83  if (Objects.equals(layer.getName(), "Objects")) { 84  objects = layer.getObjects(); 85  break; 86  } 87  } 88  if (objects == null) { 89  return; 90  } 91  92  for (MapObject object : objects) { 93  Rectangle rectangle = ((RectangleMapObject) object).getRectangle(); 94  95  //create a dynamic within the world body (also can be KinematicBody or StaticBody 96  BodyDef bodyDef = new BodyDef(); 97  bodyDef.type = BodyDef.BodyType.StaticBody; 98  Body body = box2DWorld.createBody(bodyDef); 99  100  //create a fixture for each body from the shape 101  Fixture fixture = body.createFixture(tile_getShape(rectangle), 1); 102  fixture.setFriction(0.1f); 103  104  //setting the position of the body's origin. In this case with zero rotation 105  body.setTransform(tile_getCenter(rectangle), 0); 106  } 107  } 108  109  public static Body getBody(int id) { 110  return box2DBodies.get(id - 1); 111  } 112  113  private static void tryInit() { 114  if (!initialized) { 115  Initialize(); 116  } 117  } 118  119  public static void update() { 120  tryInit(); 121  box2DWorld.step(PHYSICS_TIME_STEP, 6, 2); 122  123  if (debug != null) { 124  debug.render(box2DWorld, RenderingManager.getCamera().combined); 125  } 126  } 127  128  public static void cleanUp() { 129  tryInit(); 130  box2DWorld.dispose(); 131  if (debug != null) { 132  debug.dispose(); 133  } 134  } 135 }