/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var BeachBall = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('beach_ball', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = { x: 0, y: 0 }; self.speed = 10; self.active = true; self.radius = ballGraphics.width / 2; self.reset = function () { self.x = 2048 / 2; self.y = 2732 / 2; self.velocity.x = (Math.random() > 0.5 ? 1 : -1) * self.speed; self.velocity.y = 7; }; self.reverseY = function () { self.velocity.y *= -1; LK.getSound('hit').play(); }; self.update = function () { if (!self.active) { return; } self.x += self.velocity.x; self.y += self.velocity.y; // Wall collision if (self.x - self.radius < 0 || self.x + self.radius > 2048) { self.velocity.x *= -1; LK.getSound('hit').play(); } }; self.reset(); return self; }); var Paddle = Container.expand(function () { var self = Container.call(this); var paddleGraphics = self.attachAsset('crab_paddle', { anchorX: 0.5, anchorY: 0.5 }); self.width = paddleGraphics.width; self.height = paddleGraphics.height; self.defaultWidth = self.width; self.expand = function () { tween(paddleGraphics, { width: self.defaultWidth * 1.5 }, { duration: 300, easing: tween.easeOut }); self.width = self.defaultWidth * 1.5; }; self.normal = function () { tween(paddleGraphics, { width: self.defaultWidth }, { duration: 300, easing: tween.easeOut }); self.width = self.defaultWidth; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('power_up', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'expand'; // Default type self.active = true; self.speed = 3; self.update = function () { if (!self.active) { return; } self.y += self.speed; // Remove if it goes off screen if (self.y > 2732 + 50) { self.active = false; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Black background }); /**** * Game Code ****/ // Game state variables var gameStarted = false; var score = 0; var highScore = storage.highScore || 0; var lives = 3; var powerUpTimer = 0; var powerUpActive = false; // Create beach environment var beach = LK.getAsset('beach_background', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 2048, height: 2732 }); game.addChild(beach); var water = LK.getAsset('water', { anchorX: 0, anchorY: 0, x: 0, y: 2200, width: 2048, alpha: 0.8 }); game.addChild(water); // Create player paddle (crab) var playerPaddle = new Paddle(); playerPaddle.x = 2048 / 2; playerPaddle.y = 2550; game.addChild(playerPaddle); // Create AI paddle (crab) var aiPaddle = new Paddle(); aiPaddle.x = 2048 / 2; aiPaddle.y = 200; // Use AI paddle asset instead of player paddle var aiPaddleGraphics = aiPaddle.children[0]; aiPaddleGraphics.texture = LK.getAsset('ai_paddle', {}).texture; game.addChild(aiPaddle); // Create beach ball var beachBall = new BeachBall(); game.addChild(beachBall); // Create power-ups array var powerUps = []; // Create GUI elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); var livesTxt = new Text2('Lives: ' + lives, { size: 80, fill: 0xFFFFFF }); livesTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(livesTxt); // Position it a bit to the right to avoid overlap with menu icon livesTxt.x = 120; var instructionsTxt = new Text2('Drag the crab to play!', { size: 100, fill: 0xFFFFFF }); instructionsTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionsTxt); // Game drag functionality var isDragging = false; game.down = function (x, y, obj) { if (!gameStarted) { gameStarted = true; instructionsTxt.visible = false; } isDragging = true; playerPaddle.x = x; }; game.move = function (x, y, obj) { if (isDragging) { playerPaddle.x = x; // Keep paddle within bounds if (playerPaddle.x < playerPaddle.width / 2) { playerPaddle.x = playerPaddle.width / 2; } else if (playerPaddle.x > 2048 - playerPaddle.width / 2) { playerPaddle.x = 2048 - playerPaddle.width / 2; } } }; game.up = function (x, y, obj) { isDragging = false; }; // Simple AI movement function function updateAI() { // AI follows the ball with slight delay var targetX = beachBall.x; // Add some randomness to make AI beatable if (Math.random() < 0.3) { targetX += (Math.random() - 0.5) * 200; } // Move AI paddle towards target var dx = targetX - aiPaddle.x; aiPaddle.x += dx * 0.05; // Keep AI paddle within bounds if (aiPaddle.x < aiPaddle.width / 2) { aiPaddle.x = aiPaddle.width / 2; } else if (aiPaddle.x > 2048 - aiPaddle.width / 2) { aiPaddle.x = 2048 - aiPaddle.width / 2; } } // Function to check paddle collisions function checkPaddleCollisions() { // Check collision with player paddle if (beachBall.velocity.y > 0 && beachBall.y + beachBall.radius >= playerPaddle.y - playerPaddle.height / 2 && beachBall.y - beachBall.radius <= playerPaddle.y + playerPaddle.height / 2 && beachBall.x >= playerPaddle.x - playerPaddle.width / 2 && beachBall.x <= playerPaddle.x + playerPaddle.width / 2) { beachBall.reverseY(); // Calculate new x velocity based on hit position relative to paddle center var hitPos = (beachBall.x - playerPaddle.x) / (playerPaddle.width / 2); beachBall.velocity.x = hitPos * beachBall.speed * 1.5; // Increase speed slightly beachBall.speed += 0.2; if (beachBall.speed > 20) { beachBall.speed = 20; } } // Check collision with AI paddle if (beachBall.velocity.y < 0 && beachBall.y - beachBall.radius <= aiPaddle.y + aiPaddle.height / 2 && beachBall.y + beachBall.radius >= aiPaddle.y - aiPaddle.height / 2 && beachBall.x >= aiPaddle.x - aiPaddle.width / 2 && beachBall.x <= aiPaddle.x + aiPaddle.width / 2) { beachBall.reverseY(); // Calculate new x velocity based on hit position relative to paddle center var hitPos = (beachBall.x - aiPaddle.x) / (aiPaddle.width / 2); beachBall.velocity.x = hitPos * beachBall.speed * 1.5; } } // Function to spawn a power-up function spawnPowerUp() { var powerUp = new PowerUp(); powerUp.x = Math.random() * (2048 - 100) + 50; powerUp.y = -50; // Randomly select power-up type var types = ['expand', 'speed', 'multiball']; powerUp.type = types[Math.floor(Math.random() * types.length)]; // Set color based on type if (powerUp.type === 'expand') { powerUp.children[0].tint = 0x2ECC71; // Green } else if (powerUp.type === 'speed') { powerUp.children[0].tint = 0x3498DB; // Blue } else { powerUp.children[0].tint = 0x9B59B6; // Purple } powerUps.push(powerUp); game.addChild(powerUp); } // Function to check power-up collisions function checkPowerUpCollisions() { for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; if (!powerUp.active) { powerUp.destroy(); powerUps.splice(i, 1); continue; } // Check if player paddle caught the power-up if (powerUp.y + 35 >= playerPaddle.y - playerPaddle.height / 2 && powerUp.y - 35 <= playerPaddle.y + playerPaddle.height / 2 && powerUp.x >= playerPaddle.x - playerPaddle.width / 2 && powerUp.x <= playerPaddle.x + playerPaddle.width / 2) { // Apply power-up effect applyPowerUp(powerUp.type); // Play power-up sound LK.getSound('powerup').play(); // Remove power-up powerUp.destroy(); powerUps.splice(i, 1); } } } // Function to apply power-up effects function applyPowerUp(type) { powerUpActive = true; powerUpTimer = 300; // 5 seconds at 60fps if (type === 'expand') { playerPaddle.expand(); } else if (type === 'speed') { beachBall.speed *= 0.7; // Slow down ball } else if (type === 'multiball') { // Add another ball (not implemented in MVP) // Would require tracking multiple balls } } // Main game update function game.update = function () { if (!gameStarted) { return; } // Update ball beachBall.update(); // Update AI updateAI(); // Check paddle collisions checkPaddleCollisions(); // Update power-ups for (var i = 0; i < powerUps.length; i++) { powerUps[i].update(); } // Check power-up collisions checkPowerUpCollisions(); // Manage power-up timer if (powerUpActive) { powerUpTimer--; if (powerUpTimer <= 0) { powerUpActive = false; playerPaddle.normal(); beachBall.speed = 10; // Reset ball speed } } // Spawn power-ups occasionally if (LK.ticks % 300 === 0 && Math.random() < 0.5) { spawnPowerUp(); } // Check if ball went past AI (player scores) if (beachBall.y < -beachBall.radius) { score++; scoreTxt.setText('Score: ' + score); LK.getSound('score').play(); beachBall.reset(); // Update high score if needed if (score > highScore) { highScore = score; storage.highScore = highScore; } } // Check if ball went past player (lose life) if (beachBall.y > 2732 + beachBall.radius) { lives--; livesTxt.setText('Lives: ' + lives); beachBall.reset(); if (lives <= 0) { // Game over LK.effects.flashScreen(0xFF0000, 1000); LK.setScore(score); // Set score for game over screen LK.showGameOver(); } } }; // Start background music LK.playMusic('beach_music', { fade: { start: 0, end: 0.4, duration: 1000 } });
===================================================================
--- original.js
+++ change.js
@@ -101,9 +101,9 @@
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x87CEEB // Sky blue background
+ backgroundColor: 0x000000 // Black background
});
/****
* Game Code
red crab 2d 32 bit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
gap sea water beach and sand top down anime style.
white plain sea turtle egg. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
polkadot white red seastar. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows