package com.igorcrevar.goingunder.collision;
import java.util.ArrayList;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.igorcrevar.goingunder.GameData;
import com.igorcrevar.goingunder.objects.Player;
import com.igorcrevar.goingunder.objects.obstacles.ObstacleObject;
public class CollisionResolver {
private float deltaTimeCollisionOccured;
private BoundingBox[] obstacleBoundingBoxes = new BoundingBox[20];
private int currentNumberOfObstacleBBs = 0;
private BoundingBox obstacleBoundingBox = new BoundingBox();
//private BoundingBox playerBoundingBox = new BoundingBox(0.0282f, -0.161f, 0.752f, 0.252f, 0.0f);
private BoundingBox playerBoundingBox = new BoundingBox(0.0f, -0.25f, 0.92f, 0.25f, 0.0f);
private BoundingSphere playerBoundingSphere = new BoundingSphere(0.0f, 0.08f, 0.3f);
private BoundingSphere playerBoundingSphere2 = new BoundingSphere(0.0f, -0.3f, 0.2f);
public CollisionResolver() {
for (int i = 0; i < obstacleBoundingBoxes.length; ++i) {
obstacleBoundingBoxes[i] = new BoundingBox();
}
}
public void draw(ShapeRenderer shapeRenderer, BoundingBox aabb, GameData gameData) {
Vector2[] t = aabb.getVertices();
shapeRenderer.setColor(1, 1, 1, 1);
for (int i = 0; i < 4; ++i) {
Vector2 a = t[i];
Vector2 b = t[i < 3 ? i + 1 : 0];
shapeRenderer.line(a.x, a.y - gameData.CameraYPosition, b.x, b.y - gameData.CameraYPosition);
}
}
public void draw(ShapeRenderer shapeRenderer, BoundingSphere aabb, GameData gameData) {
shapeRenderer.setColor(1, 1, 1, 1);
shapeRenderer.circle(aabb.getCenter().x, aabb.getCenter().y - gameData.CameraYPosition, aabb.getRadius(), 60);
}
public void draw(ShapeRenderer shapeRenderer, GameData gameData) {
draw(shapeRenderer, playerBoundingBox, gameData);
draw(shapeRenderer, playerBoundingSphere, gameData);
draw(shapeRenderer, playerBoundingSphere2, gameData);
for (int i = 0; i < currentNumberOfObstacleBBs; ++i) {
draw(shapeRenderer, obstacleBoundingBoxes[i], gameData);
}
}
public boolean detect(Player player, ArrayList<ObstacleObject> obstacles) {
// update bounding boxes
playerBoundingBox.update(player.getX(), player.getY(), player.getAngle());
playerBoundingSphere.update(player.getX(), player.getY(), player.getAngle());
playerBoundingSphere2.update(player.getX(), player.getY(), player.getAngle());
// just for debug
/*currentNumberOfObstacleBBs = 0;
for (ObstacleObject oo : obstacles) {
for (int i = 0; i < oo.getPartsCount(); ++i) {
Rectangle r = oo.getBoundRectangle(i);
obstacleBoundingBoxes[currentNumberOfObstacleBBs++].populateFromRectangle(r);
}
}*/
// end just for debug
Rectangle playerRect = player.getBoundingRectangle();
for (int i = obstacles.size() - 1; i >= 0; --i) {
ObstacleObject obstacle = obstacles.get(i);
// detect intersection
for (int j = 0; j < obstacle.getPartsCount(); ++j) {
Rectangle r = obstacle.getBoundRectangle(j);
if (r.overlaps(playerRect)) {
obstacleBoundingBox.populateFromRectangle(r);
return CollisionHelper.intersect(playerBoundingBox, obstacleBoundingBox) ||
CollisionHelper.intersect(playerBoundingSphere, obstacleBoundingBox) ||
CollisionHelper.intersect(playerBoundingSphere2, obstacleBoundingBox);
}
}
}
return false;
}
public float getDeltaTime() {
return deltaTimeCollisionOccured;
}
}