From e2483b30fffed4e90cc9a35116db6a4fa5be053d Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Fri, 11 Dec 2020 20:29:03 +0100 Subject: [PATCH] shooting works --- src/main/java/core/Master.java | 5 +-- src/main/java/core/Vector2D.java | 16 +++++++-- src/main/java/objects/DebugPos.java | 2 +- src/main/java/objects/ships/BattleShip.java | 6 ++-- src/main/java/objects/ships/Turret.java | 4 +-- src/test/java/core/Vector2DTest.java | 35 ++++++++++++++------ target/classes/core/Master.class | Bin 3807 -> 4043 bytes target/classes/objects/ships/Turret.class | Bin 3543 -> 3491 bytes 8 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/main/java/core/Master.java b/src/main/java/core/Master.java index f739bd8..54a8d2c 100644 --- a/src/main/java/core/Master.java +++ b/src/main/java/core/Master.java @@ -3,6 +3,7 @@ package core; import objects.DebugPos; import objects.ships.BattleShip; import objects.GameObject; +import objects.ships.Turret; import objects.world.Grid; import javax.swing.*; @@ -38,9 +39,9 @@ public class Master extends JPanel { BattleShip battleShip = new BattleShip(Color.DARK_GRAY); BattleShip bs = new BattleShip(70, 10, 5, 80, Color.GREEN); - /*for (int i = 0; i < 10; i++) { + for (int i = 0; i < 10; i++) { bs.addTurret(new Turret(bs, 25, 10 * i + 1, 50, i % 5)); - }*/ + } objects.add(bs); objects.add(battleShip); } diff --git a/src/main/java/core/Vector2D.java b/src/main/java/core/Vector2D.java index 26167fc..2e1ecef 100644 --- a/src/main/java/core/Vector2D.java +++ b/src/main/java/core/Vector2D.java @@ -1,5 +1,6 @@ package core; + /** * A 2-dimensional Vector that can be used to store position or velocity */ @@ -45,7 +46,7 @@ public class Vector2D { } /** - * Mulitply this vector with a simple scalar, modifies this object + * Multiply this vector with a simple scalar, modifies this object * * @param a The scalar * @return this after the multiplication @@ -111,6 +112,9 @@ public class Vector2D { /** * Rotate a point around another point + * + * This method can now be trusted + * * @param center The center of the rotation * @param value The point to be rotated, absolut to the center * @param rotation The rotation angle in radians @@ -121,12 +125,18 @@ public class Vector2D { Vector2D dif = Vector2D.subtract(value, center); - double rotatedX = Math.cos(rotation * rotationDirection) * dif.x; - double rotatedY = Math.sin(rotation * rotationDirection) * dif.x; + rotation = rotationDirection * rotation; + + double rotatedX = dif.x * Math.cos(rotation) - dif.y * Math.sin(rotation); + double rotatedY = dif.x * Math.sin(rotation) + dif.y * Math.cos(rotation); return new Vector2D(rotatedX + center.x, rotatedY + center.y); } + /** + * Copy this object + * @return A copy of this object + */ public Vector2D copy(){ return new Vector2D(x, y); } diff --git a/src/main/java/objects/DebugPos.java b/src/main/java/objects/DebugPos.java index 0a8c248..d423114 100644 --- a/src/main/java/objects/DebugPos.java +++ b/src/main/java/objects/DebugPos.java @@ -17,7 +17,7 @@ public class DebugPos extends GameObject { @Override public void draw(Graphics2D g2d, int w, Master master) { g2d.setPaint(Color.green); - g2d.drawOval((int) (position.x + size.x / 2), (int) (position.y + size.y / 2), (int) size.x, (int) size.y); + g2d.drawOval((int) (position.x - size.x / 2), (int) (position.y - size.y / 2), (int) size.x, (int) size.y); } @Override diff --git a/src/main/java/objects/ships/BattleShip.java b/src/main/java/objects/ships/BattleShip.java index 16b0eef..cd946e3 100644 --- a/src/main/java/objects/ships/BattleShip.java +++ b/src/main/java/objects/ships/BattleShip.java @@ -17,9 +17,9 @@ public class BattleShip extends GameObject { public BattleShip(Color mainColor) { super(20, 20, 5, 40); turrets = new ArrayList<>(); - turrets.add(new Turret(this, 25, 25, 50, 1)); - //turrets.add(new Turret(this, 25, 10, 50, 2)); - //turrets.add(new Turret(this, 25, 70, 50, 2)); + turrets.add(new Turret(this, 25, 25, 50, 3)); + turrets.add(new Turret(this, 25, 10, 50, 2)); + turrets.add(new Turret(this, 25, 70, 50, 2)); this.mainColor = mainColor; } diff --git a/src/main/java/objects/ships/Turret.java b/src/main/java/objects/ships/Turret.java index 35b68c4..6d39aa8 100644 --- a/src/main/java/objects/ships/Turret.java +++ b/src/main/java/objects/ships/Turret.java @@ -92,9 +92,7 @@ public class Turret extends GameObject { lastShot = System.currentTimeMillis(); Vector2D shellVel = new Vector2D(xCenterAbs - msLoc.x, yCenterAbs - msLoc.y).normalized().negative().multiply(SHELL_SPEED); - Vector2D pos = Vector2D.rotateAround(new Vector2D(xCenterAbs, yCenterAbs), new Vector2D(barrelX, frontPosY), rotation, Vector2D.CLOCKWISE); - - master.debugPos(pos); + Vector2D pos = Vector2D.rotateAround(new Vector2D(xCenterAbs, yCenterAbs), new Vector2D(barrelX, frontPosY), rotation, Vector2D.COUNTERCLOCKWISE); master.create(new Shell(pos, new Vector2D(10, 10), shellVel)); } diff --git a/src/test/java/core/Vector2DTest.java b/src/test/java/core/Vector2DTest.java index e8a20a8..973444c 100644 --- a/src/test/java/core/Vector2DTest.java +++ b/src/test/java/core/Vector2DTest.java @@ -41,20 +41,33 @@ class Vector2DTest { } @Test - void rotateAroundTest(){ + void rotateAroundTestSimple(){ Vector2D cent = new Vector2D(0, 0); Vector2D a = new Vector2D(1, 0); - Vector2D exceptedA = new Vector2D(6.123233995736766E-17 ,-1); //floating point precision probably - - Vector2D centB = new Vector2D(1, 1); - Vector2D b = new Vector2D(2, 1); - Vector2D exceptedB = new Vector2D(1 ,2); - - + Vector2D excepted = new Vector2D(0 ,-1); //floating point precision probably Vector2D rotated = Vector2D.rotateAround(cent, a, Math.toRadians(90), Vector2D.CLOCKWISE); - Vector2D rotatedb = Vector2D.rotateAround(centB, b, Math.toRadians(90), Vector2D.COUNTERCLOCKWISE); + assertEquals(round(excepted), round(rotated)); + } - assertEquals(exceptedA, rotated); - assertEquals(exceptedB, rotatedb); + @Test + void rotateAroundTestMovedCenter(){ + Vector2D cent = new Vector2D(1, 1); + Vector2D a = new Vector2D(2, 1); + Vector2D excepted = new Vector2D(1 ,2); + Vector2D rotated = Vector2D.rotateAround(cent, a, Math.toRadians(90), Vector2D.COUNTERCLOCKWISE); + assertEquals(round(excepted), round(rotated)); + } + + @Test + void rotateAroundTestExact(){ + Vector2D cent = new Vector2D(); + Vector2D a = new Vector2D(5, 6); + Vector2D rotated = Vector2D.rotateAround(cent, a, Math.toRadians(120), Vector2D.COUNTERCLOCKWISE); + Vector2D expected = new Vector2D(-7.6962, 1.3301); + assertEquals(round(expected), round(rotated)); + } + + public static Vector2D round(Vector2D a){ + return new Vector2D(Math.round(a.x*10000d)/10000d, Math.round(a.y*10000d)/10000d); } } \ No newline at end of file diff --git a/target/classes/core/Master.class b/target/classes/core/Master.class index a5ff27c1956209275bdffcecc9e303706a15ef95..cb7b329e53c423ee64f305b44e10d7040ec44c91 100644 GIT binary patch delta 1865 zcmcaFds?3B)W2Q(7#J9=7_M&Qy2EJ2&S1gFAd;Vym6}{qtY4gwSx~GWQd(4$TEgaF z$p8jy4xV6|fs4VM!H$Q4mBF5oK~ZCJKAV)2i;Ih=W*8TP9D^edgA;=@BLin*N(#gP zMg~a@A8aODgLH5(xbiT#F}P3uz$hy3$;05q;LgavnVwqWk(!yFQNqRG!{E!#;K#$@ z&k!(Kg~^;TXmSjb6k7-nLnuSonS(WnyPshKJHtdChDi*QCzrAsbM!Mz z&+fnT!mKo|8S;JcM|IOA?c_eG>~p5|eUL85tPMCr@Lu+x&!0pONnX z7sEk@L+lKPc^Hl`9NnzQ!NTZuoRL9P!zU}TEKxrvF)v-;ADjlPHN*JX8BTIBa4?+W zVc5yAOMoGdpPk_>NZ=d~!*+%|Mg|_wyu8#R=bXgi;?!bxhKrN)Iki|WGcw3cUe6&u zxqyRx@@`HU^BD{b3``6&8H52xB|48?PLYG7BQ&m>}D{J)DdB@6yTE0U`c2fVX&6vDA>+myN$u2g_&{r z|J#$}xWww28D=vuFqkp$GB7YGGO#enFmN&`F^DiIGsrWjGUzdAFjz8ZG6XPaF+?zE zGn6oBF;p?=GBh*jG4wF#Gt6ONV9;V>c7}R6b_O{{28Le@>I_Vv)Cchs!wm)& z237_J1`n-m3@!qk8Cu&IJOl(XmM{o|Saz}koH+sl8MezA1V9RGWdsCr1UNJ7w6`&M zA7BWyV$s^dAfP45BD0Gjn1Nv%L-%l^8g{juT|CVi04fw`Ndeuw_tVuw&3; zaAYuNaAt64Z~^k7XufAH`rBT5ani1}?BFDXrZMNs-#S8B!ue z7_>zgw6`;)ZD+{b#*hQI!w9N0h(VGe7|8-DxCK%SYZ=xtfSk<@NpX`4c*N^Li3Vax zBm*l$6j&z@10w?i0~=H)Bg1-#dIkoD3;9L4RPd60pj2&@(2e^#hgMh1U|JdlRTdwHdi!mEmblc5@{9%2<2R6PR& z7sFPDZ48V8OrW9yq!V1%K+*@Bw$?U=K18TM>`g*42Nv$27}x<;1mpsRt{+T2FdPb*v7!jz|61*9Flt(K$RlM lGy55s8ICcWU^vYHVVz+(&2XLpte_xjC)W2Q(7#J9=7>;k`y2EJ4#lXQ}!NXw5V8zJ5k)B!-o|#gT!N|a@q3H>d zvf*K{1xazHrFf+)j0^(#Nm;4MCB^zKsY#{j0r|!33=xbByvg}Rsrq55$tC$kMlM_o z;S5nc46F>%j0~(AE-sp3TnwQMu^^GS$ucY&TnQj2CNeUJYfPTNCc*=f=VeIdVMt*} zot(#_DUr^@kio#l$iSMMlbTp0#K6dq1#)ioN$7%Ca6Ci}A5aMv)@vNP22Fw`?NOrFA;#NEWu%+Aol z!_dmmHkpyln4^iIgNLD$p=+`Y+pNj=*xc9{%NZFMJtv#7+wt)Rmn0@<`z98IBqrsg zZZ2XsWaQh##ju%S3p>MB9)@iU+c$6IU}5yy$;cq8;R6oroW#6zeSdH;S!;&zvoq`l z#n&DlhSdyf1Q-(e*%|hO1P<^ptYk=JWZ?14%S$bC&PgmTPAz69XA+Q7+C8W7#KXXwlSCsaAs(2W3Uzw$XLQ43}V^I3UKBK2xQnU zXAl4>u$2)I$PwVou+!egV0VDQ#fk;wVl7D)nOzKS3=G>Cyg&|TW&k-{iGhQGfx&`7 zkin8cjKPXQk->&Rjlq^dkHLY#oWY5~oxvIGU=N0Rb_O{HW`?N@(-@c-#2C04rZY?f zhmHr-7Yqy@3^N#JGB7fzF(^UR=`lz_)tNI0GR$I_&A`Gihk=2CgMmr$F9Q!FBiPS@ zP=C6E{msC@t);!4!B0zj8$%GtrA%O#*7HGaV`cDU;9~FsJ4=j#2^?#Xa0JC4#088D za~bAAO$}n;0;`hJ+RYFeslA&aJW_-~TZBP-J457lhL~*(@d!&GDgzlL8G?|^mjd}P zf&m1i80Ir9U;sIr8=g!|7?>Cs85kJYv{<$>u%jCm!NAH82{w!eq6%af0|Nsi!$OD& zljre@)hB^cmB==RG;mbyV#ox?lNR$<26nA&3^@oxr5M;47#QLico-5Ggc%YU6c~~i zR2h;PG#OHmEYX5nvWTGy8V+92(B<2~kiU(g)JI!u2Sc^?25=g#2c-o_0B19>GvqMv zFyw-bg9I=i)Hrqqc80|aOThkL%CHP-us)d2z`&}tg@Jty*gTMNpj^bjPzW{#;&oQ2 zF^mjO42e+9PGDC}-oz&ab^{~=Dj7H#s=yi{_H#isGB9v4EN583z$m~3%JfhptiVPv zFtBNBZDVLe1Qo;qiAd(K!OdY~SOqm_HNzT+IrR(y3@i*Rpwy|WEu*!Kp&i{QC$Ldk z5H)b4IKb%|lmIxOsUDQR*D|bNU}j)uSO*S|^$ehJ26<*912e-8hFuJM86d2E40{<4 SGJrhB$;fbs;RwSq21x(_@g`OP diff --git a/target/classes/objects/ships/Turret.class b/target/classes/objects/ships/Turret.class index 2cc59bb9f814f70f9974035ac3e5f9de6730b535..6b61a94902281595bb07d2c4f07540642ac9d1b6 100644 GIT binary patch delta 627 zcmcaEy;z#-)W2Q(7#J9=7!GaZQfFmmXP7ZLj#YwVI>Rg;23CgIlj~T`+2-;v%ww3p zc{i&k6YBy7MuvrxIXNsD7fp8NQ08CEz`$U~z{bG9puw<&Vd>;j4olW$U^SaLEEpF} ze#0TJ3Q{A+z{J47pbk>Q00Qa^!VDq|j0}tn%NbUH)NeN6lxJjIG&z7PxgMmUg@Ko0 zD}yt`N(LSVZiamfRt&2cco=vX7BIvytY+Y0;9_842!odhgV%P3CP|*{3^TVe%xU3dT>d|MBLf2i zGs7YV1_mz%p~;hY9O@Yv8NwOa8B!QP{_bPoV>rm*z_5!!kAa8bDT55dZU#LDUWR6d zI&fHUF?2JOfy08EA)jFeI4n3p4uXdT2iV_?3<3;4!2V`pP+)ig_BS(wA;WdBzgZY8 z8P0?K&C1~8$Z#C&aW)2bhJy@y81^!-GvqML0fztw!*&J+26+bN{|xyITV@S9=cF9ucy4u*XU`$0i8c_FW?B*=4Ipg3R;e^QfCd|V#sBf!NV|L$u7#UVGtO1#{nT=DPk#X5%HLm1(kcJipUWTm<&J1fAco?`D z_Ayv7tYhF|;9*$65XZ2dfro*Mfq{_^W*j3Q!v=HZyEtU}jKZ zc*U@lfro*G!Ia@9!!`zx_uUvyFl=YwVPIqMXV}lMgMo*Eogso@8^cZp9tI8`hJJ>6 zhFuIi44e$RCyQ{a3-4jr3vwd^1Cu%f7Xu&2n#q3L<z`(%F018b%2I0v`JP!2?uNjgV*%`tac^T5c!Pv*Z$8eCrjbR^y z9s>`KU}wl-SOg9q4u;*6 w9eCyWrvGAKW#C{q#BdlCOp|kYWhFu0-~z=1gD3+VgBSxN!x07s1}28102-N-_y7O^