Code edit (1 edits merged)
Please save this source code
User prompt
Powerpuff Snowball Rolling Adventure
Initial prompt
The powerpuff girls: they have make a snow-man with a top hat and a grey scarf. But.... Tap on the giant snowball to make it roll through 9 trees. Tap on it to make it roll again. Until it reaches to the fence.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Snowball = Container.expand(function () { var self = Container.call(this); var snowballGraphics = self.attachAsset('snowball', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.friction = 0.95; self.isMoving = false; self.update = function () { // Apply velocity self.x += self.velocityX; self.y += self.velocityY; // Apply friction self.velocityX *= self.friction; self.velocityY *= self.friction; // Stop if moving very slowly if (Math.abs(self.velocityX) < 0.1 && Math.abs(self.velocityY) < 0.1) { self.velocityX = 0; self.velocityY = 0; self.isMoving = false; } else { self.isMoving = true; } // Rotate based on movement if (self.isMoving) { snowballGraphics.rotation += 0.1; } // Keep within bounds if (self.x < 100) self.x = 100; if (self.x > 1948) self.x = 1948; if (self.y < 100) self.y = 100; }; self.addForce = function (forceX, forceY) { self.velocityX += forceX; self.velocityY += forceY; }; return self; }); var Tree = Container.expand(function () { var self = Container.call(this); var treeGraphics = self.attachAsset('tree', { anchorX: 0.5, anchorY: 1.0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf0f8ff }); /**** * Game Code ****/ // Game variables var snowball; var trees = []; var fence; var gameWon = false; var lastTapTime = 0; // Create ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Create snowball snowball = game.addChild(new Snowball()); snowball.x = 200; snowball.y = 2400; // Create trees in strategic positions var treePositions = [{ x: 400, y: 2100 }, { x: 800, y: 1900 }, { x: 1200, y: 2000 }, { x: 600, y: 1700 }, { x: 1000, y: 1500 }, { x: 1400, y: 1600 }, { x: 500, y: 1300 }, { x: 900, y: 1100 }, { x: 1300, y: 1200 }]; for (var i = 0; i < treePositions.length; i++) { var tree = game.addChild(new Tree()); tree.x = treePositions[i].x; tree.y = treePositions[i].y; trees.push(tree); } // Create fence at the end fence = game.addChild(LK.getAsset('fence', { anchorX: 0.5, anchorY: 1.0, x: 1024, y: 800 })); // Score display var instructionText = new Text2('Tap to roll the snowball to the fence!', { size: 60, fill: 0x2D5016 }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); instructionText.y = 150; // Game controls game.down = function (x, y, obj) { if (gameWon) return; var currentTime = Date.now(); if (currentTime - lastTapTime < 200) return; // Prevent rapid tapping lastTapTime = currentTime; // Convert tap position to direction var tapX = x; var tapY = y; // Calculate direction from snowball to tap var dirX = tapX - snowball.x; var dirY = tapY - snowball.y; // Normalize direction var distance = Math.sqrt(dirX * dirX + dirY * dirY); if (distance > 0) { dirX /= distance; dirY /= distance; } // Apply force in that direction snowball.addForce(dirX * 8, dirY * 8); // Play roll sound LK.getSound('roll').play(); }; // Game update loop game.update = function () { if (gameWon) return; // Check collision with trees for (var i = 0; i < trees.length; i++) { var tree = trees[i]; if (snowball.intersects(tree)) { // Stop the snowball snowball.velocityX *= -0.3; snowball.velocityY *= -0.3; // Push snowball away from tree var pushX = snowball.x - tree.x; var pushY = snowball.y - tree.y; var pushDistance = Math.sqrt(pushX * pushX + pushY * pushY); if (pushDistance > 0) { pushX /= pushDistance; pushY /= pushDistance; snowball.x = tree.x + pushX * 150; snowball.y = tree.y + pushY * 150; } LK.getSound('hit').play(); LK.effects.flashObject(tree, 0xff0000, 300); } } // Check if reached fence if (snowball.y <= 900 && !gameWon) { gameWon = true; LK.getSound('win').play(); LK.effects.flashScreen(0x00ff00, 1000); // Update instruction text instructionText.setText('Success! Snowball reached the fence!'); // Add score and show win LK.setScore(100); LK.setTimeout(function () { LK.showYouWin(); }, 1500); } // Game over if snowball gets stuck at bottom for too long if (snowball.y > 2500 && !snowball.isMoving) { var stuckTimer = snowball.stuckTimer || 0; snowball.stuckTimer = stuckTimer + 1; if (snowball.stuckTimer > 180) { // 3 seconds at 60fps LK.effects.flashScreen(0xff0000, 1000); LK.setTimeout(function () { LK.showGameOver(); }, 1000); } } else { snowball.stuckTimer = 0; } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,209 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Snowball = Container.expand(function () {
+ var self = Container.call(this);
+ var snowballGraphics = self.attachAsset('snowball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.friction = 0.95;
+ self.isMoving = false;
+ self.update = function () {
+ // Apply velocity
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Apply friction
+ self.velocityX *= self.friction;
+ self.velocityY *= self.friction;
+ // Stop if moving very slowly
+ if (Math.abs(self.velocityX) < 0.1 && Math.abs(self.velocityY) < 0.1) {
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.isMoving = false;
+ } else {
+ self.isMoving = true;
+ }
+ // Rotate based on movement
+ if (self.isMoving) {
+ snowballGraphics.rotation += 0.1;
+ }
+ // Keep within bounds
+ if (self.x < 100) self.x = 100;
+ if (self.x > 1948) self.x = 1948;
+ if (self.y < 100) self.y = 100;
+ };
+ self.addForce = function (forceX, forceY) {
+ self.velocityX += forceX;
+ self.velocityY += forceY;
+ };
+ return self;
+});
+var Tree = Container.expand(function () {
+ var self = Container.call(this);
+ var treeGraphics = self.attachAsset('tree', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0xf0f8ff
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var snowball;
+var trees = [];
+var fence;
+var gameWon = false;
+var lastTapTime = 0;
+// Create ground
+var ground = game.addChild(LK.getAsset('ground', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0
+}));
+// Create snowball
+snowball = game.addChild(new Snowball());
+snowball.x = 200;
+snowball.y = 2400;
+// Create trees in strategic positions
+var treePositions = [{
+ x: 400,
+ y: 2100
+}, {
+ x: 800,
+ y: 1900
+}, {
+ x: 1200,
+ y: 2000
+}, {
+ x: 600,
+ y: 1700
+}, {
+ x: 1000,
+ y: 1500
+}, {
+ x: 1400,
+ y: 1600
+}, {
+ x: 500,
+ y: 1300
+}, {
+ x: 900,
+ y: 1100
+}, {
+ x: 1300,
+ y: 1200
+}];
+for (var i = 0; i < treePositions.length; i++) {
+ var tree = game.addChild(new Tree());
+ tree.x = treePositions[i].x;
+ tree.y = treePositions[i].y;
+ trees.push(tree);
+}
+// Create fence at the end
+fence = game.addChild(LK.getAsset('fence', {
+ anchorX: 0.5,
+ anchorY: 1.0,
+ x: 1024,
+ y: 800
+}));
+// Score display
+var instructionText = new Text2('Tap to roll the snowball to the fence!', {
+ size: 60,
+ fill: 0x2D5016
+});
+instructionText.anchor.set(0.5, 0);
+LK.gui.top.addChild(instructionText);
+instructionText.y = 150;
+// Game controls
+game.down = function (x, y, obj) {
+ if (gameWon) return;
+ var currentTime = Date.now();
+ if (currentTime - lastTapTime < 200) return; // Prevent rapid tapping
+ lastTapTime = currentTime;
+ // Convert tap position to direction
+ var tapX = x;
+ var tapY = y;
+ // Calculate direction from snowball to tap
+ var dirX = tapX - snowball.x;
+ var dirY = tapY - snowball.y;
+ // Normalize direction
+ var distance = Math.sqrt(dirX * dirX + dirY * dirY);
+ if (distance > 0) {
+ dirX /= distance;
+ dirY /= distance;
+ }
+ // Apply force in that direction
+ snowball.addForce(dirX * 8, dirY * 8);
+ // Play roll sound
+ LK.getSound('roll').play();
+};
+// Game update loop
+game.update = function () {
+ if (gameWon) return;
+ // Check collision with trees
+ for (var i = 0; i < trees.length; i++) {
+ var tree = trees[i];
+ if (snowball.intersects(tree)) {
+ // Stop the snowball
+ snowball.velocityX *= -0.3;
+ snowball.velocityY *= -0.3;
+ // Push snowball away from tree
+ var pushX = snowball.x - tree.x;
+ var pushY = snowball.y - tree.y;
+ var pushDistance = Math.sqrt(pushX * pushX + pushY * pushY);
+ if (pushDistance > 0) {
+ pushX /= pushDistance;
+ pushY /= pushDistance;
+ snowball.x = tree.x + pushX * 150;
+ snowball.y = tree.y + pushY * 150;
+ }
+ LK.getSound('hit').play();
+ LK.effects.flashObject(tree, 0xff0000, 300);
+ }
+ }
+ // Check if reached fence
+ if (snowball.y <= 900 && !gameWon) {
+ gameWon = true;
+ LK.getSound('win').play();
+ LK.effects.flashScreen(0x00ff00, 1000);
+ // Update instruction text
+ instructionText.setText('Success! Snowball reached the fence!');
+ // Add score and show win
+ LK.setScore(100);
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 1500);
+ }
+ // Game over if snowball gets stuck at bottom for too long
+ if (snowball.y > 2500 && !snowball.isMoving) {
+ var stuckTimer = snowball.stuckTimer || 0;
+ snowball.stuckTimer = stuckTimer + 1;
+ if (snowball.stuckTimer > 180) {
+ // 3 seconds at 60fps
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1000);
+ }
+ } else {
+ snowball.stuckTimer = 0;
+ }
+};
\ No newline at end of file