From 90c5950e0b0e15ce795dfbde31c3abe31251810f Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Sun, 13 Dec 2020 13:28:38 +0100 Subject: [PATCH] collision optimization --- src/main/java/core/Master.java | 21 ++++++------- src/main/java/core/{ => math}/Coords.java | 4 +-- src/main/java/core/physics/Collidable.java | 1 + .../core/physics/{ => hitboxes}/Hitbox.java | 10 +++++- .../physics/{ => hitboxes}/RectHitBox.java | 29 ++++++++++++++++-- src/main/java/objects/GameObject.java | 9 +++++- src/main/java/objects/ships/Submarine.java | 6 ++-- src/main/java/objects/world/Wall.java | 4 +-- .../java/core/physics/RectHitBoxTest.java | 1 + target/classes/core/Master.class | Bin 6826 -> 6398 bytes target/classes/objects/GameObject.class | Bin 3176 -> 3312 bytes 11 files changed, 61 insertions(+), 24 deletions(-) rename src/main/java/core/{ => math}/Coords.java (95%) rename src/main/java/core/physics/{ => hitboxes}/Hitbox.java (56%) rename src/main/java/core/physics/{ => hitboxes}/RectHitBox.java (81%) diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java index 02a91d5..516228c 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/Master.java @@ -63,7 +63,7 @@ public class Master extends JPanel { /** * The current width and height of the game area */ - private int w,h; + private int w, h; /** * Create a new master object @@ -171,13 +171,13 @@ public class Master extends JPanel { * @param obj The new object */ public void create(GameObject obj) { - create(obj, 0); + create(obj, obj.getLayer()); } /** * This method has to be called for every newly created GameObject * - * @param obj The new object + * @param obj The new object * @param renderLayer The render layer the object will be put on, 0 is below everything */ public void create(GameObject obj, int renderLayer) { @@ -191,7 +191,8 @@ public class Master extends JPanel { /** * Add a new Drawable to the render list - * @param d The drawable + * + * @param d The drawable * @param layer The layer it should be put on (>=0) */ public void addDrawable(Drawable d, int layer) { @@ -202,7 +203,7 @@ public class Master extends JPanel { } //layer exists check - int layerDif = layer - (drawables.size()-1); + int layerDif = layer - (drawables.size() - 1); if (layerDif > 0) { for (int i = 0; i < layerDif; i++) { drawables.add(new ArrayList<>()); @@ -227,13 +228,9 @@ public class Master extends JPanel { for (Collidable c : collidables) { double distance = Vector2D.distance(c.getCenterPos(), col.getCenterPos()); - if (c != col /*&& !(distance > c.getSize().magnitude() && distance > col.getSize().magnitude())*/) { - - System.out.println("\n\nCOLL POSSIBLE"); - System.out.println("This: " + c.getHitbox() + "\n\nother: " + col.getHitbox()); + if (c != col && (distance < c.getHitbox().getSize() + col.getHitbox().getSize())) { if (c.collidesWith(col)) { - System.err.println("COLL"); collides = true; } } @@ -251,8 +248,8 @@ public class Master extends JPanel { public void destroy(GameObject gameObject) { objects.remove(gameObject); - drawables.remove(gameObject); - if(gameObject instanceof Collidable){ + drawables.get(gameObject.getLayer()).remove(gameObject); + if (gameObject instanceof Collidable) { collidables.remove(gameObject); } } diff --git a/src/main/java/core/Coords.java b/src/main/java/core/math/Coords.java similarity index 95% rename from src/main/java/core/Coords.java rename to src/main/java/core/math/Coords.java index ca031eb..ad3e83d 100644 --- a/src/main/java/core/Coords.java +++ b/src/main/java/core/math/Coords.java @@ -1,5 +1,6 @@ -package core; +package core.math; +import core.Master; import core.math.Vector2D; /** @@ -7,7 +8,6 @@ import core.math.Vector2D; *

In this system, the screen is always 100 high and 100 * the screen ration wide. * This class is the used to convert these coordinates into the true Java 2D coordinates for the drawing

*/ -//TODO make this return a vector2d instead of the isX public class Coords { /** diff --git a/src/main/java/core/physics/Collidable.java b/src/main/java/core/physics/Collidable.java index 8d1c4cd..e1e173c 100644 --- a/src/main/java/core/physics/Collidable.java +++ b/src/main/java/core/physics/Collidable.java @@ -1,6 +1,7 @@ package core.physics; import core.math.Vector2D; +import core.physics.hitboxes.Hitbox; public interface Collidable { diff --git a/src/main/java/core/physics/Hitbox.java b/src/main/java/core/physics/hitboxes/Hitbox.java similarity index 56% rename from src/main/java/core/physics/Hitbox.java rename to src/main/java/core/physics/hitboxes/Hitbox.java index e3264a6..14f6028 100644 --- a/src/main/java/core/physics/Hitbox.java +++ b/src/main/java/core/physics/hitboxes/Hitbox.java @@ -1,12 +1,20 @@ -package core.physics; +package core.physics.hitboxes; import core.Drawable; import core.math.Vector2D; public abstract class Hitbox implements Drawable { + private final boolean isTrigger; + + protected Hitbox(boolean isTrigger) { + this.isTrigger = isTrigger; + } + public abstract void moveTo(Vector2D x1, Vector2D size); + public abstract double getSize(); + @Override public String toString() { return super.toString(); diff --git a/src/main/java/core/physics/RectHitBox.java b/src/main/java/core/physics/hitboxes/RectHitBox.java similarity index 81% rename from src/main/java/core/physics/RectHitBox.java rename to src/main/java/core/physics/hitboxes/RectHitBox.java index eb7d3a2..2cae2b9 100644 --- a/src/main/java/core/physics/RectHitBox.java +++ b/src/main/java/core/physics/hitboxes/RectHitBox.java @@ -1,6 +1,6 @@ -package core.physics; +package core.physics.hitboxes; -import core.Coords; +import core.math.Coords; import core.Master; import core.math.Vector2D; @@ -18,6 +18,22 @@ public class RectHitBox extends Hitbox { */ private Vector2D x1, y1, x2, y2; + /** + * Create a new RectHitbox with the position of the top left point {@code x1} and the size + * + * @param x1 The top left point + * @param size the size + * @param isTrigger Whether the hitbox is a trigger (only collision detection, not restricting movement + */ + public RectHitBox(Vector2D x1, Vector2D size, boolean isTrigger) { + super(isTrigger); + this.x1 = x1; + this.x2 = Vector2D.add(x1, new Vector2D(size.x, 0)); + this.y1 = Vector2D.add(x1, new Vector2D(0, size.y)); + this.y2 = Vector2D.add(x1, new Vector2D(size.x, size.y)); + Master.getMaster().addDrawable(this, 1); + } + /** * Create a new RectHitbox with the position of the top left point {@code x1} and the size * @@ -25,6 +41,7 @@ public class RectHitBox extends Hitbox { * @param size the size */ public RectHitBox(Vector2D x1, Vector2D size) { + this(x1, size, false); this.x1 = x1; this.x2 = Vector2D.add(x1, new Vector2D(size.x, 0)); this.y1 = Vector2D.add(x1, new Vector2D(0, size.y)); @@ -46,6 +63,12 @@ public class RectHitBox extends Hitbox { this.y2 = Vector2D.add(x1, new Vector2D(size.x, size.y)); } + @Override + public double getSize() { + Vector2D size = Vector2D.subtract(y2, x1); + return size.magnitude(); + } + /** * Check whether two hitboxes collide with each other * @@ -154,7 +177,7 @@ public class RectHitBox extends Hitbox { Vector2D abs = Coords.getWorldCoords(x1); Vector2D sizeAbs = Coords.getWorldCoordsSize(Vector2D.subtract(y2, x1)); - g2d.drawRect((int)abs.x, (int)abs.y, (int)sizeAbs.y, (int)sizeAbs.y); + g2d.drawRect((int)abs.x, (int)abs.y, (int)sizeAbs.x, (int)sizeAbs.y); g2d.setPaint(Color.MAGENTA); } } diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/GameObject.java index d9451c4..1d3320b 100644 --- a/src/main/java/objects/GameObject.java +++ b/src/main/java/objects/GameObject.java @@ -1,6 +1,6 @@ package objects; -import core.Coords; +import core.math.Coords; import core.Drawable; import core.Master; import core.math.Vector2D; @@ -23,6 +23,8 @@ public abstract class GameObject implements Drawable { protected Master master; + protected int layer; + public GameObject(double x, double y, double xSize, double ySize) { this(new Vector2D(x, y), new Vector2D(xSize, ySize)); } @@ -33,6 +35,7 @@ public abstract class GameObject implements Drawable { this.velocity = new Vector2D(); mainColor = Color.BLACK; this.master = Master.getMaster(); + this.layer = 0; } @@ -133,4 +136,8 @@ public abstract class GameObject implements Drawable { public Vector2D getCenterPosition() { return new Vector2D(position.x - size.x / 2, position.y - size.y / 2); } + + public int getLayer() { + return layer; + } } diff --git a/src/main/java/objects/ships/Submarine.java b/src/main/java/objects/ships/Submarine.java index 7bb43fa..57178a8 100644 --- a/src/main/java/objects/ships/Submarine.java +++ b/src/main/java/objects/ships/Submarine.java @@ -1,10 +1,10 @@ package objects.ships; -import core.Coords; +import core.math.Coords; import core.math.Vector2D; import core.physics.Collidable; -import core.physics.Hitbox; -import core.physics.RectHitBox; +import core.physics.hitboxes.Hitbox; +import core.physics.hitboxes.RectHitBox; import objects.GameObject; import java.awt.*; diff --git a/src/main/java/objects/world/Wall.java b/src/main/java/objects/world/Wall.java index 61e68c5..c42ea97 100644 --- a/src/main/java/objects/world/Wall.java +++ b/src/main/java/objects/world/Wall.java @@ -2,8 +2,8 @@ package objects.world; import core.math.Vector2D; import core.physics.Collidable; -import core.physics.Hitbox; -import core.physics.RectHitBox; +import core.physics.hitboxes.Hitbox; +import core.physics.hitboxes.RectHitBox; import objects.GameObject; import java.awt.*; diff --git a/src/test/java/core/physics/RectHitBoxTest.java b/src/test/java/core/physics/RectHitBoxTest.java index b31a5c5..3170cd7 100644 --- a/src/test/java/core/physics/RectHitBoxTest.java +++ b/src/test/java/core/physics/RectHitBoxTest.java @@ -1,6 +1,7 @@ package core.physics; import core.math.Vector2D; +import core.physics.hitboxes.RectHitBox; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index a1997317cecb85f564d67febfe1d4b45ad785891..6f26be7c64a186cbceb34b8cbb53a6e858510851 100644 GIT binary patch delta 2325 zcmZ2w`p=N-)W2Q(7#J9=7=1Q!8M9d~Vpz=1u!M(UDMK71gHV1_R%&udvA%m^ZmK_+ z&B(x!o?7CQSeaVH#lXR^oQFY+VFe?DgvR7XE)h;o%`kR`Rg4VclRt2YbAc4B;bBSu$y7eWIc8zwtYMd`xy>Q4r5p2KE!aCo#6-%!%>D~ zliS(VISw(L;9)q)aBA{4b_I@=3}<*4&N7^ve2-m+?E(+OMTSe01vo70xfxb6T;XB3 z%5aU5fipd|#3QpLDZhe|K|w>)Cpo_;RlgvkvN$ujSU&?Sky@+|QDM!+aD(9{JHss= zhT9Bx7#U>nDQ09~Pfslg&a6shWMJ0NbOBjMu;1A`0$BLfJqY+~Tuz`(%3$ncAS zfq@Myn!v!sP{&XWQaM>%I1OY=y|9`Uk}Y9STNoI^7?~KE85kKn82A`j7+D#Z7}*#Y z7+4sXv_u&g8LFVB+!vO%0$acbc4QR;D?>E{7efu$NHGQ`1_lOhxRKmYBN-Xl89Bg? zFcHzJ2W#g7D{WzrWN1awDh1an#mLFX#Q^dnH`p&ApPDc*fqliM#j=%weIq!~L4Jjp z)y=@l&;vG$2cimU79%6VgmeZbhRJtDj6eY)C@Lp|q+AoOoQGi+*sb28auBydygHwO zonZk355q#RCWu%0pqkhj*co{l`9SVv0|S?qw)QrLh1(dGq5F6p11H0JurUzVa6ye>VBlgD zU=#$~uEnqdWZ-07F^T$>Ga2}`wlGL*A7EIyjX^P7OIv0e!)lPJ%-}c?V_;=qVA#RH z$*_|_fMFMd48tA-tGlxN#cQ?cONTH3}88+{i(b~cww~b-jpUk8B!UT!HJujftl|wL%k3q<1Yp&21Z5+h6fDH;7s+D zfsKKkfq@~3*%lOH+Zgux>F#7W$jC60AwYL0!*NE20}LyzSR`3?GMr{)&<2w`7|vU= zO0sA#Wzdpf1<71yWZ1@VU3(`3gpoXB4ugOsi}p^2yG#r-8CY3tm;YZYvxcFbfdLZ! zN(>wf3=EGLm>8Zg$T2)+FkpDj5Ww(~A)4V8LoCBvh6ILpa1R?W=rUYn_`tx*Aje?O zD9I=V_IeWB>q(5#j8Y7Y3``6Oj4}*7(D>nJVE)U%#mLTZ=r=>qF9s$?Sq27%5C%p$ zNQuEH4=O(x6&T{6(TALZ)6i4!C$MACQZS<;MDyhL5~7gY14-`Ruqsx9C-(vdCUA+M zthI$fM0*>%Ah;}j(BDUMkN6*P^|&=s6EtrZf&hy3{OCXZwbg6CUCxh_@D%4EU1VB zmyn=Rmzz-yRHO@Vfoc_~VKz|1>N&Kvb}~F=V!&q<2izzQMon;PM-g;Y7Ry{24+T6Msr3hMr8=ohS32k=*Z~8=msiM O7#JDd89f=j86*L1gR1oa delta 2695 zcmexoxXP64)W2Q(7#J9=7!x;g8MCQzFf8I>&|+B3$RMHNlb@88np{$>@1B^O>JMgH zduoQUGc27vflZEWIS<1MhLw}Iu&FVwo_w24U2QERgM?3FWonT^ZfS9eLQ<+iVu?ad zYGQGTf+ZKjDu(qu46F#Wkv=8 zgx287;*!){Mh52m(h^1nQHY_L`T7AxnRz9_B}J);xz-#ER~Z@jxwxGDeS8!G{DXr% zoqSxm7_KwiU}w0=!*GjX10#bl*ho~3j124rAY*ds^FU6!!^3cw;T|IcXL@RhM`lS< zegz|gxQ3=ra(+>&enCcMab|L{K19M=h=GaW0T07NhDVGH;<<_0sm}R%$%!T5nI##{ z`FX`9iFqZ(j0|=fST$n^DkkMuSR)5ma7j^SUb;2NRZn;ro-#a}{FOt`9u!J1co<%S zf`~b_sEC8%H6sHH$k(8lddtJ`jzNWyfvqStH@_@Zh=G}*kelHn!zXrz&pZrY7`{&S z;IwD^$;0rA;rHfVPIeYPD=tQBMjLiUTOLL`M*Gc+cv%=39VhEDiVKDDvoShzF>o-t z@G$B#8VE4DO}@Y{ka$e z7z5cEgLoJoG6pj;sDPsZoG3E$%JQ>Q^&wt`1fN@Ca!GzsB_qQO4WG#l{Hl}x^ICI2 z6j(=3He?i@+{q`c!NC~H$RHS!ky&h|z{tgwUy_kpWTn8!&&C)Ia&iO@qYOiz{DuXz`(%5z@#P0z{pSqH6=hu+6rs|AJ~yq46F>*3|tH~U?asC zm>3usxZy@}Lycr)6k-$xJ7TGjRy|ld7g%WvgCs*Ml2$3WRw+giMv%RX4BQ~UfPHGh zzy$Ucn-7}yxrgUx_Ag&k@J0|PswG$SarfJ|EqGHvog z5sCUGGa2}`wlGL*A7EIrjX^P7OIv0e!!nSm%-~QGV*rKm4hBw!oeTmDyBK5`_An?h z>;u~XNvXH{dn0GhBsz{+V z+ZopFm(kk7Ah(TS<7979-TEyD7zDLJ4njCZje(Paf#Em<3&TkUK8CXlQVi!9%0|SE^0}G=i12dxoqplO9E0pQZ h=*#HGz{nT^<%cmwGDb5nFmN$2GR82*F(xob0svO!&fow5 diff --git a/target/classes/objects/GameObject.class b/target/classes/objects/GameObject.class index 58420b565992390700c845cfb70785a4274aa8e7..ef7541f3ec2497df86cfe69d2767fb8027d73d83 100644 GIT binary patch literal 3312 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 V5VyC1Erg^KSlBQ!OaMpgL;$Q5DJlQ}