From 4e8324b033dd30b528839ac7ecf69a5ac7c10f0e Mon Sep 17 00:00:00 2001 From: hubourge Date: Wed, 11 Sep 2024 18:10:43 +0200 Subject: [PATCH] Game solo - Scale player when collision --- site/real_game/class/soloClass/Map.js | 187 +++++++++++++++----------- 1 file changed, 105 insertions(+), 82 deletions(-) diff --git a/site/real_game/class/soloClass/Map.js b/site/real_game/class/soloClass/Map.js index d691d86..7c99eb0 100644 --- a/site/real_game/class/soloClass/Map.js +++ b/site/real_game/class/soloClass/Map.js @@ -6,7 +6,7 @@ /* By: hubourge +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/28 12:23:48 by edbernar #+# #+# */ -/* Updated: 2024/09/11 17:19:26 by hubourge ### ########.fr */ +/* Updated: 2024/09/11 18:09:58 by hubourge ### ########.fr */ /* */ /* ************************************************************************** */ @@ -148,87 +148,6 @@ class Map }, 4000); } - static #collision() - { - let ballPosition; - let playerPosition; - let relativePosition; - let playerHalfExtents; - let sideTouched; - let random; - let step = 1; - - ballBody.addEventListener("collide", function(e) { - let relativeVelocity = e.contact.getImpactVelocityAlongNormal(); - - let bodyA = e.contact.bi; - let bodyB = e.contact.bj; - let collided = (bodyA === ballBody) ? bodyB : bodyA; - - switch(collided.name) { - case "wall": - vec3.z = -vec3.z; - return; - case "player1": - ballPosition = ballBody.position; - playerPosition = collided.position; - relativePosition = ballPosition.vsub(playerPosition); - playerHalfExtents = collided.shapes[0].halfExtents; - if (Math.abs(relativePosition.x) > playerHalfExtents.x) - sideTouched = (relativePosition.x > 0) ? 'right' : 'left'; - else if (Math.abs(relativePosition.z) > playerHalfExtents.z) - sideTouched = (relativePosition.z > 0) ? 'front' : 'back'; - if (sideTouched == 'front' || sideTouched == 'back') - { - vec3.z = -vec3.z; - return ; - } - - initialSpeed = Math.sqrt(vec3.x * vec3.x + vec3.z * vec3.z); - random = Math.random(); - if (random > 0.5) - { - vec3.z -= step; - vec3.x = Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); - } - else if (random < 0.5) - { - vec3.z += step; - vec3.x = Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); - } - return; - case "player2": - ballPosition = ballBody.position; - playerPosition = collided.position; - relativePosition = ballPosition.vsub(playerPosition); - playerHalfExtents = collided.shapes[0].halfExtents; - if (Math.abs(relativePosition.x) > playerHalfExtents.x) - sideTouched = (relativePosition.x > 0) ? 'right' : 'left'; - else if (Math.abs(relativePosition.z) > playerHalfExtents.z) - sideTouched = (relativePosition.z > 0) ? 'front' : 'back'; - if (sideTouched == 'front' || sideTouched == 'back') - { - vec3.z = -vec3.z; - return ; - } - - initialSpeed = Math.sqrt(vec3.x * vec3.x + vec3.z * vec3.z); - random = Math.random(); - if (random > 0.5) - { - vec3.z -= step; - vec3.x = -Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); - } - else if (random < 0.5) - { - vec3.z += step; - vec3.x = -Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); - } - return; - } - }); - } - static dispose() { if (spotLight) @@ -262,6 +181,110 @@ class Map ballBody.velocity.set(vec3.x * speed, vec3.y * speed, vec3.z * speed); } + static #collision() + { + let ballPosition; + let playerPosition; + let relativePosition; + let playerHalfExtents; + let sideTouched; + let random; + let step = 1; + + ballBody.addEventListener("collide", function(e) { + let relativeVelocity = e.contact.getImpactVelocityAlongNormal(); + + let bodyA = e.contact.bi; + let bodyB = e.contact.bj; + let collided = (bodyA === ballBody) ? bodyB : bodyA; + + switch(collided.name) { + case "wall": + vec3.z = -vec3.z; + return; + case "player1": + scalePlayer(player1); + ballPosition = ballBody.position; + playerPosition = collided.position; + relativePosition = ballPosition.vsub(playerPosition); + playerHalfExtents = collided.shapes[0].halfExtents; + if (Math.abs(relativePosition.x) > playerHalfExtents.x) + sideTouched = (relativePosition.x > 0) ? 'right' : 'left'; + else if (Math.abs(relativePosition.z) > playerHalfExtents.z) + sideTouched = (relativePosition.z > 0) ? 'front' : 'back'; + if (sideTouched == 'front' || sideTouched == 'back') + { + vec3.z = -vec3.z; + return ; + } + + initialSpeed = Math.sqrt(vec3.x * vec3.x + vec3.z * vec3.z); + random = Math.random(); + if (random > 0.5) + { + vec3.z -= step; + vec3.x = Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); + } + else if (random < 0.5) + { + vec3.z += step; + vec3.x = Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); + } + return; + case "player2": + scalePlayer(player2); + ballPosition = ballBody.position; + playerPosition = collided.position; + relativePosition = ballPosition.vsub(playerPosition); + playerHalfExtents = collided.shapes[0].halfExtents; + if (Math.abs(relativePosition.x) > playerHalfExtents.x) + sideTouched = (relativePosition.x > 0) ? 'right' : 'left'; + else if (Math.abs(relativePosition.z) > playerHalfExtents.z) + sideTouched = (relativePosition.z > 0) ? 'front' : 'back'; + if (sideTouched == 'front' || sideTouched == 'back') + { + vec3.z = -vec3.z; + return ; + } + + initialSpeed = Math.sqrt(vec3.x * vec3.x + vec3.z * vec3.z); + random = Math.random(); + if (random > 0.5) + { + vec3.z -= step; + vec3.x = -Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); + } + else if (random < 0.5) + { + vec3.z += step; + vec3.x = -Math.sqrt(initialSpeed * initialSpeed - vec3.z * vec3.z); + } + return; + } + }); + + function scalePlayer(player) + { + const value = 0.01; + + for (let i = 1; i < 10; i++) + { + setTimeout(() => { + player.scale.z += value; + player.scale.x += value * 2; + }, i * 10); + } + + for (let i = 10; i < 20; i++) + { + setTimeout(() => { + player.scale.z -= value; + player.scale.x -= value * 2; + }, i * 10); + } + } + } + static reCreate(player1Lose) { onUpdate = true;