User prompt
Lasset de fond du jeu doit prendre tout le fond du jeu
User prompt
Je veux personnalisé le fond de jeu avec mon propre asset
User prompt
Ajoute 50 nouvelles situations de discrimination
User prompt
Fait en sorte que la musique de fond en boucle bgmusic se joue dans le jeu
Code edit (1 edits merged)
Please save this source code
User prompt
Fait en sorte que la musique se joue réellement dans le jeu
User prompt
Ajoute une musique de fond en boucle au jeu
User prompt
Ajoute plus de situations au jeu
User prompt
Un nouveau point d'égalités a collecter doit apparaître sur la plateformes des que le précédent a été collecter
User prompt
Fait en sorte que de nouveaux points d'égalités soient disponibles sur les plateformes quand la femme les a tous collectés
User prompt
Fait en sorte que de nouveaux points d'égalités a collecter s'affichent sur les plateformes lorsqu'il y en a plus et fait ça aussi : Fait en sorte que le joueur puisse bouger la femme n'importe où , ou il appuie, Même quand une fenêtre de situation est affichée, Fait aussi en sorte que le joueur est 20 secondes maximum pour répondre, sinon la fenêtre de situation se retire
User prompt
Fait en sorte que le joueur puisse bouger la femme n'importe où , ou il appuie, Même quand une fenêtre de situation est affichée, Fait aussi en sorte que le joueur est 20 secondes maximum pour répondre, sinon la fenêtre de situation se retire (le temps restants de la fenêtre doit être affiché aussi)
User prompt
Fait en sorte que le joueur puisse bouger la femme n'importe où , ou il appuie, Même quand une fenêtre de situation est affichée, Fait aussi en sorte que le joueur est 20 secondes maximum pour répondre, sinon la fenêtre de situation se retire
User prompt
Regle les problèmes liés à l'affichage des fenêtres de situations : une seule fenêtre de situation par plateforme et par point d'égalité
User prompt
Fait en sorte que la musique de fond en boucle du jeu soit définit avec l'assets bgmusic
User prompt
Ajoute une musique de fond en boucle au jeu
User prompt
Ajoute une musique de fond en boucle au jeu
User prompt
Ajoute plus de situations
User prompt
De nouveaux points d'égalités doivent apparaître sur les plateformes quand les précédents ont tous été collectés, et ils doit y avoir un point d'égalité a collecter sur toutes les plateformes
User prompt
De nouveaux points d'égalités doivent apparaître sur les plateformes quand les précédents ont tous été collectés, et ils doit y avoir un point d'égalité a collecter sur toutes les plateformes
User prompt
Fait en sorte que les points d'égalité ne soit récupérable seulement quand la femme/le joueur a répondue aux questions de situations, et que de nouveaux points d'égalités s'affichent sur les plateformes quand il y en a plus, et ajoute aussi de nouvelles situations
User prompt
fait en sorte que la femme puisse se rendre partout où le joueur appuie,
User prompt
Fait en sorte que la femme puisse se rendre sur toutes les plateformes, que le joueur doit juste appuyer sur la plateforme en question pour s'y rendre
User prompt
Crée "Nous avons le droit", un jeu engagé où l’on incarne une femme de couleur qui, à travers des petites actions concrètes, doit faire face à des discriminations ou inégalités, et réussir à s'affirmer, se faire entendre, et faire changer les choses autour d’elle. Le jeu doit se présenter sous forme de jeu de plateforme, ou une femme de couleur avance sur une route dans une ville, Le joueur fait avancer la femme en appuyant sur son écran la où il veut qu'elle aille, des personnes blanches , des bus, des immeubles d'entreprises, des enfants, et des animaux apparaissent des fois de façon aléatoire sur la plateforme, Quand la femme noire entre en collision avec un de ces éléments la, Un écran de choix textuels s'ouvre, il y a une situation écrite, Et une liste de 6 choix possibles a faire par rapport a la situation (discrimination, refus ou offre d'emplois, lois ridicule a faire changer, moquerie etc), Sous la situation, le joueur peut choisir son choix, qui dictera la suite du jeu (si le choix est raisonnable et réduit l'inégalité, le joueur gagne 1 point d'égalité, mais si il fait un mauvais choix, le jeu lui dira que c'est pas un choix convenable et il devra recommencer le jeu depuis le début), La situation est générer aléatoirement, Et les choix possibles par rapport a la situation, Il doit y avoir un système de niveaux, les niveaux se gagnent en accumulant des points d'égalité, pour passer du niveau 1 au niveau 2, Il faut 6 points d'égalité, puis ça double a chaque nouveau niveau par rapport au niveau précédent Le jeu doit avoir 40 niveaux, Quand le joueur les a accomplit avec succès, le jeu lui dit "Le monde est désormais égal pour tous!", Et le joueur gagne le jeu, Le joueur peut recommencer le jeu depuis le début quand il le veut, Le jeu est reset au niveau 1 et tout début quand le joueur a finis le niveau 40 C'est un jeu engagé !
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Equality point class var EqualityPoint = Container.expand(function () { var self = Container.call(this); var eqGfx = self.attachAsset('equality', { anchorX: 0.5, anchorY: 0.5 }); self.width = eqGfx.width; self.height = eqGfx.height; return self; }); /**** * Discrimination Situations ****/ // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroGfx = self.attachAsset('hero', { anchorX: 0.5, anchorY: 1 }); self.width = heroGfx.width; self.height = heroGfx.height; self.vx = 0; self.vy = 0; self.isOnGround = false; self.jumpPower = -60; self.moveSpeed = 22; self.gravity = 5; self.update = function () { // Apply gravity self.vy += self.gravity; self.x += self.vx; self.y += self.vy; }; return self; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obsGfx = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 1 }); self.width = obsGfx.width; self.height = obsGfx.height; return self; }); // Platform class var Platform = Container.expand(function () { var self = Container.call(this); var platGfx = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5 }); self.width = platGfx.width; self.height = platGfx.height; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf1f5f9 }); /**** * Game Code ****/ // Game constants // Character: Woman of color (box, purple) // Platform (box, gray) // Obstacle (ellipse, red) // Equality point (ellipse, green) // Discrimination popup background (box, white) /**** * Game Code // Play background music in loop LK.playMusic('bgmusic', { loop: true }); /**** * Discrimination Situations ****/ var discriminationSituations = [{ text: "Un collègue fait une remarque raciste au travail.", choices: ["Ignorer la remarque", "Rire avec lui", "Signaler à la RH", "Répondre calmement", "Quitter le travail", "Faire une remarque agressive"], correct: [2, 3] }, { text: "On refuse de vous servir dans un café.", choices: ["Demander poliment pourquoi", "Partir sans rien dire", "Faire un scandale", "Appeler la police", "Filmer la scène", "Accepter la situation"], correct: [0, 3, 4] }, { text: "Un enfant subit des moqueries à l’école à cause de sa couleur de peau.", choices: ["En parler à l’enseignant", "Ignorer la situation", "Encourager l’enfant à répondre", "Rire avec les autres", "Organiser une discussion sur la diversité", "Punir les moqueurs"], correct: [0, 2, 4] }, { text: "Une entreprise refuse votre candidature sans raison.", choices: ["Demander un retour", "Porter plainte pour discrimination", "Chercher un autre emploi", "Publier sur les réseaux sociaux", "Accepter sans rien faire", "Envoyer un message d’insulte"], correct: [0, 1, 3] }, { text: "Un chauffeur de bus ne s’arrête pas pour vous.", choices: ["Attendre le prochain bus", "Signaler à la compagnie", "Crier sur le chauffeur", "Filmer la scène", "Ignorer l’incident", "Demander de l’aide à d’autres passagers"], correct: [1, 3, 5] }, { text: "Un agent de sécurité vous suit dans un magasin sans raison.", choices: ["Lui demander calmement pourquoi", "Ignorer et continuer vos achats", "Faire un scandale", "Quitter le magasin", "Filmer la scène", "Appeler la direction"], correct: [0, 1, 5] }, { text: "Un professeur fait une remarque stéréotypée sur votre culture.", choices: ["Lui expliquer pourquoi c'est blessant", "Ignorer", "Rire avec la classe", "En parler à la direction", "Répondre agressivement", "Demander des excuses"], correct: [0, 3, 5] }, { text: "On vous refuse l'entrée d'une boîte de nuit.", choices: ["Demander la raison", "Accepter sans rien dire", "Filmer la scène", "Appeler la police", "Faire un scandale", "Chercher un autre lieu"], correct: [0, 2, 3] }, { text: "Un inconnu fait une remarque sur vos cheveux dans la rue.", choices: ["Répondre poliment", "Ignorer", "Faire une remarque sur son apparence", "Expliquer pourquoi ce n'est pas approprié", "Rire", "S'énerver"], correct: [0, 3] }, { text: "Un enfant est exclu d'un jeu à cause de sa couleur de peau.", choices: ["Intervenir et inclure l'enfant", "Ignorer", "En parler aux parents", "Rire avec les autres", "Organiser un jeu inclusif", "Punir les enfants"], correct: [0, 2, 4] }, { text: "Un propriétaire refuse de vous louer un appartement à cause de votre nom.", choices: ["Demander une explication", "Accepter sans rien dire", "Porter plainte pour discrimination", "Chercher un autre logement", "Publier sur les réseaux sociaux", "Faire une remarque agressive"], correct: [0, 2, 4] }, { text: "Un médecin minimise vos symptômes en raison de votre origine.", choices: ["Demander un second avis", "Accepter le diagnostic", "Changer de médecin", "Signaler à l'ordre des médecins", "Ignorer la situation", "Faire un scandale"], correct: [0, 2, 3] }, { text: "Un policier vous contrôle sans raison apparente.", choices: ["Demander poliment la raison", "Refuser de coopérer", "Filmer la scène", "S'énerver", "Rester calme et coopérer", "Faire un scandale"], correct: [0, 2, 4] }, { text: "Un camarade de classe refuse de travailler avec vous.", choices: ["Demander pourquoi", "Ignorer et travailler seul", "En parler à l’enseignant", "Faire une remarque agressive", "Chercher un autre camarade", "Rire de la situation"], correct: [0, 2, 4] }, { text: "Un commerçant vous surveille de façon insistante.", choices: ["Lui demander calmement pourquoi", "Ignorer", "Quitter le magasin", "Faire un scandale", "Filmer la scène", "Appeler la direction"], correct: [0, 1, 5] }, { text: "Un collègue fait des blagues sur votre accent.", choices: ["Lui expliquer que c'est blessant", "Rire avec lui", "Ignorer", "En parler à la RH", "Faire une remarque agressive", "Changer de sujet"], correct: [0, 3] }, { text: "On vous attribue systématiquement les tâches les moins valorisantes.", choices: ["Demander une répartition équitable", "Accepter sans rien dire", "En parler à la direction", "Faire un scandale", "Ignorer", "Chercher un autre poste"], correct: [0, 2] }, { text: "Un inconnu vous interpelle dans la rue avec un surnom stéréotypé.", choices: ["Répondre poliment", "Ignorer", "Expliquer pourquoi ce n'est pas approprié", "Faire une remarque sur son apparence", "S'énerver", "Rire"], correct: [0, 2] }, { text: "Un enseignant refuse de prononcer correctement votre prénom.", choices: ["Lui expliquer l'importance de votre prénom", "Ignorer", "Faire une remarque agressive", "En parler à la direction", "Changer de classe", "Rire avec la classe"], correct: [0, 3] }, { text: "Un voisin fait des remarques sur votre famille à cause de votre origine.", choices: ["Lui expliquer que c'est blessant", "Ignorer", "Faire un scandale", "En parler à la mairie", "Répondre calmement", "Changer de sujet"], correct: [0, 3, 4] }]; var GAME_WIDTH = 2048; var GAME_HEIGHT = 2732; var GROUND_Y = GAME_HEIGHT - 200; var PLATFORM_GAP_Y = 320; var PLATFORM_MIN_X = 300; var PLATFORM_MAX_X = GAME_WIDTH - 300; var HERO_START_X = 400; var HERO_START_Y = GROUND_Y - 200; var OBSTACLE_CHANCE = 0.5; var EQUALITY_CHANCE = 0.5; var MAX_LEVEL = 40; // Game state var platforms = []; var obstacles = []; var equalityPoints = []; var currentLevel = 1; var equalityScore = 0; var equalityNeeded = 2; var hero = null; var isPopupActive = false; var popupContainer = null; var dragStartX = null; var dragStartY = null; var dragHeroStartX = null; var dragHeroStartY = null; var lastTouchId = null; // GUI var levelTxt = new Text2('Niveau 1', { size: 90, fill: 0x1E293B }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); var equalityTxt = new Text2('Égalité: 0/2', { size: 90, fill: 0x22C55E }); equalityTxt.anchor.set(0.5, 0); LK.gui.top.addChild(equalityTxt); // Position GUI levelTxt.y = 40; equalityTxt.y = 140; // Helper: Update GUI function updateGUI() { levelTxt.setText('Niveau ' + currentLevel + ' / ' + MAX_LEVEL); equalityTxt.setText('Égalité: ' + equalityScore + ' / ' + equalityNeeded); } // Helper: Reset game state for new level or restart function resetGameState() { // Remove old elements for (var i = 0; i < platforms.length; i++) platforms[i].destroy(); for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy(); for (var i = 0; i < equalityPoints.length; i++) equalityPoints[i].destroy(); platforms = []; obstacles = []; equalityPoints = []; equalityScore = 0; // Niveau 1 = 6, puis double à chaque fois equalityNeeded = 6 * Math.pow(2, currentLevel - 1); updateGUI(); // Reset hero if (hero) hero.destroy(); hero = new Hero(); hero.x = HERO_START_X; hero.y = HERO_START_Y; game.addChild(hero); // Generate platforms var y = GROUND_Y; var plat, obs, eq; for (var lvl = 0; lvl < 10; lvl++) { var px = PLATFORM_MIN_X + Math.floor(Math.random() * (PLATFORM_MAX_X - PLATFORM_MIN_X)); plat = new Platform(); plat.x = px; plat.y = y; platforms.push(plat); game.addChild(plat); // Place obstacle if (Math.random() < OBSTACLE_CHANCE) { obs = new Obstacle(); obs.x = px + 120 + Math.floor(Math.random() * 120); obs.y = y - 60; obstacles.push(obs); game.addChild(obs); } y -= PLATFORM_GAP_Y; } // Add ground platform var groundPlat = new Platform(); groundPlat.x = GAME_WIDTH / 2; groundPlat.y = GROUND_Y + 60; platforms.push(groundPlat); game.addChild(groundPlat); // Place one equality point on every platform except ground for (var pi = 0; pi < platforms.length - 1; pi++) { var plat = platforms[pi]; var eq = new EqualityPoint(); eq.x = plat.x; eq.y = plat.y - 80; equalityPoints.push(eq); game.addChild(eq); } } // Helper: Show discrimination popup function showDiscriminationPopup(situation, onChoice) { isPopupActive = true; popupContainer = new Container(); // Timer pour la popup if (typeof showDiscriminationPopup.popupTimeout !== "undefined" && showDiscriminationPopup.popupTimeout) { LK.clearTimeout(showDiscriminationPopup.popupTimeout); } showDiscriminationPopup.popupTimeout = null; // Background var bg = LK.getAsset('popupBg', { anchorX: 0.5, anchorY: 0.5, x: GAME_WIDTH / 2, y: GAME_HEIGHT / 2 }); popupContainer.addChild(bg); // Situation text var txt = new Text2(situation.text, { size: 70, fill: 0x1E293B }); txt.anchor.set(0.5, 0); txt.x = GAME_WIDTH / 2; txt.y = GAME_HEIGHT / 2 - 350; popupContainer.addChild(txt); // Choices var btns = []; var btnY = GAME_HEIGHT / 2 - 120; for (var i = 0; i < 6; i++) { var btn = new Container(); var btnBg = LK.getAsset('platform', { anchorX: 0.5, anchorY: 0.5, x: GAME_WIDTH / 2, y: btnY, width: 1200, height: 100, color: 0xf1f5f9 }); btn.addChild(btnBg); var btnTxt = new Text2(situation.choices[i], { size: 54, fill: 0x1E293B }); btnTxt.anchor.set(0.5, 0.5); btnTxt.x = GAME_WIDTH / 2; btnTxt.y = btnY; btn.addChild(btnTxt); // Touch/click event (function (idx) { btn.down = function (x, y, obj) { if (!isPopupActive) return; if (showDiscriminationPopup.popupTimeout) { LK.clearTimeout(showDiscriminationPopup.popupTimeout); showDiscriminationPopup.popupTimeout = null; } onChoice(idx); }; })(i); popupContainer.addChild(btn); btns.push(btn); btnY += 130; } game.addChild(popupContainer); // Affiche le temps restant sur la popup et retire la popup après 20 secondes // Ajout du texte du timer var popupTimerTxt = new Text2("20", { size: 60, fill: 0xEF4444 }); popupTimerTxt.anchor.set(0.5, 0.5); popupTimerTxt.x = GAME_WIDTH / 2; popupTimerTxt.y = GAME_HEIGHT / 2 + 400; popupContainer.addChild(popupTimerTxt); // Timer state var popupTimeLeft = 20; if (typeof showDiscriminationPopup.popupTimeout !== "undefined" && showDiscriminationPopup.popupTimeout) { LK.clearTimeout(showDiscriminationPopup.popupTimeout); } if (typeof showDiscriminationPopup.popupInterval !== "undefined" && showDiscriminationPopup.popupInterval) { LK.clearInterval(showDiscriminationPopup.popupInterval); } showDiscriminationPopup.popupTimeout = null; showDiscriminationPopup.popupInterval = null; // Interval pour décrémenter le timer chaque seconde showDiscriminationPopup.popupInterval = LK.setInterval(function () { if (!isPopupActive) { LK.clearInterval(showDiscriminationPopup.popupInterval); showDiscriminationPopup.popupInterval = null; return; } popupTimeLeft -= 1; if (popupTimeLeft < 0) popupTimeLeft = 0; popupTimerTxt.setText(popupTimeLeft.toString()); if (popupTimeLeft === 0) { // Temps écoulé, retire la popup if (isPopupActive) { hideDiscriminationPopup(); } LK.clearInterval(showDiscriminationPopup.popupInterval); showDiscriminationPopup.popupInterval = null; if (showDiscriminationPopup.popupTimeout) { LK.clearTimeout(showDiscriminationPopup.popupTimeout); showDiscriminationPopup.popupTimeout = null; } } }, 1000); // Timeout de sécurité pour 20 secondes (au cas où) showDiscriminationPopup.popupTimeout = LK.setTimeout(function () { if (isPopupActive) { hideDiscriminationPopup(); } showDiscriminationPopup.popupTimeout = null; if (showDiscriminationPopup.popupInterval) { LK.clearInterval(showDiscriminationPopup.popupInterval); showDiscriminationPopup.popupInterval = null; } }, 20000); } // Helper: Hide popup function hideDiscriminationPopup() { if (popupContainer) { popupContainer.destroy(); popupContainer = null; } isPopupActive = false; // Nettoyer le timer de la popup si présent if (typeof showDiscriminationPopup.popupTimeout !== "undefined" && showDiscriminationPopup.popupTimeout) { LK.clearTimeout(showDiscriminationPopup.popupTimeout); showDiscriminationPopup.popupTimeout = null; } // Nettoyer l'interval du timer de la popup si présent if (typeof showDiscriminationPopup.popupInterval !== "undefined" && showDiscriminationPopup.popupInterval) { LK.clearInterval(showDiscriminationPopup.popupInterval); showDiscriminationPopup.popupInterval = null; } } // Helper: Handle collision with obstacle function handleObstacleCollision() { // Pick a random situation var sitIdx = Math.floor(Math.random() * discriminationSituations.length); var situation = discriminationSituations[sitIdx]; showDiscriminationPopup(situation, function (choiceIdx) { // Check if correct if (situation.correct.indexOf(choiceIdx) !== -1) { // Good answer: progress, remove obstacle hideDiscriminationPopup(); // Remove the obstacle hero is colliding with for (var i = 0; i < obstacles.length; i++) { if (hero.intersects(obstacles[i])) { obstacles[i].destroy(); obstacles.splice(i, 1); break; } } } else { // Bad answer: game over hideDiscriminationPopup(); LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); // Après un Game Over, recommence au niveau 1 LK.on('gameOver', function () { currentLevel = 1; resetGameState(); }); } }); } // Helper: Handle collision with equality point // Now, equality points are only collectible after answering a situation correctly. // We'll use a flag to allow collection, and respawn new points if none remain. var canCollectEquality = false; var pendingEqualityIdx = null; function handleEqualityCollision(eqIdx) { // If not allowed to collect, trigger a situation popup if (!canCollectEquality) { // Pick a random situation var sitIdx = Math.floor(Math.random() * discriminationSituations.length); var situation = discriminationSituations[sitIdx]; showDiscriminationPopup(situation, function (choiceIdx) { if (situation.correct.indexOf(choiceIdx) !== -1) { // Good answer: allow collection hideDiscriminationPopup(); canCollectEquality = true; pendingEqualityIdx = eqIdx; } else { // Bad answer: game over hideDiscriminationPopup(); LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); LK.on('gameOver', function () { currentLevel = 1; resetGameState(); }); } }); return; } // If allowed, collect the point equalityScore += 1; updateGUI(); equalityPoints[eqIdx].destroy(); equalityPoints.splice(eqIdx, 1); canCollectEquality = false; pendingEqualityIdx = null; // Check for level up if (equalityScore >= equalityNeeded) { if (currentLevel >= MAX_LEVEL) { // Affiche le message de victoire final var winPopup = new Container(); var bg = LK.getAsset('popupBg', { anchorX: 0.5, anchorY: 0.5, x: GAME_WIDTH / 2, y: GAME_HEIGHT / 2 }); winPopup.addChild(bg); var winTxt = new Text2("Le monde est désormais égal pour tous!", { size: 80, fill: 0x22C55E }); winTxt.anchor.set(0.5, 0.5); winTxt.x = GAME_WIDTH / 2; winTxt.y = GAME_HEIGHT / 2; winPopup.addChild(winTxt); game.addChild(winPopup); LK.setTimeout(function () { winPopup.destroy(); LK.showYouWin(); // Reset du jeu pour recommencer au niveau 1 currentLevel = 1; resetGameState(); }, 2500); } else { currentLevel += 1; resetGameState(); } } else { // If no more equality points, respawn one on every platform (except ground) if (equalityPoints.length === 0 && platforms.length > 0) { // Exclude the ground platform (last one) for (var pi = 0; pi < platforms.length - 1; pi++) { var plat = platforms[pi]; var eq = new EqualityPoint(); eq.x = plat.x; eq.y = plat.y - 80; equalityPoints.push(eq); game.addChild(eq); } } } } // Helper: Hero-platform collision function checkHeroPlatformCollision() { hero.isOnGround = false; for (var i = 0; i < platforms.length; i++) { var plat = platforms[i]; // Simple AABB collision, only check if hero is falling if (hero.vy >= 0) { var hx = hero.x, hy = hero.y; var px = plat.x, py = plat.y; var hw = hero.width, hh = hero.height; var pw = plat.width, ph = plat.height; // Check if hero's feet are just above platform if (hx + hw / 2 > px - pw / 2 && hx - hw / 2 < px + pw / 2) { if (hy > py - ph / 2 && hy < py + ph / 2 && hy - hero.vy <= py - ph / 2) { // Land on platform hero.y = py - ph / 2; hero.vy = 0; hero.isOnGround = true; } } } } // Prevent falling below ground if (hero.y > GROUND_Y) { hero.y = GROUND_Y; hero.vy = 0; hero.isOnGround = true; } } // Helper: Clamp hero inside screen function clampHero() { if (hero.x < hero.width / 2) hero.x = hero.width / 2; if (hero.x > GAME_WIDTH - hero.width / 2) hero.x = GAME_WIDTH - hero.width / 2; if (hero.y < 0) hero.y = 0; if (hero.y > GROUND_Y) hero.y = GROUND_Y; } // Touch controls: tap anywhere to move hero there game.down = function (x, y, obj) { // Permettre le déplacement même si une popup est active hero.x = x; hero.y = y; hero.vx = 0; hero.vy = 0; hero.isOnGround = false; clampHero(); }; // Désactive le drag & jump, car le déplacement se fait par tap sur plateforme game.move = function (x, y, obj) {}; game.up = function (x, y, obj) {}; // Main update loop game.update = function () { if (isPopupActive) return; hero.update(); checkHeroPlatformCollision(); clampHero(); // Check collision with obstacles for (var i = 0; i < obstacles.length; i++) { if (hero.intersects(obstacles[i])) { handleObstacleCollision(); break; } } // Check collision with equality points for (var j = equalityPoints.length - 1; j >= 0; j--) { if (hero.intersects(equalityPoints[j])) { // If a correct answer was just given, allow collection if (canCollectEquality && pendingEqualityIdx === j) { handleEqualityCollision(j); break; } // Otherwise, only trigger popup if not already in process if (!canCollectEquality) { handleEqualityCollision(j); break; } } } }; // Start game resetGameState(); // Permet au joueur de recommencer le jeu après la victoire LK.on('youWin', function () { currentLevel = 1; resetGameState(); });
===================================================================
--- original.js
+++ change.js
@@ -336,14 +336,61 @@
btns.push(btn);
btnY += 130;
}
game.addChild(popupContainer);
- // Ajoute un timer de 20 secondes pour fermer la popup automatiquement
+ // Affiche le temps restant sur la popup et retire la popup après 20 secondes
+ // Ajout du texte du timer
+ var popupTimerTxt = new Text2("20", {
+ size: 60,
+ fill: 0xEF4444
+ });
+ popupTimerTxt.anchor.set(0.5, 0.5);
+ popupTimerTxt.x = GAME_WIDTH / 2;
+ popupTimerTxt.y = GAME_HEIGHT / 2 + 400;
+ popupContainer.addChild(popupTimerTxt);
+ // Timer state
+ var popupTimeLeft = 20;
+ if (typeof showDiscriminationPopup.popupTimeout !== "undefined" && showDiscriminationPopup.popupTimeout) {
+ LK.clearTimeout(showDiscriminationPopup.popupTimeout);
+ }
+ if (typeof showDiscriminationPopup.popupInterval !== "undefined" && showDiscriminationPopup.popupInterval) {
+ LK.clearInterval(showDiscriminationPopup.popupInterval);
+ }
+ showDiscriminationPopup.popupTimeout = null;
+ showDiscriminationPopup.popupInterval = null;
+ // Interval pour décrémenter le timer chaque seconde
+ showDiscriminationPopup.popupInterval = LK.setInterval(function () {
+ if (!isPopupActive) {
+ LK.clearInterval(showDiscriminationPopup.popupInterval);
+ showDiscriminationPopup.popupInterval = null;
+ return;
+ }
+ popupTimeLeft -= 1;
+ if (popupTimeLeft < 0) popupTimeLeft = 0;
+ popupTimerTxt.setText(popupTimeLeft.toString());
+ if (popupTimeLeft === 0) {
+ // Temps écoulé, retire la popup
+ if (isPopupActive) {
+ hideDiscriminationPopup();
+ }
+ LK.clearInterval(showDiscriminationPopup.popupInterval);
+ showDiscriminationPopup.popupInterval = null;
+ if (showDiscriminationPopup.popupTimeout) {
+ LK.clearTimeout(showDiscriminationPopup.popupTimeout);
+ showDiscriminationPopup.popupTimeout = null;
+ }
+ }
+ }, 1000);
+ // Timeout de sécurité pour 20 secondes (au cas où)
showDiscriminationPopup.popupTimeout = LK.setTimeout(function () {
if (isPopupActive) {
hideDiscriminationPopup();
}
showDiscriminationPopup.popupTimeout = null;
+ if (showDiscriminationPopup.popupInterval) {
+ LK.clearInterval(showDiscriminationPopup.popupInterval);
+ showDiscriminationPopup.popupInterval = null;
+ }
}, 20000);
}
// Helper: Hide popup
function hideDiscriminationPopup() {
@@ -356,8 +403,13 @@
if (typeof showDiscriminationPopup.popupTimeout !== "undefined" && showDiscriminationPopup.popupTimeout) {
LK.clearTimeout(showDiscriminationPopup.popupTimeout);
showDiscriminationPopup.popupTimeout = null;
}
+ // Nettoyer l'interval du timer de la popup si présent
+ if (typeof showDiscriminationPopup.popupInterval !== "undefined" && showDiscriminationPopup.popupInterval) {
+ LK.clearInterval(showDiscriminationPopup.popupInterval);
+ showDiscriminationPopup.popupInterval = null;
+ }
}
// Helper: Handle collision with obstacle
function handleObstacleCollision() {
// Pick a random situation
Femme de couleur. In-Game asset. 2d. High contrast. No shadows
Bus. In-Game asset. 2d. High contrast. No shadows
Étoile de l'égalité. In-Game asset. 2d. High contrast. No shadows
FOND ROSE. In-Game asset. 2d. High contrast. No shadows
Fond d'écran ville. In-Game asset. 2d. High contrast. No shadows