better collision

This commit is contained in:
nora 2020-12-13 15:57:39 +01:00
parent 90c5950e0b
commit 69f784b913
8 changed files with 16 additions and 32 deletions

View file

@ -2,6 +2,7 @@ package core;
import core.math.Vector2D; import core.math.Vector2D;
import core.physics.Collidable; import core.physics.Collidable;
import core.physics.Collision;
import objects.DebugPos; import objects.DebugPos;
import objects.ships.BattleShip; import objects.ships.BattleShip;
import objects.GameObject; import objects.GameObject;
@ -217,21 +218,19 @@ public class Master extends JPanel {
/** /**
* Check whether a collidables collide with another one * Check whether a collidables collide with another one
* *
* @param col The collidable to be checked * @param collidable The collidable to be checked
* @return True if it collides with something, false if it doesn't - Should return a Collision * @return True if it collides with something, false if it doesn't - Should return a Collision
*/ */
@Deprecated public Collision doesCollide(Collidable collidable) {
//TODO make it return a Collision Collision collides = null;
public boolean doesCollide(Collidable col) {
boolean collides = false;
for (Collidable c : collidables) { for (Collidable other : collidables) {
double distance = Vector2D.distance(c.getCenterPos(), col.getCenterPos()); double distance = Vector2D.distance(other.getCenterPos(), collidable.getCenterPos());
if (c != col && (distance < c.getHitbox().getSize() + col.getHitbox().getSize())) { if (other != collidable && (distance < other.getHitbox().getSize() + collidable.getHitbox().getSize())) {
if (c.collidesWith(col)) { if (other.getHitbox().collidesWith(collidable.getHitbox())) {
collides = true; collides = new Collision(collidable, other);
} }
} }
} }

View file

@ -5,7 +5,6 @@ import core.physics.hitboxes.Hitbox;
public interface Collidable { public interface Collidable {
boolean collidesWith(Collidable o);
Hitbox getHitbox(); Hitbox getHitbox();
Vector2D getCenterPos(); Vector2D getCenterPos();
Vector2D getSize(); Vector2D getSize();

View file

@ -5,15 +5,12 @@ package core.physics;
*/ */
public class Collision { public class Collision {
Collidable a; private final Collidable a;
Collidable b; private final Collidable b;
boolean haveCollided; public Collision(Collidable a, Collidable b) {
public Collision(Collidable a, Collidable b, boolean haveCollided) {
this.a = a; this.a = a;
this.b = b; this.b = b;
this.haveCollided = haveCollided;
} }
/** /**
@ -31,8 +28,4 @@ public class Collision {
public Collidable getB() { public Collidable getB() {
return b; return b;
} }
public boolean isHaveCollided() {
return haveCollided;
}
} }

View file

@ -2,6 +2,7 @@ package core.physics.hitboxes;
import core.Drawable; import core.Drawable;
import core.math.Vector2D; import core.math.Vector2D;
import core.physics.Collision;
public abstract class Hitbox implements Drawable { public abstract class Hitbox implements Drawable {
@ -15,6 +16,8 @@ public abstract class Hitbox implements Drawable {
public abstract double getSize(); public abstract double getSize();
public abstract boolean collidesWith(Hitbox other);
@Override @Override
public String toString() { public String toString() {
return super.toString(); return super.toString();

View file

@ -58,7 +58,7 @@ public abstract class GameObject implements Drawable {
if (this instanceof Collidable) { if (this instanceof Collidable) {
((Collidable) this).getHitbox().moveTo(position, size); ((Collidable) this).getHitbox().moveTo(position, size);
if (master.doesCollide((Collidable) this)) { if (master.doesCollide((Collidable) this) != null) {
this.position = oldPos; this.position = oldPos;
((Collidable) this).getHitbox().moveTo(oldPos, size); ((Collidable) this).getHitbox().moveTo(oldPos, size);
} }

View file

@ -33,11 +33,6 @@ public class Submarine extends GameObject implements Collidable {
moveTo(centerRelPos); moveTo(centerRelPos);
} }
@Override
public boolean collidesWith(Collidable o) {
return hitbox.collidesWith(o.getHitbox());
}
@Override @Override
public Hitbox getHitbox() { public Hitbox getHitbox() {
return hitbox; return hitbox;

View file

@ -26,11 +26,6 @@ public class Wall extends GameObject implements Collidable {
public void update() { public void update() {
} }
@Override
public boolean collidesWith(Collidable o) {
return this.hitbox.collidesWith(o.getHitbox());
}
@Override @Override
public Hitbox getHitbox() { public Hitbox getHitbox() {
return hitbox; return hitbox;

Binary file not shown.