From 69f784b91373cf559494964965368162a419e5a7 Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Sun, 13 Dec 2020 15:57:39 +0100 Subject: [PATCH] better collision --- src/main/java/core/Master.java | 19 +++++++++--------- src/main/java/core/physics/Collidable.java | 1 - src/main/java/core/physics/Collision.java | 13 +++--------- .../java/core/physics/hitboxes/Hitbox.java | 3 +++ src/main/java/objects/GameObject.java | 2 +- src/main/java/objects/ships/Submarine.java | 5 ----- src/main/java/objects/world/Wall.java | 5 ----- target/classes/core/Master.class | Bin 6398 -> 6534 bytes 8 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java index 516228c..9210a39 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/Master.java @@ -2,6 +2,7 @@ package core; import core.math.Vector2D; import core.physics.Collidable; +import core.physics.Collision; import objects.DebugPos; import objects.ships.BattleShip; import objects.GameObject; @@ -217,21 +218,19 @@ public class Master extends JPanel { /** * 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 */ - @Deprecated - //TODO make it return a Collision - public boolean doesCollide(Collidable col) { - boolean collides = false; + public Collision doesCollide(Collidable collidable) { + Collision collides = null; - for (Collidable c : collidables) { - double distance = Vector2D.distance(c.getCenterPos(), col.getCenterPos()); + for (Collidable other : collidables) { + 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)) { - collides = true; + if (other.getHitbox().collidesWith(collidable.getHitbox())) { + collides = new Collision(collidable, other); } } } diff --git a/src/main/java/core/physics/Collidable.java b/src/main/java/core/physics/Collidable.java index e1e173c..91f153c 100644 --- a/src/main/java/core/physics/Collidable.java +++ b/src/main/java/core/physics/Collidable.java @@ -5,7 +5,6 @@ import core.physics.hitboxes.Hitbox; public interface Collidable { - boolean collidesWith(Collidable o); Hitbox getHitbox(); Vector2D getCenterPos(); Vector2D getSize(); diff --git a/src/main/java/core/physics/Collision.java b/src/main/java/core/physics/Collision.java index 491755d..7e9a286 100644 --- a/src/main/java/core/physics/Collision.java +++ b/src/main/java/core/physics/Collision.java @@ -5,15 +5,12 @@ package core.physics; */ public class Collision { - Collidable a; - Collidable b; + private final Collidable a; + private final Collidable b; - boolean haveCollided; - - public Collision(Collidable a, Collidable b, boolean haveCollided) { + public Collision(Collidable a, Collidable b) { this.a = a; this.b = b; - this.haveCollided = haveCollided; } /** @@ -31,8 +28,4 @@ public class Collision { public Collidable getB() { return b; } - - public boolean isHaveCollided() { - return haveCollided; - } } diff --git a/src/main/java/core/physics/hitboxes/Hitbox.java b/src/main/java/core/physics/hitboxes/Hitbox.java index 14f6028..00eb65f 100644 --- a/src/main/java/core/physics/hitboxes/Hitbox.java +++ b/src/main/java/core/physics/hitboxes/Hitbox.java @@ -2,6 +2,7 @@ package core.physics.hitboxes; import core.Drawable; import core.math.Vector2D; +import core.physics.Collision; public abstract class Hitbox implements Drawable { @@ -15,6 +16,8 @@ public abstract class Hitbox implements Drawable { public abstract double getSize(); + public abstract boolean collidesWith(Hitbox other); + @Override public String toString() { return super.toString(); diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/GameObject.java index 1d3320b..bddab07 100644 --- a/src/main/java/objects/GameObject.java +++ b/src/main/java/objects/GameObject.java @@ -58,7 +58,7 @@ public abstract class GameObject implements Drawable { if (this instanceof Collidable) { ((Collidable) this).getHitbox().moveTo(position, size); - if (master.doesCollide((Collidable) this)) { + if (master.doesCollide((Collidable) this) != null) { this.position = oldPos; ((Collidable) this).getHitbox().moveTo(oldPos, size); } diff --git a/src/main/java/objects/ships/Submarine.java b/src/main/java/objects/ships/Submarine.java index 57178a8..1bd26ff 100644 --- a/src/main/java/objects/ships/Submarine.java +++ b/src/main/java/objects/ships/Submarine.java @@ -33,11 +33,6 @@ public class Submarine extends GameObject implements Collidable { moveTo(centerRelPos); } - @Override - public boolean collidesWith(Collidable o) { - return hitbox.collidesWith(o.getHitbox()); - } - @Override public Hitbox getHitbox() { return hitbox; diff --git a/src/main/java/objects/world/Wall.java b/src/main/java/objects/world/Wall.java index c42ea97..77162ad 100644 --- a/src/main/java/objects/world/Wall.java +++ b/src/main/java/objects/world/Wall.java @@ -26,11 +26,6 @@ public class Wall extends GameObject implements Collidable { public void update() { } - @Override - public boolean collidesWith(Collidable o) { - return this.hitbox.collidesWith(o.getHitbox()); - } - @Override public Hitbox getHitbox() { return hitbox; diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index 6f26be7c64a186cbceb34b8cbb53a6e858510851..b8ddd114d809a1e2dc42e5bd0e45668d9128fa50 100644 GIT binary patch delta 2140 zcmexo*k;Ui>ff$?3=9lbi~$?D9&#{qG2EE^jzfY;QDgE%4mlmoD0YTNj0|GQ`9-Pv z1sRpanaRca&iOexnZ=p;d0Y$+8J_SkurfSlWH8m3Y|SGH!s?n~TnvH?&v_VLFsLvx zuob1|=9i@kF)%R{ax=VUc*D-{mWSaT!~4k|oc3&=c^JMheBIp3xsr*=7;J>1rVn=8 ztQi?t^Gh;PizZv}$Qf`YgItl4n3R*s$iM;Nq!u$WNZ`;tc^S_;K4UIM6Gl^ZMl&8p zb4H8Ji+EWW8LcMkGKvd@@v|}7a4~Q&+VU`JFlq`g+E2c~C#T`a#juFciHFgdfsK)Y zt+XH|u_RT1L7ShA(G8^7orh7IQAdE$bFvt}8l%r-TYfDTKSl<*$qxK-lRNpvV!tqa zWnf^CWcbGLm4T7rI|Bm)6T=S%E(U%E0R{#JAqFu9aRx?)Utsay3_=VFNc=wxLJYD< z{J#uB3{pt^-;@9FD>MF^tRQf_{yzf)gA>?H4+a(nI|fb$PX=BFZw3hl9|mOxUj{t} zKL$$%e+CbRK!#w35QaF0P=->5NQNqgD29557>0Qau?$-o;uski7#I{7m>C!twlOk- z&5L7*U}R!sW?*C}WpHFXZ#lXbK4YHMiNlTQ0k)aA|OMsA!CCC;& zuqUb+SQ%;S17I=mnd_15pJvi;+

l=> zT#TZOVqp8U7*>Fcn7mNLBm|^WjDeMbfng^DC&MlV0fyZSG7NhelonSoJ;fstV?!#c3Rnxb*wU{Pb>WME)8$-u&Jnt_kuJcAU&1qL~W ziwx=vml(_#E;86KTx0NIxDK|+gn^YokwKbKf+3ZGg@J*=7jC65qa>pgI3j%+r9oCQ zNHG{Q$}prdFoTmNHv==@Uj`vY#$OCl42+DjjB*T&3<{uR@`Hhmft`VYp_tKEYYT() zHio@^x;q&TGBV6$NSv%Drc`e&!79nJli@NW!#0NN+Av1)j5!R7P;r>x-I)x0yBQuv zYD=w^>Uq%&%I8b<_C8RX;g!B($D%t4UH4b4y4B#xu!?~RoP%|> zwlIijZ)12CuC;|hPJ0`}!fgyY4=@OVg|rVctenZf1BwMOACzU88Ni7IlKOr!a5DU2 zkYV`Epv>@xL5JZV*j7jy)`f?SE~7dq4TGbdnSoJ9fD2TCKz(5kbqKe%)-HyZ3=G>C zNff$?3=9lbj6NH=9&#{qGpwBajzfY`W^y2>l)7dV7lR3``7#+zihcp0hK&;9+>l@M`jEPJ6a@JPhv{K5YKLxsr*MF`1D;a&k7O zWDp|*b8>zTBLhcreojtiN@_791D8u`K~ZXQVo7QWBZFj6XI2k+`cp1DHBpAFIlo@;&^cZ{@EE)V5 zJQxBPf*FDt;uu00N*N*;su&^}>KURL<}t)DY-NaL_|3q;puoV)z`(GL;SbonIEDy@ zzYPBv7#T_#92x#I{9|BZ;ACWAWMp7u_{qS)Aj81Oz@Wsyz`(MJfp-G~0|O%i$T4gn zVTJ?-CWbnOYLL>&tU~FDAQ>eF4h9B>ECxY_Yz9e&90o0hJO(3%dD zvIgmsVgUJX5(5vzWCme|DGc%qQyEkkrZH$ROh+tU}xlIlip0)`QhUY~g~cXJFuB6krqt*}|a3umY@8PShj>q*IK6m4Sg_2LmU= zP6h#nT?{e|dl-}$_JK`-BtvDmDaue&7#Nfpg&0zy@z2b_2ugu#8PeBoC5GKw&Q5*Gu5FQXX9N(LzgV@7d?R0d{n;^Ssu=KISa#K`!IL5hKqQG($C z12cmHC^0-`U}IosU|>jMw$<9gAia%Yub=KthJ%a@GZ_LVFBVg(*OFkBWZB7ZnUP@| z!*y*KBYDOg1_4PH?VSvFnHXj=u(H@L|G!pd4FdxMGdNd4^3Ed$CWa>ratu!y3>cm> z1Teg0h-P@j5XP26x<994Eo@B zWnf^{+QN_qawrqnp^)VB3G5iOutEOy$9W!oa{T z!ti=C!&{I+$VIXw12dyGgEa#K6Qd5JE~L0;)MH>~G-Whrw1Tp17#*N2M@AP$HwFd< PE(S(McScV}Zw5&KOlDH+