From 8add12d4c303d1475d9e9275043b977f1b9e0c08 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 28 Aug 2020 16:09:47 +0200 Subject: [PATCH] Fixed collision detection --- client/src/components/Game.vue | 16 +++++++++------- .../gltronic/tronio/business/GameManager.java | 13 ++++++++++++- .../main/java/gltronic/tronio/model/Game.java | 2 ++ .../tronio/business/GameManager.class | Bin 8071 -> 8164 bytes .../classes/gltronic/tronio/model/Game.class | Bin 2179 -> 2417 bytes 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/client/src/components/Game.vue b/client/src/components/Game.vue index 87f50ef..e2ae49d 100644 --- a/client/src/components/Game.vue +++ b/client/src/components/Game.vue @@ -93,9 +93,10 @@ export default { this.context.stroke() }, renderDebug (player) { - this.context.beginPath() const canvasX = this.canvas.width / 2 const canvasY = this.canvas.height / 2 + /* + this.context.beginPath() this.context.lineTo(canvasX, canvasY) this.context.lineTo(this.mouse.x, this.mouse.y) this.context.lineWidth = 1 @@ -111,12 +112,6 @@ export default { this.context.strokeStyle = 'yellow' this.context.stroke() - this.context.beginPath() - this.context.arc(this.mouse.x, this.mouse.y, 25, 0, 2 * Math.PI, false) - this.context.lineWidth = 1 - this.context.strokeStyle = 'yellow' - this.context.stroke() - const canvasX2 = this.canvas.width / 2 const canvasY2 = this.canvas.height / 2 this.context.beginPath() @@ -124,11 +119,18 @@ export default { this.context.lineWidth = 1 this.context.strokeStyle = 'purple' this.context.stroke() + */ this.context.fillText('player x: ' + player.x + ' y:' + player.y, 10, 10) this.context.fillText('a:' + player.angle + ' a_t' + player.targetAngle, 10, 20) this.context.fillText('canvasX: ' + canvasX + ' canvasY:' + canvasY, 10, 30) this.context.fillText('walls: ' + player.walls.length, 10, 40) + + this.context.beginPath() + this.context.arc(this.mouse.x, this.mouse.y, 25, 0, 2 * Math.PI, false) + this.context.lineWidth = 1 + this.context.strokeStyle = player.color + this.context.stroke() }, mouseEvent (event) { var rect = this.canvas.getBoundingClientRect() diff --git a/server/src/main/java/gltronic/tronio/business/GameManager.java b/server/src/main/java/gltronic/tronio/business/GameManager.java index 7dab49a..b70ee04 100644 --- a/server/src/main/java/gltronic/tronio/business/GameManager.java +++ b/server/src/main/java/gltronic/tronio/business/GameManager.java @@ -71,6 +71,9 @@ public class GameManager implements IGameManager { // COLLISIONS game.getPlayers().forEach((id2, player2) -> { for (var i = 0; i < player2.getWalls().size() - 2; i++) { + // Pour evité la collision avec un mur venant d'être placé par le même joueur + if (id.equals(id2) && i >= player2.getWalls().size() - 4) break; + Wall wallA = player2.getWalls().get(i); Wall wallB = player2.getWalls().get(i + 1); if (isCloseToWall(wallA.getX(), wallA.getY(), wallB.getX(), wallB.getY(), player.getX(), player.getY(), @@ -101,7 +104,11 @@ public class GameManager implements IGameManager { player.setY(player.getY() + game.getSettings().getPlayerSpeed() * Math.sin(player.getAngle())); }); - SocketUtils.broadcast(game, "gameUpdate", new ObjectMapper().writeValueAsString(game.getPlayers().values())); + // Broadcast une fois sur deux + if (game.isUpdateNeeded()) { + SocketUtils.broadcast(game, "gameUpdate", new ObjectMapper().writeValueAsString(game.getPlayers().values())); + game.setUpdateNeeded(false); + } else game.setUpdateNeeded(true); } private void killPlayer(String id) { @@ -127,11 +134,15 @@ public class GameManager implements IGameManager { } private boolean isCrossingLine (double xa, double ya, double xb, double yb, double xc, double yc, double radius) { + /* var a = xc - xa; var b = xb - xa; var c = yc - ya; var d = yb - ya; var result = (a * d - b * c) / Math.sqrt(Math.pow(xa - xb, 2) + Math.pow(ya - yb, 2)); + */ + + var result = Math.abs((yb - ya) * xc - (xb - xa) * yc + xb * ya - yb * xa)/ Math.sqrt(Math.pow(xb - xa, 2) + Math.pow(yb - ya, 2)); return result < radius; } diff --git a/server/src/main/java/gltronic/tronio/model/Game.java b/server/src/main/java/gltronic/tronio/model/Game.java index 174613a..9b6e17c 100644 --- a/server/src/main/java/gltronic/tronio/model/Game.java +++ b/server/src/main/java/gltronic/tronio/model/Game.java @@ -16,8 +16,10 @@ public class Game { private Map players; private Map sessions; private GameSettings settings; + private boolean updateNeeded; public Game() { + this.updateNeeded = false; this.players = new HashMap<>(); this.sessions = new HashMap<>(); this.settings = new GameSettings(); diff --git a/server/target/classes/gltronic/tronio/business/GameManager.class b/server/target/classes/gltronic/tronio/business/GameManager.class index 5202f6d081acacd4197b64ba6709865fe4e90fb3..6644b40cc18db293245cda291c69372dfeb87c0b 100644 GIT binary patch delta 3019 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 A@c;k- diff --git a/server/target/classes/gltronic/tronio/model/Game.class b/server/target/classes/gltronic/tronio/model/Game.class index f42f6411b324efe6f223241c692a4a67b12b6e53..f4e57ec0d6ce8368633633c6b7737141b6f6880d 100644 GIT binary patch literal 2417 zcmbVN+j1L45Irl&k|nRNQIt5c6D4I5SpgOTR3J7+#wIZ!JI3qC#PG6`Ch{iIu4;Eg zD*OaL!UI%cr3wl@fRCc+p0O^z1Peb{JJZv1PWS1a_TT^f{uhAz_%4Bnfot`K41CY6 zTI%ClO}{1@)+47W5{Ma?dhYz-SPjRkTaPQxMO7L|v>MJU5rhUNOX{>O-G;U4w3ZAc zZMW_@vK2D_eth8Kk5e#IW#&cvuWuXfKM%Y`1ET6k9^nM9qM)Zy>(x zdahhC5X~=^4aC++#1x{qWMUFiNf@|nVjL3*Trn`+7j44{4@kHaGPuNE*G!Bc&Z{{S zNyHPlZs6A0Dh)=J!n_8!X<`g!y!ca*Y7DUbEfcqKhr$kpTn&Wh*zS*1omhT-u^cZh zC_m+R*TmcGI8Khb1ne0vY7gb|o{9I_WuouWA{m(G0}~(e(M<1Xw;gykAIFQiKFh}@ zK4HHx^4oJ74b746JA7(lr5gr2JW*wwYBwt)*mWumN@1qtSDi-L30&SE8DsLm zrCQGYM=hy_sd_g@@}15v9`7x3SUYLEQ2UM%%~7)vPk9*3i}bLj>9+B0qB*~1D8~sm z)Z%tqnYx#nIn}Em#XOTgAr1HU`U&F&v|*Uc@%p`Lb!#}aDdd4)+jjUBOEqe^UHVGy z4H3Zq7m{PrJY6a82J_g!b?lJ!d*twpQZCXxQ-_OHd`>%hvRJ1Sb@E@Rlq|AxN+U!&`wJ~1U_#b} zuNT#?a_E6P8~}NA3M4xm$OgV73Kn%Rg4}SIzrxpNTu%Q?Xy=Dt!X}kbYp|svDABD5 z-HjLSQXN_K=zs|0N`#E|I1+&c(v9?(ytT?~8Ktnc$ueTlhP&pQ0kWObWZ7ZKbe9g2 zCF#FSk1VOkZ0u5$tm%WnjB-pesLPu&;@0m$jw#3|D4&ANQr`~?$*-sfIZluf?5SwJ M#Z&rno9zSt0*W326g@4;k|mF0TX?~avf?DNLOf8ciHwnvNdm};lQDAf*pfT)B%>MCOp8?b z34R5t5~T{N_y9hN;@)X%vEvZo2aWFSK7G#Jy8r&?kG}wX0Vjimz)H*0Vc@$>JN^so zc5t9P`<`s83{nEKPvy_j_N3pkA2yz+V1iYdL}`mWv-NEX-X0;wuhEQciKEKK8E z2JZ>X4eN4WMu$|J9P*gULSWIt1k!B1Zy}3x1}g$rPcOu%a1P6c;DUuISn0~I6>1~E z>sKsX#Rmdbr1Vy(eCfEqPyKAlhbo_1_>6H=gxi;%XEf%AfZG=C^uu7lkDUXlDd3r! z>#GOdc0+}GvfgX@^`g^n*6fbb zhrz+Fw0{H(GHY6u0s+DehkRVke9$D z{pd*;_&M_FuG3zI*64Ae?+ke_>7=0lM(H(XOMfE&(`(GX!otv8B6FEm&%Z*U^b&=6 zToa?JO=&+FnsFY