From 5b10e60950b46b6778b8846795dfa678fe8770d8 Mon Sep 17 00:00:00 2001 From: "julien.bouin.etu" <julien.bouin.etu@univ-lille.fr> Date: Sun, 7 Apr 2024 10:43:31 +0200 Subject: [PATCH] debut du scoreboard --- client/public/css/main.css | 6 +- client/public/index.html | 47 ++--- client/src/main.js | 29 ++- client/src/render.js | 35 ++++ client/src/scoreboard.json | 101 +++++++++-- common/avatar.js | 4 +- server/ScoreBoard.js | 30 ++++ server/gameLogic.js | 144 --------------- server/index.js | 355 +++++++++++++++++-------------------- 9 files changed, 366 insertions(+), 385 deletions(-) create mode 100644 server/ScoreBoard.js delete mode 100644 server/gameLogic.js diff --git a/client/public/css/main.css b/client/public/css/main.css index 82754b6..fedccf3 100644 --- a/client/public/css/main.css +++ b/client/public/css/main.css @@ -61,9 +61,7 @@ button { text-align: center; text-decoration: none; transition: all .15s; - user-select: none; - -webkit-user-select: none; - touch-action: manipulation; + } button:hover { @@ -160,6 +158,4 @@ section .air.air4{ 100%{ background-position-x: -1000px; } -}.hidden { - display: none; } \ No newline at end of file diff --git a/client/public/index.html b/client/public/index.html index abdd408..41ec37b 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -2,30 +2,35 @@ <html> <head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>ça geek</title> + <title>ça geek</title> <link rel="shortcut icon" href="images/favicon.ico" /> - <link rel="stylesheet" href="css/main.css" /> + <link rel="stylesheet" href="css/main.css" /> - <script src="build/main.bundle.js" defer></script> + <script src="build/main.bundle.js" defer></script> </head> + <body> - <section class='animation'> - <div class='air air1'></div> - <div class='air air2'></div> - <div class='air air3'></div> - <div class='air air4'></div> - <div class="vide"></div> - <div class="divMain"> - <h1>ça geek</h1> - <button class="buttonStart">Play</button> - <button class="scoreBoard">ScoreBoard</button> - <button class="credits">Credits</button> - </section> - </div> - - <canvas class="gameCanvas" style="display: none;"></canvas> + <section class='animation'> + <div class='air air1'></div> + <div class='air air2'></div> + <div class='air air3'></div> + <div class='air air4'></div> + <div class="vide"></div> + <div class="divMain"> + <h1>ça geek</h1> + <!-- Champ d'entrée pour le pseudo --> + <div id="pseudoInput" contenteditable="true" placeholder="Entrez votre pseudo"></div> + + <button class="buttonStart">Play</button> + <button class="scoreBoard">ScoreBoard</button> + <button class="credits">Credits</button> + </div> + </section> + + <canvas class="gameCanvas" style="display: none;"></canvas> </body> -</html> \ No newline at end of file + +</html> diff --git a/client/src/main.js b/client/src/main.js index 142b376..260b5f8 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -47,6 +47,21 @@ function startGame(event) { socket.emit('canvasSize', canvasSize); } +document.querySelector('.buttonStart').addEventListener('click', inputPseudo); + +function inputPseudo(event) { + const pseudo = prompt('Veuillez saisir votre pseudo :'); + + if (pseudo !== null && pseudo.trim() !== '') { + socket.emit('pseudo', pseudo); + + const canvasSize = affichage.startGame(event, canvas); + socket.emit('canvasSize', canvasSize); + } else { + alert('Veuillez saisir un pseudo valide'); + } +} + const canvasResizeObserver = new ResizeObserver(() => resampleCanvas()); canvasResizeObserver.observe(canvas); @@ -62,6 +77,12 @@ function render() { context.clearRect(0, 0, canvas.width, canvas.height); renderObject.renderBackground(canvas); gameStarted = affichage.isGameStarted(); + socket.on('enemis', data => { + newEnemis = data; + }); + socket.on('bonusArray', data => { + newBonus = data; + }); if (gameStarted) { context.font = '40pt New Super Mario Font U'; @@ -90,10 +111,6 @@ function renderProjectiles() { } function renderBonuses() { - socket.on('bonusArray', data => { - newBonus = data; - }); - newBonus.forEach(bonus => { const img = new Image(); img.src = bonusImages[bonus.choix]; @@ -104,10 +121,6 @@ function renderBonuses() { } function renderEnemies() { - socket.on('enemis', data => { - newEnemis = data; - }); - newEnemis.forEach(enemi => { renderObject.renderEnnemi(canvas, context, enemi.x, enemi.y, enemi); }); diff --git a/client/src/render.js b/client/src/render.js index e9343b3..b341703 100644 --- a/client/src/render.js +++ b/client/src/render.js @@ -78,4 +78,39 @@ export default class Render { .getContext('2d') .drawImage(this.background, 0, 0, canvas.width, canvas.height); } + renderProjectiles(context, avatars) { + for (const avatarId in avatars) { + const avatar = avatars[avatarId]; + context.drawImage(avatar.image, avatar.x, avatar.y); + if (avatar.projectiles) { + avatar.projectiles.forEach(projectile => { + context.drawImage(this.imageProjectile, projectile.x, projectile.y); + }); + } + } + } + + renderBonuses(canvas, context, bonuses) { + bonuses.forEach(bonus => { + let img = new Image(); + img.src = bonusImages[bonus.choix]; + img.width = 75; + img.height = 75; + draw(canvas, context, img, bonus.x, bonus.y); + }); + } + + renderEnemies(canvas, context, enemies) { + enemies.forEach(enemy => { + let image; + if (enemy.difficulté == 1) { + image = this.imageEnemi; + } else if (enemy.difficulté == 2) { + image = this.imageEnemi2; + } else if (enemy.difficulté == 3) { + image = this.imageEnemi3; + } + draw(canvas, context, image, enemy.x, enemy.y); + }); + } } diff --git a/client/src/scoreboard.json b/client/src/scoreboard.json index b0486a3..9db723e 100644 --- a/client/src/scoreboard.json +++ b/client/src/scoreboard.json @@ -1,17 +1,86 @@ { - "results": [ - { - "nom": "Joueur 1", - "score": 100 - }, - { - "nom": "Joueur 2", - "score": 200 - }, - { - "nom": "Joueur 3", - "score": 150 - } - ] - } - \ No newline at end of file + "results": [ + { + "nom": "Joueur 1", + "score": 100 + }, + { + "nom": "Joueur 2", + "score": 200 + }, + { + "nom": "Joueur 3", + "score": 150 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "nom": "Joueur 4", + "score": 180 + }, + { + "score": -15 + }, + { + "score": -10 + }, + { + "nom": "julien", + "score": -15 + } + ] +} \ No newline at end of file diff --git a/common/avatar.js b/common/avatar.js index 809a10b..c962f44 100644 --- a/common/avatar.js +++ b/common/avatar.js @@ -15,8 +15,9 @@ export class Avatar extends Entite { statut; statutTime; spectateur; + pseudo; - constructor(nom, id, canvasSize) { + constructor(nom, id, canvasSize, pseudo) { super(0, 0, new Hitbox(68, 145, 0, 0), null); this.nom = nom; this.score = 0; @@ -30,6 +31,7 @@ export class Avatar extends Entite { this.canvasSize = canvasSize; this.id = id; this.spectateur = false; + this.pseudo = pseudo; } setSpectateur() { diff --git a/server/ScoreBoard.js b/server/ScoreBoard.js new file mode 100644 index 0000000..fd04dcb --- /dev/null +++ b/server/ScoreBoard.js @@ -0,0 +1,30 @@ +import fs from 'fs'; + +export class GestionScore { + constructor(jsonFilePath) { + this.jsonFilePath = jsonFilePath; + } + + afficherScores() { + try { + const data = fs.readFileSync(this.jsonFilePath); + const scores = JSON.parse(data); + console.log('Scores actuels :'); + console.log(scores.results); + } catch (error) { + console.error('Erreur lors de la lecture du fichier JSON :', error); + } + } + + ajouterScore(nom, score) { + try { + const data = fs.readFileSync(this.jsonFilePath); + const scores = JSON.parse(data); + scores.results.push({ nom: nom, score: score }); + fs.writeFileSync(this.jsonFilePath, JSON.stringify(scores, null, 2)); + console.log('Score ajouté avec succès !'); + } catch (error) { + console.error("Erreur lors de l'ajout du score :", error); + } + } +} diff --git a/server/gameLogic.js b/server/gameLogic.js deleted file mode 100644 index 13b80cc..0000000 --- a/server/gameLogic.js +++ /dev/null @@ -1,144 +0,0 @@ -import timer from './timer.js'; - -export function updateGame( - io, - enemis, - bonusArray, - avatars, - canvasSize, - t, - firstAvatar, - gameStarted, - cptConnexion -) { - io.emit('enemis', enemis); - io.emit('bonusArray', bonusArray); - - const areAvatarsActive = avatars.some(avatar => !avatar.spectateur); - - if (firstAvatar && areAvatarsActive) { - handleActiveAvatars(io, avatars, updateAvatar, canvasSize, t); - } else { - endGame(io, t, avatars, gameStarted, cptConnexion); - } -} - -export function handleActiveAvatars(io, avatars, updateAvatar, canvasSize, t) { - const avatarData = []; - avatars.forEach(avatar => { - updateAvatar(avatar, avatarData, canvasSize, t); - }); - io.emit('avatarsData', avatarData); -} - -export function updateAvatar(avatar, avatarData, canvasSize, t, enemis) { - avatar.canvasSize = canvasSize; - if ( - avatar.getStatut() === 'invincibilite' && - t.getTotalTime() - avatar.getStatutTime() === 15 - ) { - avatar.setStatut('null'); - } - - avatar.projectiles.forEach(projectile => projectile.deplacer()); - - if (!avatar.spectateur) { - avatarData.push({ - id: avatar.id, - x: avatar.getX(), - y: avatar.getY(), - projectiles: avatar.projectiles, - vies: avatar.getVies(), - score: avatar.getScore(), - socketId: avatar.nom, - }); - } - - handleAvatarEnemiCollisions(avatar, enemis); - handleAvatarBonusCollisions(avatar, t); -} - -export function handleAvatarEnemiCollisions(avatar, enemis) { - enemis.forEach(enemi => { - if ( - enemi.hitbox.colision(avatar.hitbox) && - avatar.getStatut() !== 'invincibilite' - ) { - handleAvatarEnemiCollisionEffects(avatar, enemi); - } - - if (enemi.getVies() < 0) { - avatar.incrementScore(5); - enemis.splice(enemis.indexOf(enemi), 1); - } - - enemi.deplacer(); - - avatar.projectiles.forEach(projectile => { - if (projectile.hitbox.colision(enemi.hitbox)) { - avatar.projectiles.splice(avatar.projectiles.indexOf(projectile), 1); - handleProjectileEnemiCollisionEffects(enemi); - } - }); - }); -} - -export function handleAvatarEnemiCollisionEffects(avatar, enemi) { - avatar.decrementScore(5); - enemis.splice(enemis.indexOf(enemi), 1); - avatar.perdreVie(); - - if (canLostLifeAvatar) { - canLostLifeAvatar = false; - setTimeout(() => { - canLostLifeAvatar = true; - }, 100); - } - - if (avatar.getVies() === 0) { - avatar.setSpectateur(); - io.emit('dead', avatar.id); - } -} - -export function handleProjectileEnemiCollisionEffects(enemi) { - enemi.perdreVie(); - - if (canLostLifeEnemi) { - canLostLifeEnemi = false; - setTimeout(() => { - canLostLifeEnemi = true; - }, 1000 / 60); - } -} - -export function handleAvatarBonusCollisions(avatar, t) { - bonusArray.forEach(bonus => { - if (bonus.hitbox.colision(avatar.hitbox)) { - handleBonusCollisionEffects(avatar, bonus, t); - } - - if (bonus.estExpire(t.getTotalTime())) { - bonusArray.splice(bonusArray.indexOf(bonus), 1); - } - }); -} - -export function handleBonusCollisionEffects(avatar, bonus, t) { - if (bonusNoms[bonus.getChoix()] === 'vie') { - avatar.gagnerVie(); - } else if (bonusNoms[bonus.getChoix()] === 'invincibilite') { - avatar.setStatut('invincibilite'); - avatar.setStatutTime(t.getTotalTime()); - } - - bonusArray.splice(bonusArray.indexOf(bonus), 1); -} - -export function endGame(io, t, avatars, gameStarted, cptConnexion) { - gameStarted = false; - cptConnexion = 0; - t = new timer(); - avatars.length = 0; - io.emit('endGame', true); -} diff --git a/server/index.js b/server/index.js index 11a5c5d..2f86d3c 100644 --- a/server/index.js +++ b/server/index.js @@ -1,4 +1,3 @@ -// server.js import express from 'express'; import http from 'http'; import addWebpackMiddleware from './middlewares/addWebpackMiddleware.js'; @@ -9,34 +8,31 @@ import { Coordinate } from '../common/Coordinate.js'; import timer from './timer.js'; import Bonus from './bonus.js'; import { bonusImages, bonusNoms, bonusTaille } from '../common/utils.js'; +import { GestionScore } from './ScoreBoard.js'; const app = express(); -const httpServer = http.createServer(app); -const io = new IOServer(httpServer); -const canvasSize = new Coordinate(1920, 1261); -let gameStarted = false; -let t = new timer(); +let canvasSize = new Coordinate(1920, 1261); + let canLostLifeAvatar = true; let canLostLifeEnemi = true; -let firstAvatar = false; -let cptConnexion = 0; -let canShoot = true; -let LVL2start = false; -let LVL3start = false; -const avatars = []; -const enemis = []; -const bonusArray = []; +let gameStarted = false; + +let t = new timer(); + +const httpServer = http.createServer(app); +const fileOptions = { root: process.cwd() }; +addWebpackMiddleware(app); + +const io = new IOServer(httpServer); app.use(express.static('client/public')); -const port = process.env.PORT == null ? 8000 : process.env.PORT; +const port = process.env.PORT == null ? 8000 : process.env.PORT; httpServer.listen(port, () => { console.log(`Server running at http://localhost:${port}/`); }); -addWebpackMiddleware(app); - setInterval(function () { if (gameStarted) { t.addTime(); @@ -46,87 +42,109 @@ setInterval(function () { } }, 1000); +const avatars = []; +const enemis = []; +const bonusArray = []; + +let cpt = 0; +let canShoot = true; +let LVL2start = false; +let LVL3start = false; +let firstAvatar = false; +const gestionScore = new GestionScore('client/src/scoreboard.json'); + io.on('connection', socket => { - cptConnexion++; - if (cptConnexion <= 4) { + cpt++; + if (cpt <= 4) { firstAvatar = true; - const avatar = new Avatar(`${socket.id}`, cptConnexion); - io.emit('newAvatar', { - id: cptConnexion, - x: avatar.getX(), - y: avatar.getY(), - }); + const avatar = new Avatar(`${socket.id}`, cpt); + io.emit('newAvatar', { id: cpt, x: avatar.getX(), y: avatar.getY() }); avatars.push(avatar); + socket.on('pseudo', pseudo => { + avatar.pseudo = pseudo; + }); socket.on('disconnect', () => { - const disconnectedAvatarIndex = avatars.findIndex( - avatar => avatar.nom === socket.id - ); - if (disconnectedAvatarIndex !== -1) { - io.emit('disconnectEvent', avatars[disconnectedAvatarIndex].id); - avatars.splice(disconnectedAvatarIndex, 1); - } - console.log(`Client disconnected: ${socket.id}`); + avatars.forEach(avatar => { + if (avatar.nom == socket.id) { + io.emit('disconnectEvent', avatar.id); + avatars.splice(avatars.indexOf(avatar), 1); + } + }); + console.log(`Déconnexion du client ${socket.id}`); }); socket.on('start', s => { - if (s && cptConnexion !== 0) { + if (s == true && cpt != 0) { gameStarted = s; - } else if (cptConnexion === 0) { + } else if (cpt == 0) { gameStarted = false; } }); - // Handling click events socket.on('clickEvent', clickEvent => { const playerAvatar = avatars.find(avatar => avatar.nom === clickEvent.id); if (playerAvatar) { playerAvatar.click[clickEvent.key] = clickEvent.pressed; } else { - console.log(`No avatar found with the name ${clickEvent.id}`); + console.log(`Aucun avatar trouvé avec le nom ${clickEvent.id}`); } }); socket.on('shoot', shoot => { const playerAvatar = avatars.find(avatar => avatar.nom === shoot.id); - if (canShoot && playerAvatar) { + + if (canShoot) { playerAvatar.tirer(); canShoot = false; - setTimeout(() => { + setTimeout(function () { canShoot = true; }, 200); } }); socket.on('canvasSize', canvasSize => { + console.log(canvasSize); canvasSize = canvasSize; }); } }); -const spawnIntervals = [ - { delay: 1000, startCondition: () => gameStarted }, - { delay: 800, startCondition: () => LVL2start && gameStarted }, - { delay: 4000, startCondition: () => LVL3start && gameStarted }, -]; - -spawnIntervals.forEach(({ delay, startCondition }, index) => { - setInterval(() => { - if (startCondition()) { - let randomY = - Math.random() * (canvasSize.height - (index === 0 ? 0 : 100)); - const newEnemy = new enemi( - canvasSize.width - (index === 0 ? 0 : 100), - randomY, - index, - index + 1 - ); - enemis.push(newEnemy); +let spawnIntervalLV1 = setInterval(() => { + if (gameStarted) { + if (t.getMin() >= 1) { + LVL2start = true; + } + if (t.getSec() >= 30) { + LVL3start = true; } - }, delay); -}); -setInterval(() => { + let randomY = Math.random() * (canvasSize.height - 0) + 0; + do { + randomY = Math.random() * (canvasSize.height - 0) + 0; + } while (randomY > canvasSize.height - 57); + const newEnemy = new enemi(canvasSize.width, randomY, 0, 1); + enemis.push(newEnemy); + } +}, 1000); + +let spawnIntervalLV2 = setInterval(() => { + if (LVL2start && gameStarted) { + let randomY = Math.random() * (canvasSize.height - 100); + const newEnemy = new enemi(canvasSize.width - 100, randomY, 1, 2); + enemis.push(newEnemy); + } +}, 800); + +let spawnIntervalLV3 = setInterval(() => { + if (LVL3start && gameStarted) { + let randomY = Math.random() * (canvasSize.height - 100); + const newEnemy = new enemi(canvasSize.width - 100, randomY, 1, 3); + enemis.push(newEnemy); + } +}, 4000); + +let spawnBonusInterval = setInterval(() => { if (gameStarted) { let randomX; let randomY; @@ -143,140 +161,97 @@ setInterval(() => { }, 15000); setInterval(() => { - updateGame(); -}, 1000 / 60); - -function updateGame() { io.emit('enemis', enemis); io.emit('bonusArray', bonusArray); - const areAvatarsActive = avatars.some(avatar => !avatar.spectateur); + let areAvatarsActive = avatars.some(avatar => !avatar.spectateur); if (firstAvatar && areAvatarsActive) { - handleActiveAvatars(); - } else { - endGame(); - } -} - -function handleActiveAvatars() { - const avatarData = []; - avatars.forEach(avatar => { - updateAvatar(avatar, avatarData); - }); - io.emit('avatarsData', avatarData); -} - -function updateAvatar(avatar, avatarData) { - avatar.canvasSize = canvasSize; - if ( - avatar.getStatut() === 'invincibilite' && - t.getTotalTime() - avatar.getStatutTime() === 15 - ) { - avatar.setStatut('null'); - } - - enemis.forEach(enemi => { - handleAvatarEnemiCollisions(avatar, enemi); - }); - - avatar.deplacer(); - avatar.projectiles.forEach(projectile => projectile.deplacer()); - - if (!avatar.spectateur) { - avatarData.push({ - id: avatar.id, - x: avatar.getX(), - y: avatar.getY(), - projectiles: avatar.projectiles, - vies: avatar.getVies(), - score: avatar.getScore(), - socketId: avatar.nom, + let avatarData = []; + avatars.forEach(avatar => { + avatar.canvasSize = canvasSize; + if ( + avatar.getStatut() == 'invincibilite' && + t.getTotalTime() - avatar.getStatutTime() == 15 + ) { + avatar.setStatut('null'); + } + enemis.forEach(enemi => { + if ( + enemi.hitbox.colision(avatar.hitbox) && + avatar.getStatut() != 'invincibilite' + ) { + if (canLostLifeAvatar) { + avatar.decrementScore(5); + enemis.splice(enemis.indexOf(enemi), 1); + avatar.perdreVie(); + canLostLifeAvatar = false; + setTimeout(function () { + canLostLifeAvatar = true; + }, 100); + } + if (avatar.getVies() == 0) { + gestionScore.ajouterScore(avatar.pseudo, avatar.score); + avatar.setSpectateur(); + io.emit('dead', avatar.id); + } + } + if (enemi.getVies() < 0) { + avatar.incrementScore(5); + enemis.splice(enemis.indexOf(enemi), 1); + } + enemi.deplacer(); + avatar.colision(enemi.hitbox); + avatar.projectiles.forEach(projectile => { + if (projectile.hitbox.colision(enemi.hitbox)) { + avatar.projectiles.splice( + avatar.projectiles.indexOf(projectile), + 1 + ); + if (canLostLifeEnemi) { + enemi.perdreVie(); + canLostLifeEnemi = false; + setTimeout(function () { + canLostLifeEnemi = true; + }, 1000 / 60); + } + } + }); + }); + avatar.deplacer(); + avatar.projectiles.forEach(projectile => projectile.deplacer()); + if (!avatar.spectateur) { + avatarData.push({ + id: avatar.id, + x: avatar.getX(), + y: avatar.getY(), + projectiles: avatar.projectiles, + vies: avatar.getVies(), + score: avatar.getScore(), + socketId: avatar.nom, + }); + } + bonusArray.forEach(bonus => { + if (bonus.hitbox.colision(avatar.hitbox)) { + if (bonusNoms[bonus.getChoix()] == 'vie') { + avatar.gagnerVie(); + } else if (bonusNoms[bonus.getChoix()] == 'invincibilite') { + avatar.setStatut('invincibilite'); + avatar.setStatutTime(t.getTotalTime()); + } + bonusArray.splice(bonusArray.indexOf(bonus), 1); + } + if (bonus.estExpire(t.getTotalTime())) { + bonusArray.splice(bonusArray.indexOf(bonus), 1); + } + }); }); + io.emit('avatarsData', avatarData); + } else { + gameStarted = false; + cpt = 0; + t = new timer(); + avatars.length = 0; // Réinitialiser le tableau d'avatars + io.emit('endGame', true); } - - handleAvatarBonusCollisions(avatar); -} - -function handleAvatarEnemiCollisions(avatar, enemi) { - if ( - enemi.hitbox.colision(avatar.hitbox) && - avatar.getStatut() !== 'invincibilite' - ) { - handleAvatarEnemiCollisionEffects(avatar, enemi); - } - - if (enemi.getVies() < 0) { - avatar.incrementScore(5); - enemis.splice(enemis.indexOf(enemi), 1); - } - - enemi.deplacer(); - - avatar.projectiles.forEach(projectile => { - if (projectile.hitbox.colision(enemi.hitbox)) { - avatar.projectiles.splice(avatar.projectiles.indexOf(projectile), 1); - handleProjectileEnemiCollisionEffects(avatar, enemi); - } - }); -} - -function handleAvatarEnemiCollisionEffects(avatar, enemi) { - avatar.decrementScore(5); - enemis.splice(enemis.indexOf(enemi), 1); - avatar.perdreVie(); - - if (canLostLifeAvatar) { - canLostLifeAvatar = false; - setTimeout(() => { - canLostLifeAvatar = true; - }, 100); - } - - if (avatar.getVies() === 0) { - avatar.setSpectateur(); - io.emit('dead', avatar.id); - } -} - -function handleProjectileEnemiCollisionEffects(enemi) { - enemi.perdreVie(); - - if (canLostLifeEnemi) { - canLostLifeEnemi = false; - setTimeout(() => { - canLostLifeEnemi = true; - }, 1000 / 60); - } -} - -function handleAvatarBonusCollisions(avatar) { - bonusArray.forEach(bonus => { - if (bonus.hitbox.colision(avatar.hitbox)) { - handleBonusCollisionEffects(avatar, bonus); - } - - if (bonus.estExpire(t.getTotalTime())) { - bonusArray.splice(bonusArray.indexOf(bonus), 1); - } - }); -} - -function handleBonusCollisionEffects(avatar, bonus) { - if (bonusNoms[bonus.getChoix()] === 'vie') { - avatar.gagnerVie(); - } else if (bonusNoms[bonus.getChoix()] === 'invincibilite') { - avatar.setStatut('invincibilite'); - avatar.setStatutTime(t.getTotalTime()); - } - - bonusArray.splice(bonusArray.indexOf(bonus), 1); -} - -function endGame() { - gameStarted = false; - cptConnexion = 0; - t = new timer(); - avatars.length = 0; - io.emit('endGame', true); -} +}, 1000 / 60); -- GitLab