User prompt
je veux personnalisé le fond du jeu avec mon propre asset, et ajoute des assets différents pour les oiseaux et les chiens
User prompt
Ajoute plus de niveaux pour le jeu : a partir du niveau 10, un troisième obstacles (tu la nommer SunBeam), apparaît dans le jeu, se déplaçant de gauche a droite, dong difficultant le jeu, puis a partir du niveau 15, tu ajoute des oiseaux qui vont et viennent et embetent le joueur (la glace), pour avancer 100% correctement, puis a partir du niveau 20, ces oiseaux sont de plus en plus nombreux, puis au niveau 25, tu ajoute des chiens qui poursuivent la glace tout comme l'enfant, et le jeu se termine au niveau 30!
User prompt
Ajoute plus de niveaux pour le jeu : a partir du niveau 10, un troisième obstacles (tu la nommer SunBeam), apparaît dans le jeu, se déplaçant de gauche a droite, dong difficultant le jeu, puis a partir du niveau 15, tu ajoute des oiseaux qui vont et viennent et embetent le joueur (la glace), pour avancer 100% correctement, puis a partir du niveau 20, ces oiseaux sont de plus en plus nombreux, puis au niveau 25, tu ajoute des chiens qui poursuivent la glace tout comme l'enfant, et le jeu se termine au niveau 30!
User prompt
Fait en sorte que l'enfant aille un peu plus vite, et ajoute plus d'arbres ou plus grand fur a mesure que le joueur monte en niveau
User prompt
Ajoute une musique de fond en boucle au jeu
User prompt
Au pire, fait en sorte que le joueur puisse taper sur son écran pour déplacer le personnage, mais seulement dans une courte distance a chaque fois
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'LK.gui.overlay.addChild(guiBtnUp);' Line Number: 395
User prompt
Les bouttons directionnels ne s'affichent pas, règle ce problème
User prompt
Les boutons directionnels doivent apparaître a l'écran, et permettre de bouger la glace :/
User prompt
Ajoute les boutons directionnels au jeu a l'écran , pour que le joueur puisse déplacer sa glace
User prompt
Refait en sorte que le joueur déplace sa glace avec des boutons directionnels (un boutton pour le bas, un autre pour le haut, un autre pour la droite, un autre pour la gauche)
User prompt
Fait en sorte d'ajouter des complications au jeu pour pas qu'il soit trop facile, et améliore les designs pour afficher des vrais assets de glace, d'enfants etc en cartoon
User prompt
Fait en sorte que le joueur puisse déplacer la glace n'importe où en appuyant a l'écran
User prompt
Fait en sorte que la barre de fraicheur soit pas trop rapide, mais s'écoule a la vitesse de - 1% par seconde, que le joueur puisse aller vers le haut, le bas, a droite et a gauche avec les boutons directionnels
User prompt
Fait en sorte que le joueur puisse déplacer sa glace vers le haut, le bas, a gauche a droite, que la fraîcheur s'écoule a une vitesse normale, et ajoute l'enfant et le reste du jeu car la c'est trop difficile, et ya pas tout le jeu
User prompt
Please fix the bug: 'guiBtnSize is not defined' in or related to this line: 'guiBtnLeft = createGuiButton('left', 300, -guiBtnSize / 2 - 40, guiBtnTextLeft);' Line Number: 361
User prompt
Fait en sorte que le joueur puisse déplacer sa glace vers le haut, le bas, a gauche a droite, que la fraîcheur s'écoule a une vitesse normale, et ajoute l'enfant et le reste du jeu
Code edit (1 edits merged)
Please save this source code
User prompt
BÉBÉ GLACE – Ne vieillit pas
Initial prompt
J'aimerais créer ce jeu : ## 🎮 Résumé du concept : ### **🎂 BÉBÉ GLACE – Ne vieillit pas** *(jeu 2D)* > Incarne une glace mignonne achetée par un petit enfant, qui tente désespérément de **fuir à l’ombre**, d’échapper aux mains collantes, et de **rejoindre la Fontaine de Jouvence** avant de **fondre ou vieillir** ! --- ## 🧩 GAMEPLAY ### 🎯 Objectif : * **Traverser un parcours** depuis le stand de glace jusqu’à la fontaine, * en **restant toujours à l’ombre**, * et **en échappant au petit enfant qui veut te manger** 😱 --- ### 🕹️ Mécaniques principales : | Système | Description | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | ☀️ **Chaleur / Fonte** | Si tu restes trop longtemps au soleil = ta barre de fraîcheur baisse → tu fonds 🍫 | | 🧒 **Enfant poursuivant** | Un enfant de 5 ans court après toi en mode rigolo (il trébuche, s’arrête pour des papillons, mais il revient 😈) | | 🌳 **Ombres dynamiques** | Arbres, parasols, murs, bancs... chaque ombre forme des zones de "refuge" | | ⏳ **Vieillissement visuel** | Ta glace change d'apparence : elle devient plus petite, plus flasque, puis ridée (avec des lunettes mdr) si tu traînes | | 💧 **Fontaine de Jouvence** | Si tu arrives jusqu’à elle, tu redeviens Bébé Glace, niveau suivant, parcours plus difficile ! | --- ### 🎨 UNIVERS * **Départ :** Stand de glace dans un petit parc en été ☀️ * **Parcours :** Allées, bancs, chiens qui courent, flaques d’eau, enfants, marchands... * **Ambiance :** cartoon pastel, musiques sucrées, effets fondants et "plop" à chaque pas --- ### 🤪 DÉTAILS DRÔLES À AJOUTER • quand tu veillit tu te mets a trembler avec une petite canne * Si tu restes dans un frigo sur le chemin, tu gagnes du temps ! * Fontaine = cascade de crème glacée magique 🧚♀️🍦 Il y a un système de niveau, Le jeu est jouable sur téléphone , en déplaçant la glace avec des boutons directionnels, a chaque fois que la glace (le joueur), gagne la partie en se rendant avec succès a la fontaine de jouvence, il gagne un niveau, puis il revient au stand pour accomplir le niveau suivant!, A chaque nouveau niveau, le jeu se complique avec la fontaine de jouvence qui est de plus en plus loin, et l'enfant qui se déplace de plus en plus vite
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy Child (cartoon) var Child = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('child_cartoon', { anchorX: 0.5, anchorY: 1.0 }); self.body = body; return self; }); // Fountain (Goal, cartoon) var Fountain = Container.expand(function () { var self = Container.call(this); var f = self.attachAsset('fountain_cartoon', { anchorX: 0.5, anchorY: 0.5 }); self.f = f; return self; }); // Fridge (Bonus, cartoon) var Fridge = Container.expand(function () { var self = Container.call(this); var fridge = self.attachAsset('fridge_cartoon', { anchorX: 0.5, anchorY: 1.0 }); self.fridge = fridge; return self; }); // Player Ice Cream (cartoon) var IceCream = Container.expand(function () { var self = Container.call(this); // State: 'normal', 'old', 'melt', 'baby' self.state = 'normal'; self.age = 0; // 0: baby, 1: normal, 2: old, 3: melt // Attach cone (cartoon) var cone = self.attachAsset('cone_cartoon', { anchorX: 0.5, anchorY: 0.0, y: 120 }); // Attach scoop (ice cream, cartoon) var scoop = self.attachAsset('icecream_cartoon', { anchorX: 0.5, anchorY: 1.0, y: 120 }); self.scoop = scoop; self.cone = cone; // For visual aging self.setState = function (state) { if (state === self.state) return; self.state = state; if (state === 'normal') { scoop.texture = LK.getAsset('icecream_cartoon', {}).texture; } else if (state === 'old') { scoop.texture = LK.getAsset('icecream_old_cartoon', {}).texture; } else if (state === 'melt') { scoop.texture = LK.getAsset('icecream_melt_cartoon', {}).texture; } else if (state === 'baby') { scoop.texture = LK.getAsset('icecream_baby_cartoon', {}).texture; } }; // For bonus self.resetAge = function () { self.age = 0; self.setState('normal'); }; return self; }); // Shadow (Safe zone, cartoon) var Shadow = Container.expand(function () { var self = Container.call(this); var shadow = self.attachAsset('shadow_cartoon', { anchorX: 0.5, anchorY: 0.5 }); self.shadow = shadow; return self; }); // Sunbeam (Danger zone, for visual only, cartoon) var Sunbeam = Container.expand(function () { var self = Container.call(this); var sunbeam = self.attachAsset('sunbeam_cartoon', { anchorX: 0.5, anchorY: 0.5 }); self.sunbeam = sunbeam; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb // Sky blue }); /**** * Game Code ****/ // Fallback for any missing asset // Cartoon-style image assets (replace simple shapes) // --- Game Variables --- var level = 1; var maxLevel = 10; var playerSpeed = 18; var childBaseSpeed = 4.5; // easier: slower child var childSpeed = childBaseSpeed; var shadowSpeed = 2.5; var shadowCount = 5; // easier: more shadows var shadowMinWidth = 400; // easier: wider shadows var shadowMaxWidth = 700; var sunbeamCount = 1; // easier: less sunbeams var sunbeamSpeed = 1.2; var fridgeChance = 0.35; // more chance for fridge var fridgeActive = false; var fridgeTimer = 0; var fridgeDuration = 120; // frames var playerAgingRate = 0.7; // easier: slower aging var playerMeltRate = 1.1; // easier: slower melt var playerAge = 0; // 0: baby, 1: normal, 2: old, 3: melt var playerMaxAge = 3; var playerInShadow = false; var playerInFridge = false; var playerMelt = 0; var playerMaxMelt = 120; // easier: more margin before melting var playerMeltWarning = false; var playerMeltSoundPlayed = false; var playerOldWarning = false; var playerOldSoundPlayed = false; var playerGoalReached = false; var playerDead = false; var playerWin = false; var distanceToGoal = 1500 + (level - 1) * 250; // easier: shorter distance var distanceTraveled = 0; var moveDir = { up: false, down: false, left: false, right: false }; var lastMoveTick = 0; var lastShadowTick = 0; var lastChildTick = 0; var lastFridgeTick = 0; var lastStepSound = 0; var childChaseDelay = 80; // child starts a bit later var childChaseStarted = false; var childChaseTick = 0; var childCatchDist = 120; // easier: more margin before caught var shadowList = []; var sunbeamList = []; var fridgeObj = null; var fridgeUsed = false; var fountainObj = null; var childObj = null; var playerObj = null; var scoreTxt = null; var levelTxt = null; var meltBar = null; // --- Child funny behavior state --- var childBehavior = { mode: "chase", // chase, stumble, butterfly, idle timer: 0 }; // --- GUI --- // Score/Level text scoreTxt = new Text2('0', { size: 110, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); levelTxt = new Text2('Niveau 1', { size: 70, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 120; // Melt bar (shows how close to melting) meltBar = new Text2('', { size: 60, fill: 0xF7E6B2 }); meltBar.anchor.set(0.5, 0); LK.gui.top.addChild(meltBar); meltBar.y = 210; // --- Game Setup --- function setupLevel() { // Reset distanceToGoal = 1500 + (level - 1) * 250; distanceTraveled = 0; playerAgingRate = 0.7 + (level - 1) * 0.13; playerMeltRate = 1.1 + (level - 1) * 0.18; childSpeed = childBaseSpeed + (level - 1) * 0.8; shadowCount = 5 + Math.floor((level - 1) / 2); sunbeamCount = 1 + Math.floor((level - 1) / 4); fridgeActive = false; fridgeUsed = false; playerGoalReached = false; playerDead = false; playerWin = false; playerMelt = 0; playerMaxMelt = 120; playerMeltWarning = false; playerMeltSoundPlayed = false; playerOldWarning = false; playerOldSoundPlayed = false; playerInShadow = false; playerInFridge = false; childChaseStarted = false; childChaseTick = 0; childCatchDist = 120; playerAge = 1; playerObj.resetAge(); childBehavior.mode = "chase"; childBehavior.timer = 0; // Remove old objects for (var i = 0; i < shadowList.length; i++) { shadowList[i].destroy(); } shadowList = []; for (var i = 0; i < sunbeamList.length; i++) { sunbeamList[i].destroy(); } sunbeamList = []; if (fridgeObj) { fridgeObj.destroy(); fridgeObj = null; } if (fountainObj) { fountainObj.destroy(); fountainObj = null; } if (childObj) { childObj.destroy(); childObj = null; } // Place player at bottom center playerObj.x = 2048 / 2; playerObj.y = 2732 - 300; // Place child at bottom, offset childObj = new Child(); childObj.x = 2048 / 2 + 200; childObj.y = 2732 - 300; game.addChild(childObj); // Place fountain at top center fountainObj = new Fountain(); fountainObj.x = 2048 / 2; fountainObj.y = 300; game.addChild(fountainObj); // Place shadows (random X, Y spaced along path) for (var i = 0; i < shadowCount; i++) { var s = new Shadow(); var sx = 300 + Math.random() * (2048 - 600); var sy = 2732 - 600 - (i + 1) * (distanceToGoal / (shadowCount + 1)); s.x = sx; s.y = sy; // Random width var w = shadowMinWidth + Math.random() * (shadowMaxWidth - shadowMinWidth); s.shadow.width = w; shadowList.push(s); game.addChild(s); } // Place sunbeams (now moving obstacles) for (var i = 0; i < sunbeamCount; i++) { var sb = new Sunbeam(); var sbx = 300 + Math.random() * (2048 - 600); var sby = 2732 - 600 - (i + 1) * (distanceToGoal / (sunbeamCount + 1)); sb.x = sbx; sb.y = sby; // Give each sunbeam a random horizontal speed and direction sb.moveDir = Math.random() < 0.5 ? -1 : 1; sb.moveSpeed = 2 + Math.random() * 2; sunbeamList.push(sb); game.addChild(sb); } // Place fridge (bonus) randomly, only if not already used if (Math.random() < fridgeChance) { fridgeObj = new Fridge(); fridgeObj.x = 400 + Math.random() * (2048 - 800); fridgeObj.y = 2732 - 600 - Math.random() * (distanceToGoal - 800); game.addChild(fridgeObj); fridgeActive = true; } // Place random ice puddles (obstacles that slow player) if (typeof puddleList !== "undefined") { for (var i = 0; i < puddleList.length; i++) { puddleList[i].destroy(); } } puddleList = []; var puddleCount = 2 + Math.floor(level / 2); for (var i = 0; i < puddleCount; i++) { var puddle = new Container(); var puddleAsset = puddle.attachAsset('icecream_melt_cartoon', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7 + Math.random() * 0.5, scaleY: 0.5 + Math.random() * 0.3 }); puddle.x = 200 + Math.random() * (2048 - 400); puddle.y = 2732 - 600 - Math.random() * (distanceToGoal - 800); puddle.slow = 0.5 + Math.random() * 0.3; puddleList.push(puddle); game.addChild(puddle); } // Update GUI scoreTxt.setText("Distance: " + Math.max(0, Math.floor(distanceToGoal - distanceTraveled)) + "m"); levelTxt.setText("Niveau " + level); meltBar.setText("Fraîcheur: " + Math.max(0, Math.floor(playerMaxMelt - playerMelt)) + "%"); } // --- Player --- playerObj = new IceCream(); game.addChild(playerObj); // --- Directional GUI Buttons --- // Button size and margin var guiBtnSize = 220; var guiBtnMargin = 60; var guiBtnAlpha = 0.82; // Create button assets (arrows) function createGuiButton(dir, x, y, txt) { var btn = new Container(); var btnShape = btn.attachAsset('shadow_cartoon', { anchorX: 0.5, anchorY: 0.5, width: guiBtnSize, height: guiBtnSize, tint: 0x222222 }); btnShape.alpha = guiBtnAlpha; var arrow = new Text2(txt, { size: 120, fill: "#fff" }); arrow.anchor.set(0.5, 0.5); btn.addChild(arrow); btn.x = x; btn.y = y; btn.interactive = true; btn.buttonMode = true; btn.dir = dir; return btn; } // Arrow unicode: ↑ ↓ ← → var guiBtnUp = createGuiButton('up', 2048 / 2, 2732 - guiBtnSize * 2 - guiBtnMargin * 2, "↑"); var guiBtnDown = createGuiButton('down', 2048 / 2, 2732 - guiBtnSize / 2 - guiBtnMargin, "↓"); var guiBtnLeft = createGuiButton('left', 2048 / 2 - guiBtnSize - guiBtnMargin, 2732 - guiBtnSize - guiBtnMargin, "←"); var guiBtnRight = createGuiButton('right', 2048 / 2 + guiBtnSize + guiBtnMargin, 2732 - guiBtnSize - guiBtnMargin, "→"); // Add to GUI (bottom overlay) LK.gui.bottom.addChild(guiBtnUp); LK.gui.bottom.addChild(guiBtnDown); LK.gui.bottom.addChild(guiBtnLeft); LK.gui.bottom.addChild(guiBtnRight); // Button press/release handlers function setMoveDir(dir, val) { moveDir[dir] = val; } guiBtnUp.down = function () { setMoveDir('up', true); }; guiBtnUp.up = function () { setMoveDir('up', false); }; guiBtnDown.down = function () { setMoveDir('down', true); }; guiBtnDown.up = function () { setMoveDir('down', false); }; guiBtnLeft.down = function () { setMoveDir('left', true); }; guiBtnLeft.up = function () { setMoveDir('left', false); }; guiBtnRight.down = function () { setMoveDir('right', true); }; guiBtnRight.up = function () { setMoveDir('right', false); }; // Also clear all on global up (in case finger leaves button) game.up = function (x, y, obj) { moveDir.up = false; moveDir.down = false; moveDir.left = false; moveDir.right = false; }; // --- Main Game Update --- game.update = function () { if (playerDead || playerWin) return; // --- Player Movement --- // Move player according to direction buttons var moveX = 0, moveY = 0; if (moveDir.up) moveY -= 1; if (moveDir.down) moveY += 1; if (moveDir.left) moveX -= 1; if (moveDir.right) moveX += 1; if (moveX !== 0 || moveY !== 0) { // Normalize diagonal movement var mag = Math.sqrt(moveX * moveX + moveY * moveY); moveX /= mag; moveY /= mag; // Check if on puddle (slow movement) var onPuddle = false; if (typeof puddleList !== "undefined") { for (var i = 0; i < puddleList.length; i++) { if (playerObj.intersects(puddleList[i])) { onPuddle = true; // Play step sound (slippery) if (LK.ticks - lastStepSound > 18) { LK.getSound('step').play(); lastStepSound = LK.ticks; } break; } } } var speed = playerSpeed; if (onPuddle) { speed *= 0.4; LK.effects.flashObject(playerObj, 0x6ec6f1, 200); } // Move and clamp to game area var newX = playerObj.x + moveX * speed; var newY = playerObj.y + moveY * speed; newX = Math.max(100, Math.min(2048 - 100, newX)); newY = Math.max(200, Math.min(2732 - 100, newY)); // Only count distance if moving up (towards goal) if (distanceTraveled < distanceToGoal && newY < playerObj.y) { distanceTraveled += playerObj.y - newY; } playerObj.x = newX; playerObj.y = newY; // Play step sound if moved if ((playerObj.x !== playerObj.lastX || playerObj.y !== playerObj.lastY) && LK.ticks - lastStepSound > 12) { LK.getSound('step').play(); lastStepSound = LK.ticks; } } playerObj.lastX = playerObj.x; playerObj.lastY = playerObj.y; // --- Shadows --- playerInShadow = false; for (var i = 0; i < shadowList.length; i++) { var s = shadowList[i]; if (playerObj.intersects(s)) { playerInShadow = true; break; } } // --- Sunbeams (moving obstacles, dangerous) --- for (var i = 0; i < sunbeamList.length; i++) { var sb = sunbeamList[i]; // Move sunbeam horizontally, bounce at screen edges sb.x += sb.moveDir * sb.moveSpeed; if (sb.x < 200) { sb.x = 200; sb.moveDir = 1; } if (sb.x > 2048 - 200) { sb.x = 2048 - 200; sb.moveDir = -1; } // If player touches a sunbeam, instant melt! if (!playerDead && playerObj.intersects(sb)) { playerObj.setState('melt'); playerDead = true; LK.effects.flashScreen(0xffe066, 1200); LK.getSound('melt').play(); LK.showGameOver(); return; } } // --- Fridge (bonus) --- if (fridgeObj && !fridgeUsed && playerObj.intersects(fridgeObj)) { playerInFridge = true; fridgeUsed = true; playerObj.resetAge(); playerMelt = 0; LK.getSound('bonus').play(); // Animate fridge tween(fridgeObj, { alpha: 0 }, { duration: 600, onFinish: function onFinish() { fridgeObj.destroy(); fridgeObj = null; } }); } else { playerInFridge = false; } // --- Melting / Aging --- if (playerInFridge) { // No aging/melting } else if (playerInShadow) { // Age slowly (recover a little freshness in shadow) playerMelt -= 0.5; if (playerMelt < 0) playerMelt = 0; } else { // In sun: melt at exactly -1% per second (1% of playerMaxMelt per 60 ticks) playerMelt += playerMaxMelt / 100 / 60; if (!playerMeltWarning && playerMelt > playerMaxMelt * 0.7) { playerMeltWarning = true; LK.effects.flashObject(playerObj, 0xffe066, 400); LK.getSound('melt').play(); } if (playerMelt > playerMaxMelt) { // Melted! playerObj.setState('melt'); playerDead = true; LK.effects.flashScreen(0xffe066, 1200); LK.showGameOver(); return; } } // Age visually if in sun for long if (playerMelt > playerMaxMelt * 0.4 && playerMelt < playerMaxMelt * 0.7) { playerObj.setState('old'); } else if (playerMelt <= playerMaxMelt * 0.4) { playerObj.setState('normal'); } // --- Child (enemy) --- if (!childChaseStarted) { childChaseTick++; if (childChaseTick > childChaseDelay) { childChaseStarted = true; childBehavior.mode = "chase"; childBehavior.timer = 0; } } else { // --- Child funny behaviors --- childBehavior.timer--; if (childBehavior.timer <= 0) { // Randomly pick a new behavior var r = Math.random(); if (r < 0.15) { childBehavior.mode = "stumble"; childBehavior.timer = 40 + Math.floor(Math.random() * 30); } else if (r < 0.30) { childBehavior.mode = "butterfly"; childBehavior.timer = 50 + Math.floor(Math.random() * 40); } else if (r < 0.40) { childBehavior.mode = "idle"; childBehavior.timer = 30 + Math.floor(Math.random() * 20); } else { childBehavior.mode = "chase"; childBehavior.timer = 60 + Math.floor(Math.random() * 60); } } var cx = childObj.x, cy = childObj.y; var px = playerObj.x, py = playerObj.y; var dx = px - cx, dy = py - cy; var dist = Math.sqrt(dx * dx + dy * dy); if (childBehavior.mode === "chase") { if (dist > 1) { var step = Math.min(childSpeed, dist); childObj.x += dx / dist * step; childObj.y += dy / dist * step; } } else if (childBehavior.mode === "stumble") { // Stumble: move erratically, slower var angle = Math.random() * Math.PI * 2; childObj.x += Math.cos(angle) * 2.5; childObj.y += Math.sin(angle) * 2.5; } else if (childBehavior.mode === "butterfly") { // Butterfly: move in a small circle var t = LK.ticks % 360; childObj.x += Math.cos(t / 20) * 2.2; childObj.y += Math.sin(t / 20) * 2.2; } else if (childBehavior.mode === "idle") { // Idle: stand still, maybe wiggle a bit childObj.x += Math.sin(LK.ticks / 10) * 0.5; } // If child catches player (only if chasing) if (childBehavior.mode === "chase" && dist < childCatchDist) { playerDead = true; LK.effects.flashScreen(0xff0000, 1200); LK.getSound('danger').play(); LK.showGameOver(); return; } } // --- Goal (Fountain) --- if (!playerGoalReached && playerObj.intersects(fountainObj)) { playerGoalReached = true; playerWin = true; playerObj.setState('baby'); LK.getSound('goal').play(); LK.effects.flashScreen(0x4ecdc4, 1200); LK.setScore(level); if (level >= maxLevel) { LK.showYouWin(); } else { // Next level after short delay LK.setTimeout(function () { level++; setupLevel(); }, 1200); } return; } // --- Update GUI --- scoreTxt.setText("Distance: " + Math.max(0, Math.floor(distanceToGoal - distanceTraveled)) + "m"); levelTxt.setText("Niveau " + level); meltBar.setText("Fraîcheur: " + Math.max(0, Math.floor(playerMaxMelt - playerMelt)) + "%"); }; // --- Start Game --- setupLevel(); // --- Music --- LK.playMusic('summer', { fade: { start: 0, end: 1, duration: 1200 } });
===================================================================
--- original.js
+++ change.js
@@ -324,36 +324,99 @@
}
// --- Player ---
playerObj = new IceCream();
game.addChild(playerObj);
-// --- Touch-to-move Controls ---
-// When the player taps anywhere on the screen, move the ice cream directly to that position (clamped to game area)
-game.down = function (x, y, obj) {
- // Clamp to game area (leave 100px margin horizontally, 200px top, 100px bottom)
- var newX = Math.max(100, Math.min(2048 - 100, x));
- var newY = Math.max(200, Math.min(2732 - 100, y));
- playerObj.x = newX;
- playerObj.y = newY;
+// --- Directional GUI Buttons ---
+// Button size and margin
+var guiBtnSize = 220;
+var guiBtnMargin = 60;
+var guiBtnAlpha = 0.82;
+// Create button assets (arrows)
+function createGuiButton(dir, x, y, txt) {
+ var btn = new Container();
+ var btnShape = btn.attachAsset('shadow_cartoon', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ width: guiBtnSize,
+ height: guiBtnSize,
+ tint: 0x222222
+ });
+ btnShape.alpha = guiBtnAlpha;
+ var arrow = new Text2(txt, {
+ size: 120,
+ fill: "#fff"
+ });
+ arrow.anchor.set(0.5, 0.5);
+ btn.addChild(arrow);
+ btn.x = x;
+ btn.y = y;
+ btn.interactive = true;
+ btn.buttonMode = true;
+ btn.dir = dir;
+ return btn;
+}
+// Arrow unicode: ↑ ↓ ← →
+var guiBtnUp = createGuiButton('up', 2048 / 2, 2732 - guiBtnSize * 2 - guiBtnMargin * 2, "↑");
+var guiBtnDown = createGuiButton('down', 2048 / 2, 2732 - guiBtnSize / 2 - guiBtnMargin, "↓");
+var guiBtnLeft = createGuiButton('left', 2048 / 2 - guiBtnSize - guiBtnMargin, 2732 - guiBtnSize - guiBtnMargin, "←");
+var guiBtnRight = createGuiButton('right', 2048 / 2 + guiBtnSize + guiBtnMargin, 2732 - guiBtnSize - guiBtnMargin, "→");
+// Add to GUI (bottom overlay)
+LK.gui.bottom.addChild(guiBtnUp);
+LK.gui.bottom.addChild(guiBtnDown);
+LK.gui.bottom.addChild(guiBtnLeft);
+LK.gui.bottom.addChild(guiBtnRight);
+// Button press/release handlers
+function setMoveDir(dir, val) {
+ moveDir[dir] = val;
+}
+guiBtnUp.down = function () {
+ setMoveDir('up', true);
};
-game.move = function (x, y, obj) {
- // Optional: allow dragging finger to move ice cream continuously
- var newX = Math.max(100, Math.min(2048 - 100, x));
- var newY = Math.max(200, Math.min(2732 - 100, y));
- playerObj.x = newX;
- playerObj.y = newY;
+guiBtnUp.up = function () {
+ setMoveDir('up', false);
};
+guiBtnDown.down = function () {
+ setMoveDir('down', true);
+};
+guiBtnDown.up = function () {
+ setMoveDir('down', false);
+};
+guiBtnLeft.down = function () {
+ setMoveDir('left', true);
+};
+guiBtnLeft.up = function () {
+ setMoveDir('left', false);
+};
+guiBtnRight.down = function () {
+ setMoveDir('right', true);
+};
+guiBtnRight.up = function () {
+ setMoveDir('right', false);
+};
+// Also clear all on global up (in case finger leaves button)
game.up = function (x, y, obj) {
- // No action needed on up
+ moveDir.up = false;
+ moveDir.down = false;
+ moveDir.left = false;
+ moveDir.right = false;
};
// --- Main Game Update ---
game.update = function () {
if (playerDead || playerWin) return;
// --- Player Movement ---
- // No automatic movement; playerObj.x/y is set directly by tap/move handlers
- // Only count distance if player moved up (towards goal) since last frame
- if (typeof playerObj.lastY === "undefined") playerObj.lastY = playerObj.y;
- if (distanceTraveled < distanceToGoal && playerObj.y < playerObj.lastY) {
- // Check if player is on a puddle (slow movement)
+ // Move player according to direction buttons
+ var moveX = 0,
+ moveY = 0;
+ if (moveDir.up) moveY -= 1;
+ if (moveDir.down) moveY += 1;
+ if (moveDir.left) moveX -= 1;
+ if (moveDir.right) moveX += 1;
+ if (moveX !== 0 || moveY !== 0) {
+ // Normalize diagonal movement
+ var mag = Math.sqrt(moveX * moveX + moveY * moveY);
+ moveX /= mag;
+ moveY /= mag;
+ // Check if on puddle (slow movement)
var onPuddle = false;
if (typeof puddleList !== "undefined") {
for (var i = 0; i < puddleList.length; i++) {
if (playerObj.intersects(puddleList[i])) {
@@ -366,21 +429,30 @@
break;
}
}
}
+ var speed = playerSpeed;
if (onPuddle) {
- distanceTraveled += (playerObj.lastY - playerObj.y) * 0.4;
- // Optional: flash player blue
+ speed *= 0.4;
LK.effects.flashObject(playerObj, 0x6ec6f1, 200);
- } else {
- distanceTraveled += playerObj.lastY - playerObj.y;
}
+ // Move and clamp to game area
+ var newX = playerObj.x + moveX * speed;
+ var newY = playerObj.y + moveY * speed;
+ newX = Math.max(100, Math.min(2048 - 100, newX));
+ newY = Math.max(200, Math.min(2732 - 100, newY));
+ // Only count distance if moving up (towards goal)
+ if (distanceTraveled < distanceToGoal && newY < playerObj.y) {
+ distanceTraveled += playerObj.y - newY;
+ }
+ playerObj.x = newX;
+ playerObj.y = newY;
+ // Play step sound if moved
+ if ((playerObj.x !== playerObj.lastX || playerObj.y !== playerObj.lastY) && LK.ticks - lastStepSound > 12) {
+ LK.getSound('step').play();
+ lastStepSound = LK.ticks;
+ }
}
- // Play step sound if player moved
- if ((playerObj.x !== playerObj.lastX || playerObj.y !== playerObj.lastY) && LK.ticks - lastStepSound > 12) {
- LK.getSound('step').play();
- lastStepSound = LK.ticks;
- }
playerObj.lastX = playerObj.x;
playerObj.lastY = playerObj.y;
// --- Shadows ---
playerInShadow = false;
Cone de glace a la vanille. In-Game asset. 2d. High contrast. No shadows
un arbre avec un visage . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Une fontaine de jouvence. In-Game asset. 2d. High contrast. No shadows
Oiseau qui vole. In-Game asset. 2d. High contrast. No shadows
Chien. In-Game asset. 2d. High contrast. No shadows
icecream_melt_cartoon. In-Game asset. 2d. High contrast. No shadows
bébé glace cartoon. In-Game asset. 2d. High contrast. No shadows
Frigo. In-Game asset. 2d. High contrast. No shadows
Fond d'écran été. In-Game asset. 2d. High contrast. No shadows
Cône de glace. In-Game asset. 2d. High contrast. No shadows
Vielle glace (dessert). In-Game asset. 2d. High contrast. No shadows
Enfant. In-Game asset. 2d. High contrast. No shadows