Code edit (1 edits merged)
Please save this source code
User prompt
Stepping Stones Challenge
Initial prompt
Toca stepping stones (2014). The aim of this game is to make it across the rock pool before time runs out. Tap on the powerpuff girls to jump to the next stone but be careful not all the stone are what you seen before you fall into the sea. Tap on level 1 white, level 2 blue, level 3 red, level 4 purple, or level 5 green to get started.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var LevelButton = Container.expand(function (levelNumber, color, x, y) { var self = Container.call(this); self.levelNumber = levelNumber; self.x = x; self.y = y; var buttonGraphics = self.attachAsset('stableStone', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: color }); var levelText = new Text2(levelNumber.toString(), { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0.5); self.addChild(levelText); self.down = function (x, y, obj) { if (gameState === 'levelSelect') { startLevel(self.levelNumber); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.jumpTo = function (targetX, targetY, onComplete) { playerMoving = true; // Jump animation tween(self, { x: targetX, y: targetY - 30 }, { duration: 300, easing: tween.easeOut }); tween(self, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { playerMoving = false; if (onComplete) onComplete(); } }); }; return self; }); var Stone = Container.expand(function (isStable, level) { var self = Container.call(this); self.isStable = isStable; self.level = level; self.hasBeenStepped = false; var stoneGraphics = self.attachAsset(isStable ? 'stableStone' : 'unstableStone', { anchorX: 0.5, anchorY: 0.5 }); // Add subtle visual hints for stability if (!isStable) { stoneGraphics.alpha = 0.9; } self.stepOn = function () { if (self.hasBeenStepped) return false; self.hasBeenStepped = true; if (self.isStable) { // Stable stone - slight wobble tween(stoneGraphics, { scaleX: 1.1, scaleY: 1.1 }, { duration: 100 }); tween(stoneGraphics, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); return true; } else { // Unstable stone - crumble effect tween(stoneGraphics, { alpha: 0.3, scaleX: 0.8, scaleY: 0.8 }, { duration: 200 }); return false; } }; self.down = function (x, y, obj) { if (gameState === 'playing' && !playerMoving) { targetStone = self; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x4A90E2 }); /**** * Game Code ****/ // Game state variables var gameState = 'levelSelect'; // 'levelSelect', 'playing', 'gameOver' var currentLevel = 1; var timeLeft = 60; var gameTimer; var playerMoving = false; var targetStone = null; // Game objects var player; var stones = []; var startPlatform; var endPlatform; var levelButtons = []; // UI elements var timerText; var levelText; var instructionText; // Level configurations var levelConfigs = { 1: { color: 0xFFFFFF, timeLimit: 60, stableStones: 8, unstableStones: 4 }, 2: { color: 0x4A90E2, timeLimit: 50, stableStones: 7, unstableStones: 5 }, 3: { color: 0xFF6B35, timeLimit: 40, stableStones: 6, unstableStones: 6 }, 4: { color: 0x8E44AD, timeLimit: 35, stableStones: 5, unstableStones: 7 }, 5: { color: 0x27AE60, timeLimit: 30, stableStones: 4, unstableStones: 8 } }; // Initialize UI function initUI() { timerText = new Text2('Time: 60', { size: 80, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0); LK.gui.top.addChild(timerText); levelText = new Text2('Level 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); levelText.x = 150; levelText.y = 50; LK.gui.topLeft.addChild(levelText); instructionText = new Text2('Tap stones to jump!', { size: 50, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 1); LK.gui.bottom.addChild(instructionText); } // Create level selection screen function createLevelSelect() { gameState = 'levelSelect'; clearGame(); // Title var titleText = new Text2('Stepping Stones Challenge', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 400; game.addChild(titleText); // Level buttons var colors = [0xFFFFFF, 0x4A90E2, 0xFF6B35, 0x8E44AD, 0x27AE60]; var positions = [{ x: 512, y: 800 }, { x: 1024, y: 800 }, { x: 1536, y: 800 }, { x: 768, y: 1000 }, { x: 1280, y: 1000 }]; for (var i = 0; i < 5; i++) { var levelButton = new LevelButton(i + 1, colors[i], positions[i].x, positions[i].y); levelButtons.push(levelButton); game.addChild(levelButton); } instructionText.setText('Choose your level!'); } // Start a specific level function startLevel(level) { currentLevel = level; gameState = 'playing'; var config = levelConfigs[level]; timeLeft = config.timeLimit; clearGame(); createLevel(); // Start timer gameTimer = LK.setInterval(function () { timeLeft--; timerText.setText('Time: ' + timeLeft); if (timeLeft <= 0) { gameOver(false); } }, 1000); levelText.setText('Level ' + level); instructionText.setText('Tap stones to jump!'); } // Create level layout function createLevel() { var config = levelConfigs[currentLevel]; // Create start platform startPlatform = game.addChild(LK.getAsset('startPlatform', { anchorX: 0.5, anchorY: 0.5, x: 200, y: 2000 })); // Create end platform endPlatform = game.addChild(LK.getAsset('endPlatform', { anchorX: 0.5, anchorY: 0.5, x: 1848, y: 2000 })); // Create player player = game.addChild(new Player()); player.x = 200; player.y = 1950; // Generate stone positions var totalStones = config.stableStones + config.unstableStones; var stonePositions = []; // Create a path of stones for (var i = 0; i < totalStones; i++) { var x = 400 + i * 150 + (Math.random() * 100 - 50); var y = 1800 + (Math.random() * 400 - 200); stonePositions.push({ x: x, y: y }); } // Randomly assign stability var stableCount = config.stableStones; for (var i = 0; i < stonePositions.length; i++) { var isStable = stableCount > 0 && (Math.random() < 0.6 || stableCount >= stonePositions.length - i); if (isStable) stableCount--; var stone = new Stone(isStable, currentLevel); stone.x = stonePositions[i].x; stone.y = stonePositions[i].y; stones.push(stone); game.addChild(stone); } } // Clear game objects function clearGame() { // Clear stones for (var i = 0; i < stones.length; i++) { stones[i].destroy(); } stones = []; // Clear level buttons for (var i = 0; i < levelButtons.length; i++) { levelButtons[i].destroy(); } levelButtons = []; // Clear platforms and player if (startPlatform) { startPlatform.destroy(); startPlatform = null; } if (endPlatform) { endPlatform.destroy(); endPlatform = null; } if (player) { player.destroy(); player = null; } // Clear timer if (gameTimer) { LK.clearInterval(gameTimer); gameTimer = null; } // Clear any remaining children while (game.children.length > 0) { game.children[0].destroy(); } } // Game over handling function gameOver(success) { gameState = 'gameOver'; if (gameTimer) { LK.clearInterval(gameTimer); gameTimer = null; } if (success) { LK.getSound('success').play(); LK.setScore(LK.getScore() + timeLeft + currentLevel * 10); if (currentLevel >= 5) { LK.showYouWin(); } else { // Show success message and move to next level LK.setTimeout(function () { startLevel(currentLevel + 1); }, 2000); } } else { LK.getSound('fall').play(); LK.showGameOver(); } } // Initialize game initUI(); createLevelSelect(); // Game update loop game.update = function () { if (gameState === 'playing') { // Handle stone tapping if (targetStone && !playerMoving) { var distance = Math.sqrt(Math.pow(targetStone.x - player.x, 2) + Math.pow(targetStone.y - player.y, 2)); if (distance < 200) { // Within jumping range LK.getSound('jump').play(); player.jumpTo(targetStone.x, targetStone.y, function () { var success = targetStone.stepOn(); if (!success) { gameOver(false); } else { // Check if reached end platform var endDistance = Math.sqrt(Math.pow(endPlatform.x - player.x, 2) + Math.pow(endPlatform.y - player.y, 2)); if (endDistance < 150) { gameOver(true); } } }); } targetStone = null; } // Check if player can reach end platform directly if (!playerMoving && endPlatform) { var endDistance = Math.sqrt(Math.pow(endPlatform.x - player.x, 2) + Math.pow(endPlatform.y - player.y, 2)); if (endDistance < 200) { // Allow direct jump to end platform if (LK.ticks % 10 === 0) { instructionText.setText('Tap end platform to finish!'); } } } } }; // Handle direct clicks on end platform game.down = function (x, y, obj) { if (gameState === 'playing' && !playerMoving && endPlatform) { var endDistance = Math.sqrt(Math.pow(endPlatform.x - player.x, 2) + Math.pow(endPlatform.y - player.y, 2)); if (endDistance < 200) { // Check if click is on end platform var localPos = endPlatform.toLocal({ x: x, y: y }); if (Math.abs(localPos.x) < 100 && Math.abs(localPos.y) < 50) { LK.getSound('jump').play(); player.jumpTo(endPlatform.x, endPlatform.y - 50, function () { gameOver(true); }); } } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,415 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var LevelButton = Container.expand(function (levelNumber, color, x, y) {
+ var self = Container.call(this);
+ self.levelNumber = levelNumber;
+ self.x = x;
+ self.y = y;
+ var buttonGraphics = self.attachAsset('stableStone', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: color
+ });
+ var levelText = new Text2(levelNumber.toString(), {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ levelText.anchor.set(0.5, 0.5);
+ self.addChild(levelText);
+ self.down = function (x, y, obj) {
+ if (gameState === 'levelSelect') {
+ startLevel(self.levelNumber);
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.jumpTo = function (targetX, targetY, onComplete) {
+ playerMoving = true;
+ // Jump animation
+ tween(self, {
+ x: targetX,
+ y: targetY - 30
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ tween(self, {
+ x: targetX,
+ y: targetY
+ }, {
+ duration: 300,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ playerMoving = false;
+ if (onComplete) onComplete();
+ }
+ });
+ };
+ return self;
+});
+var Stone = Container.expand(function (isStable, level) {
+ var self = Container.call(this);
+ self.isStable = isStable;
+ self.level = level;
+ self.hasBeenStepped = false;
+ var stoneGraphics = self.attachAsset(isStable ? 'stableStone' : 'unstableStone', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Add subtle visual hints for stability
+ if (!isStable) {
+ stoneGraphics.alpha = 0.9;
+ }
+ self.stepOn = function () {
+ if (self.hasBeenStepped) return false;
+ self.hasBeenStepped = true;
+ if (self.isStable) {
+ // Stable stone - slight wobble
+ tween(stoneGraphics, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 100
+ });
+ tween(stoneGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 100
+ });
+ return true;
+ } else {
+ // Unstable stone - crumble effect
+ tween(stoneGraphics, {
+ alpha: 0.3,
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 200
+ });
+ return false;
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (gameState === 'playing' && !playerMoving) {
+ targetStone = self;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x4A90E2
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var gameState = 'levelSelect'; // 'levelSelect', 'playing', 'gameOver'
+var currentLevel = 1;
+var timeLeft = 60;
+var gameTimer;
+var playerMoving = false;
+var targetStone = null;
+// Game objects
+var player;
+var stones = [];
+var startPlatform;
+var endPlatform;
+var levelButtons = [];
+// UI elements
+var timerText;
+var levelText;
+var instructionText;
+// Level configurations
+var levelConfigs = {
+ 1: {
+ color: 0xFFFFFF,
+ timeLimit: 60,
+ stableStones: 8,
+ unstableStones: 4
+ },
+ 2: {
+ color: 0x4A90E2,
+ timeLimit: 50,
+ stableStones: 7,
+ unstableStones: 5
+ },
+ 3: {
+ color: 0xFF6B35,
+ timeLimit: 40,
+ stableStones: 6,
+ unstableStones: 6
+ },
+ 4: {
+ color: 0x8E44AD,
+ timeLimit: 35,
+ stableStones: 5,
+ unstableStones: 7
+ },
+ 5: {
+ color: 0x27AE60,
+ timeLimit: 30,
+ stableStones: 4,
+ unstableStones: 8
+ }
+};
+// Initialize UI
+function initUI() {
+ timerText = new Text2('Time: 60', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ timerText.anchor.set(0.5, 0);
+ LK.gui.top.addChild(timerText);
+ levelText = new Text2('Level 1', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ levelText.anchor.set(0, 0);
+ levelText.x = 150;
+ levelText.y = 50;
+ LK.gui.topLeft.addChild(levelText);
+ instructionText = new Text2('Tap stones to jump!', {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ instructionText.anchor.set(0.5, 1);
+ LK.gui.bottom.addChild(instructionText);
+}
+// Create level selection screen
+function createLevelSelect() {
+ gameState = 'levelSelect';
+ clearGame();
+ // Title
+ var titleText = new Text2('Stepping Stones Challenge', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ titleText.anchor.set(0.5, 0.5);
+ titleText.x = 1024;
+ titleText.y = 400;
+ game.addChild(titleText);
+ // Level buttons
+ var colors = [0xFFFFFF, 0x4A90E2, 0xFF6B35, 0x8E44AD, 0x27AE60];
+ var positions = [{
+ x: 512,
+ y: 800
+ }, {
+ x: 1024,
+ y: 800
+ }, {
+ x: 1536,
+ y: 800
+ }, {
+ x: 768,
+ y: 1000
+ }, {
+ x: 1280,
+ y: 1000
+ }];
+ for (var i = 0; i < 5; i++) {
+ var levelButton = new LevelButton(i + 1, colors[i], positions[i].x, positions[i].y);
+ levelButtons.push(levelButton);
+ game.addChild(levelButton);
+ }
+ instructionText.setText('Choose your level!');
+}
+// Start a specific level
+function startLevel(level) {
+ currentLevel = level;
+ gameState = 'playing';
+ var config = levelConfigs[level];
+ timeLeft = config.timeLimit;
+ clearGame();
+ createLevel();
+ // Start timer
+ gameTimer = LK.setInterval(function () {
+ timeLeft--;
+ timerText.setText('Time: ' + timeLeft);
+ if (timeLeft <= 0) {
+ gameOver(false);
+ }
+ }, 1000);
+ levelText.setText('Level ' + level);
+ instructionText.setText('Tap stones to jump!');
+}
+// Create level layout
+function createLevel() {
+ var config = levelConfigs[currentLevel];
+ // Create start platform
+ startPlatform = game.addChild(LK.getAsset('startPlatform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 200,
+ y: 2000
+ }));
+ // Create end platform
+ endPlatform = game.addChild(LK.getAsset('endPlatform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1848,
+ y: 2000
+ }));
+ // Create player
+ player = game.addChild(new Player());
+ player.x = 200;
+ player.y = 1950;
+ // Generate stone positions
+ var totalStones = config.stableStones + config.unstableStones;
+ var stonePositions = [];
+ // Create a path of stones
+ for (var i = 0; i < totalStones; i++) {
+ var x = 400 + i * 150 + (Math.random() * 100 - 50);
+ var y = 1800 + (Math.random() * 400 - 200);
+ stonePositions.push({
+ x: x,
+ y: y
+ });
+ }
+ // Randomly assign stability
+ var stableCount = config.stableStones;
+ for (var i = 0; i < stonePositions.length; i++) {
+ var isStable = stableCount > 0 && (Math.random() < 0.6 || stableCount >= stonePositions.length - i);
+ if (isStable) stableCount--;
+ var stone = new Stone(isStable, currentLevel);
+ stone.x = stonePositions[i].x;
+ stone.y = stonePositions[i].y;
+ stones.push(stone);
+ game.addChild(stone);
+ }
+}
+// Clear game objects
+function clearGame() {
+ // Clear stones
+ for (var i = 0; i < stones.length; i++) {
+ stones[i].destroy();
+ }
+ stones = [];
+ // Clear level buttons
+ for (var i = 0; i < levelButtons.length; i++) {
+ levelButtons[i].destroy();
+ }
+ levelButtons = [];
+ // Clear platforms and player
+ if (startPlatform) {
+ startPlatform.destroy();
+ startPlatform = null;
+ }
+ if (endPlatform) {
+ endPlatform.destroy();
+ endPlatform = null;
+ }
+ if (player) {
+ player.destroy();
+ player = null;
+ }
+ // Clear timer
+ if (gameTimer) {
+ LK.clearInterval(gameTimer);
+ gameTimer = null;
+ }
+ // Clear any remaining children
+ while (game.children.length > 0) {
+ game.children[0].destroy();
+ }
+}
+// Game over handling
+function gameOver(success) {
+ gameState = 'gameOver';
+ if (gameTimer) {
+ LK.clearInterval(gameTimer);
+ gameTimer = null;
+ }
+ if (success) {
+ LK.getSound('success').play();
+ LK.setScore(LK.getScore() + timeLeft + currentLevel * 10);
+ if (currentLevel >= 5) {
+ LK.showYouWin();
+ } else {
+ // Show success message and move to next level
+ LK.setTimeout(function () {
+ startLevel(currentLevel + 1);
+ }, 2000);
+ }
+ } else {
+ LK.getSound('fall').play();
+ LK.showGameOver();
+ }
+}
+// Initialize game
+initUI();
+createLevelSelect();
+// Game update loop
+game.update = function () {
+ if (gameState === 'playing') {
+ // Handle stone tapping
+ if (targetStone && !playerMoving) {
+ var distance = Math.sqrt(Math.pow(targetStone.x - player.x, 2) + Math.pow(targetStone.y - player.y, 2));
+ if (distance < 200) {
+ // Within jumping range
+ LK.getSound('jump').play();
+ player.jumpTo(targetStone.x, targetStone.y, function () {
+ var success = targetStone.stepOn();
+ if (!success) {
+ gameOver(false);
+ } else {
+ // Check if reached end platform
+ var endDistance = Math.sqrt(Math.pow(endPlatform.x - player.x, 2) + Math.pow(endPlatform.y - player.y, 2));
+ if (endDistance < 150) {
+ gameOver(true);
+ }
+ }
+ });
+ }
+ targetStone = null;
+ }
+ // Check if player can reach end platform directly
+ if (!playerMoving && endPlatform) {
+ var endDistance = Math.sqrt(Math.pow(endPlatform.x - player.x, 2) + Math.pow(endPlatform.y - player.y, 2));
+ if (endDistance < 200) {
+ // Allow direct jump to end platform
+ if (LK.ticks % 10 === 0) {
+ instructionText.setText('Tap end platform to finish!');
+ }
+ }
+ }
+ }
+};
+// Handle direct clicks on end platform
+game.down = function (x, y, obj) {
+ if (gameState === 'playing' && !playerMoving && endPlatform) {
+ var endDistance = Math.sqrt(Math.pow(endPlatform.x - player.x, 2) + Math.pow(endPlatform.y - player.y, 2));
+ if (endDistance < 200) {
+ // Check if click is on end platform
+ var localPos = endPlatform.toLocal({
+ x: x,
+ y: y
+ });
+ if (Math.abs(localPos.x) < 100 && Math.abs(localPos.y) < 50) {
+ LK.getSound('jump').play();
+ player.jumpTo(endPlatform.x, endPlatform.y - 50, function () {
+ gameOver(true);
+ });
+ }
+ }
+ }
+};
\ No newline at end of file