From 435de55eb114684c98b3f57cd24b31626e9a18ee Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Sun, 13 Dec 2020 16:14:08 +0100 Subject: [PATCH] Better collidable implementation --- src/main/java/core/Master.java | 3 +- src/main/java/objects/DebugPos.java | 1 + .../java/objects/core/CollGameObject.java | 56 ++++++++++++++++++ .../java/objects/{ => core}/GameObject.java | 11 +--- src/main/java/objects/ships/BattleShip.java | 2 +- src/main/java/objects/ships/Shell.java | 13 ++-- src/main/java/objects/ships/Submarine.java | 25 +------- src/main/java/objects/ships/Turret.java | 2 +- src/main/java/objects/world/Grid.java | 3 +- src/main/java/objects/world/Wall.java | 10 +--- target/classes/core/Master.class | Bin 6534 -> 6559 bytes target/classes/objects/GameObject.class | Bin 3312 -> 0 bytes 12 files changed, 77 insertions(+), 49 deletions(-) create mode 100644 src/main/java/objects/core/CollGameObject.java rename src/main/java/objects/{ => core}/GameObject.java (91%) delete mode 100644 target/classes/objects/GameObject.class diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java index 9210a39..0b765c8 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/Master.java @@ -5,7 +5,7 @@ import core.physics.Collidable; import core.physics.Collision; import objects.DebugPos; import objects.ships.BattleShip; -import objects.GameObject; +import objects.core.GameObject; import objects.ships.Submarine; import objects.world.Grid; import objects.world.Wall; @@ -13,7 +13,6 @@ import objects.world.Wall; import javax.swing.*; import java.awt.*; import java.util.ArrayList; -import java.util.concurrent.atomic.AtomicBoolean; /** * The main object that controls everything diff --git a/src/main/java/objects/DebugPos.java b/src/main/java/objects/DebugPos.java index 20f888f..9775791 100644 --- a/src/main/java/objects/DebugPos.java +++ b/src/main/java/objects/DebugPos.java @@ -1,6 +1,7 @@ package objects; import core.math.Vector2D; +import objects.core.GameObject; import java.awt.*; diff --git a/src/main/java/objects/core/CollGameObject.java b/src/main/java/objects/core/CollGameObject.java new file mode 100644 index 0000000..38c2c8a --- /dev/null +++ b/src/main/java/objects/core/CollGameObject.java @@ -0,0 +1,56 @@ +package objects.core; + +import core.math.Vector2D; +import core.physics.Collidable; +import core.physics.hitboxes.Hitbox; + +/** + * A specialization of GameObject with Collidable properties + */ +public abstract class CollGameObject extends GameObject implements Collidable { + + protected Hitbox hitbox; + + public CollGameObject(Vector2D position, Vector2D size, Hitbox hitbox) { + super(position, size); + this.hitbox = hitbox; + } + + public CollGameObject(double x, double y, double xSize, double ySize, Hitbox hitbox) { + super(x, y, xSize, ySize); + this.hitbox = hitbox; + } + + /** + * A simple method to move the object to a Vector2D. This method should be called instead of doing it manually. + * Does not move if it encounters a collision + * + * @param target The target position + */ + @Override + public void moveTo(Vector2D target) { + Vector2D oldPos = position.copy(); + this.position = target; + + ((Collidable) this).getHitbox().moveTo(position, size); + if (master.doesCollide(this) != null) { + this.position = oldPos; + ((Collidable) this).getHitbox().moveTo(oldPos, size); + } + } + + @Override + public Hitbox getHitbox() { + return hitbox; + } + + @Override + public Vector2D getCenterPos() { + return getCenterPosition(); + } + + @Override + public Vector2D getSize() { + return size; + } +} diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/core/GameObject.java similarity index 91% rename from src/main/java/objects/GameObject.java rename to src/main/java/objects/core/GameObject.java index bddab07..3327e03 100644 --- a/src/main/java/objects/GameObject.java +++ b/src/main/java/objects/core/GameObject.java @@ -1,4 +1,4 @@ -package objects; +package objects.core; import core.math.Coords; import core.Drawable; @@ -53,16 +53,7 @@ public abstract class GameObject implements Drawable { * @param target The target position */ public void moveTo(Vector2D target) { - Vector2D oldPos = position.copy(); this.position = target; - - if (this instanceof Collidable) { - ((Collidable) this).getHitbox().moveTo(position, size); - if (master.doesCollide((Collidable) this) != null) { - this.position = oldPos; - ((Collidable) this).getHitbox().moveTo(oldPos, size); - } - } } /** diff --git a/src/main/java/objects/ships/BattleShip.java b/src/main/java/objects/ships/BattleShip.java index 1356515..4799aeb 100644 --- a/src/main/java/objects/ships/BattleShip.java +++ b/src/main/java/objects/ships/BattleShip.java @@ -1,6 +1,6 @@ package objects.ships; -import objects.GameObject; +import objects.core.GameObject; import java.awt.*; import java.util.ArrayList; diff --git a/src/main/java/objects/ships/Shell.java b/src/main/java/objects/ships/Shell.java index 14f466d..cf2ded7 100644 --- a/src/main/java/objects/ships/Shell.java +++ b/src/main/java/objects/ships/Shell.java @@ -1,15 +1,20 @@ package objects.ships; import core.math.Vector2D; -import objects.GameObject; +import core.physics.hitboxes.RectHitBox; +import objects.core.CollGameObject; import java.awt.*; -public class Shell extends GameObject { +/** + * A shell fired by a cannon + */ +//TODO why tf do shells not use map coords... +public class Shell extends CollGameObject { public Shell(Vector2D position, Vector2D size, Vector2D velocity) { - super(position, size); + super(position, size, new RectHitBox(position, size)); this.velocity = velocity; } @@ -21,6 +26,6 @@ public class Shell extends GameObject { @Override public void update() { - position.add(velocity); + moveTo(Vector2D.add(position, velocity)); } } diff --git a/src/main/java/objects/ships/Submarine.java b/src/main/java/objects/ships/Submarine.java index 1bd26ff..2204269 100644 --- a/src/main/java/objects/ships/Submarine.java +++ b/src/main/java/objects/ships/Submarine.java @@ -2,20 +2,15 @@ package objects.ships; import core.math.Coords; import core.math.Vector2D; -import core.physics.Collidable; -import core.physics.hitboxes.Hitbox; import core.physics.hitboxes.RectHitBox; -import objects.GameObject; +import objects.core.CollGameObject; import java.awt.*; -public class Submarine extends GameObject implements Collidable { - - private final RectHitBox hitbox; +public class Submarine extends CollGameObject { public Submarine(Vector2D position, Vector2D size) { - super(position, size); - this.hitbox = new RectHitBox(position, size); + super(position, size, new RectHitBox(position, size)); this.mainColor = Color.BLUE; } @@ -33,18 +28,4 @@ public class Submarine extends GameObject implements Collidable { moveTo(centerRelPos); } - @Override - public Hitbox getHitbox() { - return hitbox; - } - - @Override - public Vector2D getCenterPos() { - return getCenterPosition(); - } - - @Override - public Vector2D getSize() { - return size; - } } diff --git a/src/main/java/objects/ships/Turret.java b/src/main/java/objects/ships/Turret.java index ea5ff2c..ed1cbd6 100644 --- a/src/main/java/objects/ships/Turret.java +++ b/src/main/java/objects/ships/Turret.java @@ -2,7 +2,7 @@ package objects.ships; import core.math.ExMath; import core.math.Vector2D; -import objects.GameObject; +import objects.core.GameObject; import java.awt.*; diff --git a/src/main/java/objects/world/Grid.java b/src/main/java/objects/world/Grid.java index 8d68f32..f056735 100644 --- a/src/main/java/objects/world/Grid.java +++ b/src/main/java/objects/world/Grid.java @@ -1,7 +1,6 @@ package objects.world; -import core.Master; -import objects.GameObject; +import objects.core.GameObject; import java.awt.*; diff --git a/src/main/java/objects/world/Wall.java b/src/main/java/objects/world/Wall.java index 77162ad..6bcd8e7 100644 --- a/src/main/java/objects/world/Wall.java +++ b/src/main/java/objects/world/Wall.java @@ -1,20 +1,16 @@ package objects.world; import core.math.Vector2D; -import core.physics.Collidable; import core.physics.hitboxes.Hitbox; import core.physics.hitboxes.RectHitBox; -import objects.GameObject; +import objects.core.CollGameObject; import java.awt.*; -public class Wall extends GameObject implements Collidable { - - private final RectHitBox hitbox; +public class Wall extends CollGameObject { public Wall(double x, double y, double xSize, double ySize) { - super(x, y, xSize, ySize); - this.hitbox = new RectHitBox(new Vector2D(x, y), new Vector2D(xSize, ySize)); + super(x, y, xSize, ySize, new RectHitBox(new Vector2D(x, y), new Vector2D(xSize, ySize))); } @Override diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index b8ddd114d809a1e2dc42e5bd0e45668d9128fa50..420b9fb365575b383749298a3892d74b33a5a5c4 100644 GIT binary patch delta 454 zcmZoOo^QONoRMEf!zVu}D>b>KSU)+xD0Ooq<4G1?ab%&%L2OF=vS`Zc*bXx@8caMW z!e@i3Kc4FrBcCLym=li2SWfu zFhejy97700DMJK96+X$%?+(CU}spsz{9X`a<+&Y5SL>yVy zF>o@hpZr54MQ{fLC&Nw#0ft=+G7Nhdlo<9+&J|s#c!Gh2;S>WO!#M^ihVu+^3>O&G z87?xIFb>Kcyk-$Nfr(vC~tBMn-Z4>;uu01 zN*N*KS4f<}t)FY-Na>d_>TnF>$hpP_=9}gCIi=gCs*PgBC+RgAqdkg9Ae` zg9k$?LnuSpO&W7%noXGhAXY zW4Op*!*GqkhvE8U53$Fx4;h#k9y7=>JYg_kc*YRG@PZ+k;Uz;J!yAS|hPRVF#H$%U zPG*!4oqSVVo$>2rMu`-`pA4J~zZhf~elsXD{9({x_&2#sB9yUo@)-$F#?r}Rk{*mw Ilj9{F07f-%Q~&?~ diff --git a/target/classes/objects/GameObject.class b/target/classes/objects/GameObject.class deleted file mode 100644 index ef7541f3ec2497df86cfe69d2767fb8027d73d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3312 zcmX^0Z`VEs1_mpJ>Ff+lj0{4_`9-Pvxrrqi`eCWbCHX~0E?f+Z3@khhtPE_73~V-; zd6^}4j0~(AE-sp3Tnroxoa_u-AX#ok2BG|v24C7?rU=ZSA5M~fzWZ)>sFU~B<%+F(F z5W!|9NUazTgE&YnOL1mZD#$l{AWB`1R{gB&}9JP(5cgCZjX zAK3E5@)CXL{G9wEMg~?VA4g|zMg{>NR2gfKY05kdDj;2)xrv#1U=3UhY7FY^3>rKP znhaWu4BX&A@J%c(NiAYz;7m^~fwB2DG$AgB2!M^#;bG8a&|_p^%Y|y-#ZY3v!(hl@ z#K^#!lUNBdlF<|7H4`2NQwB3e2A1Uff=WgPF__sXF>1}uV8O^B4t7yNMrCnkaxuu0 zIhiSmNja(94CV}0JPg(hHV}7uWR@i5S1>Xtz|4Ya$pA~F7VAS)SaUJhG1#*+IPfqy zGH^38$e@^yrWoY4{Ib-Ld{8hs^DwwDxH2+ur{t#=JLl)*WTvDtGRQy^4$L};1jvQf zno(Q~?hGF644ym;UJRf(0ow)kq;r0LQA#l*17CV-NqBxyP6|vw3u+!%6)bUEL&F|b z5M;V94}%}bXdzT{g28DhfFY2bA&7?|m?4CbK^UGM+=~(mGBT5kja(QRIEqtC0unRx zN*Ec0H4sS#EMyHz#EcAKJPhFs5sVCs6^smwE}RUE3{gA`(O{8EE`|VxSRRHrhImE> zj+w1 zBo*vOumeydTQiK2fvqI5C_S}=k%28gCnX@in2~`uxFj(-+c&WQY9&WXQDQkHC?$}h z6A|OqAaj`0jZzpHL=n-AB+tmeoS0P1$iNONh8#gGu$iEUV`Sh38;^)CDeQKD;*XJm zC9x;W#*(ZGVmkHcRf(rXHjI}VBlq7WGH1|V_*Rl%nS?+ETBRc zOiMF}fN2#5MKG<)pa-T68H^Yh82A_%8CV(085kKV7#JAxK{W~k1B0a2ZU)9kb>C*v7?>C;85kJ27?>Cs7-ShF7~~kL7#J8#7+66X8LAm-z-dkr zl(`rf!D7)25e&>=RxLvWR9ziI1Oq$Ra&D;Q?F`IdRk~W+8F;j`w=xK7>1<^X1v_Os zgTz(_Nv%x`GFusxw01D4Ze`HcV&2N2k8qF@0|x^Gg8~B!gCYYbgAxNDgEE68g9?KJ zgDQhMgBpVlgF4uu3J^=+4%G#R7|5Zz;4ouiVPvRh5MW?nU}SJ)Xn;CyE7WnmT3Z+d zw=o#|LL7LI!F(ozwblU!^PLQqj0_-2tt||q+Zb%MwlHXe#J4dx&18@S`9u)J1uN5m zssTBk8627r$6GLPFjzA1GFUT+FxW6?FxWDfG1xI!GuSiuFgPJO-WTq8Uxr2o5e7yE z4hC0-CI%4(CWdAP1_llW#y<=`pwMMxXkloDdZ81XJQx@ZL9X1v;0E%F=ne)SKW(io z3`*M={IzwqFogE$Y+;D((*?0~L9A^IF(79`B3%p|d0q@04BiX^489B!41Np-4E|uJ zX)&-cFfbUxoo2|;#?TISnkGXB*l7X`iVU3$A`Hw7j0{~AJ1YU*S>X&E3=s?h3{eac z4ABe*3^8OltDB(*8d^&k*csRu7#J*}p=HGainJXJK31&o@RDQ!1rvyj?2}{#vspo5 zCL_CzAsO9yX$+hU=?p>)nG8}4Sqv5o*Svn#aJwkPo(&2ci&a zEhDI2ff~}szy@}b9mwBX7(%tTFocRQWaoo?zl9+*JJ}N=5vjd}Arc`GnVoFO0xBys zBv`gHFmHgD6MW$8R?HyDP{Lr$Pztskl2q)Vwlgr;G4z8|u_S{kxYS@`FlOKeRmBV} z42+99RL2`>8+%0-gw+J%GLfxW_