From 0c1178d1d1fa990122c8d8d4d4349e54fef8b1cc Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Sun, 13 Dec 2020 13:11:54 +0100 Subject: [PATCH] collision detected works now! --- src/main/java/core/Coords.java | 1 - src/main/java/core/Master.java | 41 ++++++++++++++++++--- src/main/java/core/physics/Collision.java | 11 ++++++ src/main/java/core/physics/Hitbox.java | 3 +- src/main/java/core/physics/RectHitBox.java | 39 +++++--------------- src/main/java/objects/GameObject.java | 6 ++- target/classes/core/Master.class | Bin 6106 -> 6826 bytes target/classes/objects/GameObject.class | Bin 3028 -> 3176 bytes 8 files changed, 62 insertions(+), 39 deletions(-) diff --git a/src/main/java/core/Coords.java b/src/main/java/core/Coords.java index 57aaa50..ca031eb 100644 --- a/src/main/java/core/Coords.java +++ b/src/main/java/core/Coords.java @@ -41,7 +41,6 @@ public class Coords { } public static Vector2D getWorldCoordsSize(Vector2D value) { - //TODO h not w double x = (value.x / Master.SCREEN_Y_COORDINATES * master.getH()); double y = (value.y / Master.SCREEN_Y_COORDINATES * master.getH()); return new Vector2D(x, y); diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java index 6aa2585..02a91d5 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/Master.java @@ -41,8 +41,9 @@ public class Master extends JPanel { /** * All GameObjects that can be drawn + * Has different render layers, 0 is on the bottom */ - private final ArrayList drawables; + private final ArrayList> drawables; /** * All physics objects that exist @@ -74,6 +75,7 @@ public class Master extends JPanel { objectBuffer = new ArrayList<>(); collidables = new ArrayList<>(); drawables = new ArrayList<>(); + drawables.add(new ArrayList<>()); create(new Grid()); @@ -111,7 +113,7 @@ public class Master extends JPanel { Graphics2D g2d = (Graphics2D) g.create(); - drawables.forEach(o -> o.draw(g2d)); + drawables.forEach(l -> l.forEach(o -> o.draw(g2d))); } @@ -169,16 +171,45 @@ public class Master extends JPanel { * @param obj The new object */ public void create(GameObject obj) { + create(obj, 0); + } + + /** + * This method has to be called for every newly created GameObject + * + * @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) { objectBuffer.add(obj); if (obj instanceof Collidable) { collidables.add((Collidable) obj); } - drawables.add(obj); + addDrawable(obj, renderLayer); } - public void addDrawable(Drawable d) { - drawables.add(d); + /** + * Add a new Drawable to the render list + * @param d The drawable + * @param layer The layer it should be put on (>=0) + */ + public void addDrawable(Drawable d, int layer) { + + if (layer < 0) { + + throw new IllegalArgumentException("Layer must be at least 9"); + } + + //layer exists check + int layerDif = layer - (drawables.size()-1); + if (layerDif > 0) { + for (int i = 0; i < layerDif; i++) { + drawables.add(new ArrayList<>()); + } + } + + drawables.get(layer).add(d); } diff --git a/src/main/java/core/physics/Collision.java b/src/main/java/core/physics/Collision.java index ecf23a9..491755d 100644 --- a/src/main/java/core/physics/Collision.java +++ b/src/main/java/core/physics/Collision.java @@ -1,5 +1,8 @@ package core.physics; +/** + * This class stores information about a collision + */ public class Collision { Collidable a; @@ -13,10 +16,18 @@ public class Collision { this.haveCollided = haveCollided; } + /** + * Get the Collidable a, the one that called the collision testing + * @return The Collidable a + */ public Collidable getA() { return a; } + /** + * Get the Collidable b, the one that a collided width + * @return The Collidable a + */ public Collidable getB() { return b; } diff --git a/src/main/java/core/physics/Hitbox.java b/src/main/java/core/physics/Hitbox.java index 415bfa8..e3264a6 100644 --- a/src/main/java/core/physics/Hitbox.java +++ b/src/main/java/core/physics/Hitbox.java @@ -2,10 +2,11 @@ package core.physics; import core.Drawable; import core.math.Vector2D; -import objects.GameObject; public abstract class Hitbox implements Drawable { + public abstract void moveTo(Vector2D x1, Vector2D size); + @Override public String toString() { return super.toString(); diff --git a/src/main/java/core/physics/RectHitBox.java b/src/main/java/core/physics/RectHitBox.java index 4f68345..eb7d3a2 100644 --- a/src/main/java/core/physics/RectHitBox.java +++ b/src/main/java/core/physics/RectHitBox.java @@ -1,5 +1,6 @@ package core.physics; +import core.Coords; import core.Master; import core.math.Vector2D; @@ -10,8 +11,6 @@ import java.awt.*; */ public class RectHitBox extends Hitbox { - int w,h; - /** * The corners of the rectangle like this: *

x1 x2

@@ -30,14 +29,16 @@ public class RectHitBox extends Hitbox { 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); } /** * Move the hitbox to a new position * - * @param x1 - * @param size + * @param x1 The new position + * @param size The new size */ + @Override public void moveTo(Vector2D x1, Vector2D size) { this.x1 = x1.copy(); this.x2 = Vector2D.add(x1, new Vector2D(size.x, 0)); @@ -105,8 +106,7 @@ public class RectHitBox extends Hitbox { } } - boolean coll = !(allAbove || allBelow || allLeft || allRight); - return coll; + return !(allAbove || allBelow || allLeft || allRight); } /** @@ -151,31 +151,10 @@ public class RectHitBox extends Hitbox { @Override public void draw(Graphics2D g2d) { - this.w = w; - int h = (int) (w / Master.SCREEN_RATIO); - int xAbs = (int) getWorldCoords(x1.x, true); - int yAbs = (int) getWorldCoords(x1.y, false); - int sizeXAbs = (int) getWorldCoordsSize(x2.x - x1.x, true); - int sizeYAbs = (int) getWorldCoordsSize(y1.y - x1.y, false); + Vector2D abs = Coords.getWorldCoords(x1); + Vector2D sizeAbs = Coords.getWorldCoordsSize(Vector2D.subtract(y2, x1)); - g2d.fillRect(xAbs, yAbs, sizeXAbs, sizeYAbs); + g2d.drawRect((int)abs.x, (int)abs.y, (int)sizeAbs.y, (int)sizeAbs.y); g2d.setPaint(Color.MAGENTA); } - - - public double getWorldCoords(double value, boolean isX) { - if (isX) { - return (value / (Master.SCREEN_Y_COORDINATES * Master.SCREEN_RATIO) * w); - } else { - return (value / Master.SCREEN_Y_COORDINATES * h); - } - } - - public double getWorldCoordsSize(double value, boolean isX) { - if (isX) { - return (value / Master.SCREEN_Y_COORDINATES * w); - } else { - return (value / Master.SCREEN_Y_COORDINATES * h); - } - } } diff --git a/src/main/java/objects/GameObject.java b/src/main/java/objects/GameObject.java index bb13948..d9451c4 100644 --- a/src/main/java/objects/GameObject.java +++ b/src/main/java/objects/GameObject.java @@ -37,7 +37,7 @@ public abstract class GameObject implements Drawable { /** - *

The update method is called every frame before the {@link #draw(Graphics2D, int, Master)} method by the master object on each object. Everything + *

The update method is called every frame before the {@link #draw(Graphics2D)} method by the master object on each object. Everything * that is needed for the game to work should be here in this method.

*

No drawing should be made in this method. The {@code debug} method can be called on the master.

*

This function is NOT intended to be called manually.

@@ -50,12 +50,14 @@ public abstract class GameObject implements Drawable { * @param target The target position */ public void moveTo(Vector2D target) { - Vector2D oldPos = position; + Vector2D oldPos = position.copy(); this.position = target; if (this instanceof Collidable) { + ((Collidable) this).getHitbox().moveTo(position, size); if (master.doesCollide((Collidable) this)) { this.position = oldPos; + ((Collidable) this).getHitbox().moveTo(oldPos, size); } } } diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index dde115fb4cf8c731f1ae462c9d7212956558031e..a1997317cecb85f564d67febfe1d4b45ad785891 100644 GIT binary patch delta 3708 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 delta 3079 zcmZ2wdP|?{)W2Q(7#J9=7#%lq2{Wp*Gbk}K2<0bbr6!jY>zC&j<)rAl7iFe!F(@)H zb1`r*sPZtVF{n?@VN_+&WMq(-9KbEX%gLb4pu^6f%fq0@pg(yRqY;M&gCP$CD}&MG zFO0@g+6-1a4Au<#j0~*qL9VWTTnrivwjgP{$&O4ij1H6Im}DHB7#W0;^NUjTa}!H4 z^utnRyT#B&E}^k8IQ)o^jq4C7+3XYc}vcu$t*&}9i@XYif; zn#ri%hanUs8pg=LuHoVWQOUs&!NU;A5XH#Ak)B!-o|#gT!N|a@q3H?oRtyhAEJ%to zJ+;ImH8VYg+^%J6Km6jwc?+Qfq*lizW%Pd>%P&CJMPF!7+s=677ZjQoiyDWI53 zOv*`RWDwGre1TU)IE9gc-v^wmVN%wUH}mY8yp1=TPl1b3kx_}AQJIHPg;900J|7Ds zqxxiBMsdY3el|u;E(Q)pEgnV*Mo9riPJUKKT`opFMtych10F`h$?g0~LhAf%j3!)+ zri^CnjOIKHXBjOf@8&NF1{0)N;g8~x&ErSq)EE4}6gAjuh68{YY69YE`4_I#sLn4??0MmjDj0~&{Yz&Ni z4DT5j7-bo_8JHOu7?w}oEofE0n?W&hJA?8z29@0m8j+hAw6-%C_<)!q48|f1reI{g ziNSI^gN?72&Nc=WEo~67o54PEH-ls3b_QnHTW$VDMs4X7FavWAI_H zWbk8fVF+aKX9!|QV+do&W(a2}V2EVsXNY20#t_Z$k%56h0pbmYPvFq=XNX|<%M-D7X~Hc~l?+g& zyBL_kMu%x_V+a@E%+T7#5G^2(v4lZJ3&h;Y5T~WJg&|IWGezJ3=9kz41x@q z43Z343|b613`PvO3=Rwh3?2+c4519gNIngN`jmkojNu2vPXB*r zFfgz%FlmW0FoH@us7Krxm>8HC7#O&lrE-SQ#oAxEQLy zHi<#h!)@Y*+Qi84m*F4O)F1{fuqr97-3--{+K~7Mr4(@d*P=u;L}e3$BttWj`BHH6 z>!ld}GlC+6k%1eOM8Q#I!oUQM6*euFtqkl47efr|WMF0J0vpByQ3W-Ok&zK@LORq0 zO|2~qB3fG*B(^csg+u5jkkBrMR&ZQs)iZBpVAtBl(1EZ;ih+%Rfnfpz55q(TVTMTz z@(hz1R2Zf(XfRAgvQ-mqD-**sXuxF1FO~+2KF`ZTm(tGi;-N# z3N?li)P8_!E{3{F4dj3AZ47h6wGT2ZoXNniwS_^tUi$#ULXa3JiGn3T0Rc&#VhpSd z3=C@+I2qP52r#T;kYU)spvtfbY#qeaYEbJK7}OZq7}*&Z!Re5hfl-Emk&%Ou6Y2sd zs0+AIECGi}Jv1$CW#DAkhGa4q++;3BE=F#U{~380E-^5J6UcuCW(IZ!28IG=TaYKV zF)a4e-N~?=kzpo7obFDBwTui07#3QwNV4o?*vQDB4JLOmY_(*SWYJ#AV6ll|r_law z3u$rAqnIf*m6i_fhQ0~ zQHWv&1_tER6$kPmIA*|kiGkr3R?T7z>L8oI4u=#m%Ajney^Y}pD4WS?*MnG)bjAaU zBCrg4(z?gM$#9=Rh~WW)B*Q}nC5FdfyC6wR86F_YjN-^iOG$tWR9{1_w}B=t4sETS z47ZsWKvsa9U(Wz_e-Vg}uq9g+|qYNnPG0HN^F)%R5FfcR9GcYr%F={YsLs>eEMvTS`jEt6y{MHN%3|tJ1 Mj5dsRj1CNv08_S0g#Z8m diff --git a/target/classes/objects/GameObject.class b/target/classes/objects/GameObject.class index 967cd7a10cffc362961f452b5451cf7d0ce888dc..58420b565992390700c845cfb70785a4274aa8e7 100644 GIT binary patch delta 1819 zcmca2{z8K5)W2Q(7#J9=7$$AxTFofP#lXm5z{6n3V8qD4lAK>qIXRD2l8v3ggpomf z@_R<{G;RiC1~VQ8a|R1W2F~=<5|7N1r2Gm-25}8dpXB_aRQ-aC%HquAVtt5&H5Y>w zgEc#Y4G)7Y12-dsFcvk83~agiWvL2dsgC4fh+>GI{GLhN*@q#Pharw3nvsDcEi)&_ zzbr8aq#}WbA(0`8k%1Q^7?fX{mlBkkT*An}so@C*nqeRpr|>YOGNeuRWHyw~;$g@J zxsNA3wZu2E0OC3>1`dW?9)>&y_sKJv3usq!}a_WEjdA7#K_#SQ!`?BpJ#XDi}aO667%kMzB~oLkI&i zm{rLT0##SV5W>LDz{tSLzzsGxnaz^1bn;v_Wqy!p3SjjbAk!wFXOpb2W)NUtU|?jh zWvBtEW?*30%D@a(gAB$q8LYJqFc|M-FlA%_Nos9j5Z%UL zskMbc8zjDs!EPplq?QgyHB6ZfRLw>P1_ovZkoS}rI2afhOc^*B%ounX>Ma;V7%Uky z7_1n~7_1qr8EhDQ80^9RhPc!hF985kHi7#ROB z_<;P&$k4#h2=zlJ0~-Si0|SF0$eBABoIrjN-NE4Dr>(VxL1`O>L#-Db$p#Lx_O znf=?oSO8DRI>K`eoXn`J#T;20Pz89Eudz)9bdp_`$Lfti7m!2leX zEDS;n>fpd+Wng4TWe|Y6*_?q1oDDd^32+-jGQtgzJe1AA!H@&Cmj|K{YA+)wpF#|& zXXs;K13StNlvK7b1Zr<#2ozyR&jOgV!fLj{8}LnV@9^dOD_Wg$JNYXli&p^i~Ta!fCS zJJd0@3{2qo;ndRJ#*n##!3p7MHgNdXfz20#D1w;Jz`(!>HJ*{757Q`nkXbo97(CF; zY9e4(KZ6m-S(Ed)#R3AMaV5f#pPvqmEr?JkSO_J4AWm%q8xKhq(4b&oWS9Vs#fbn) Cm^6X_ delta 1720 zcmaDMaYdZ#)W2Q(7#J9=7}_^-t!7kbXE0!75Kqo8O4TpOs4UJ*F4lL>&&kP5NleN~ z8}YH|r91G|Q&r>Cc87)UyRhanIy?O&Fd0}>48VF+OeoxGA+ zfi0YeA%Y=t@_A-M`B)x?IFPe=(o;)(6AK`Y;$q-nNZ?^eWU!hn&mzZ|I@yk;k)16! zzbrK*fAd}z14d>s4b901SwtqkX4PO!nJmI)$ePB$$dEqSi%lyygMop8i-C!OfkB!< zf*%FoRh+4DL{MxeV?M>> zbC0uGGGWLK^SnWg|%uK_nrgF%=<1ZED` zkz!zDU|=w1U}Z34;9{t^U=U=mWRPdDVo+hQ1^W%+8dbP!R2d4vu3=?RU?>8)hM|~& zfq{d8@ehLv$WM$6B@CrdH+3?wF|aT&Fc^Z|w1dIaS8EG{=ne*JKW(io3`*M=?6h^Z zFu3&TY+>-|(*?2WbwSK+4Bj9IGJzc^1`ab<1`Y-{1_1^S1_=gF1_K5!u-mjCro-K4 z$WX>m&cMjP!Jx@d0d|`JgCavEg9rmN10zEfVRzNzav0QI{^;%sV&Gs1W)NTqWsqP9 zV=!O{C&OLU3^ma3T3XM*4vr5?XnKK?AI2jDU zfyu%k#GnoiOjZU)h6n}$sH4ppn81mXQwx;NwlRbu+yKcZnG75ZSzvp4APS-OGJ^6Z z)Q~;~Hjta@8SFql-@@Rcy@kO=gdr*)Og41x@049X1UNRH8iJ4O%Wn0f|A20;c{sB4sw z9Mi~P1$B%q0~0uYIJLC5F~sa(FhzKp4II8TVDrTwis0sRg3M=NWME`y!fsUj4hHLb zbh8==nAObC0(Djd0~gqKJy2{w;>raYc_Iu+`RNcL4~UQlSO_J;z;2ggXaQRYNhq+u LVPt3p$7>q^6tfC7