User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'split')' in or related to this line: 'speedText.setText('Ball Speed: ' + speedText.text.split(':')[1] + ' (Speed up in ' + remainingTime + ')');' Line Number: 754
User prompt
Speed up ball every 30 second
User prompt
Polish the game
User prompt
Change interface
User prompt
Save progress ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Speed up the ball speed ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Speed up ball speed
Code edit (1 edits merged)
Please save this source code
User prompt
Cosmic Pong Showdown
User prompt
Please continue polishing my design document.
Initial prompt
Create a cat racing game car colour is red and trafic
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Alien = Container.expand(function () { var self = Container.call(this); var alienGraphics = self.attachAsset('alien', { anchorX: 0.5, anchorY: 0.5 }); self.radius = alienGraphics.width / 2; self.health = 1; self.points = 10; self.hitByBall = function () { LK.getSound('alienHit').play(); self.health--; if (self.health <= 0) { return true; // Destroyed } // Visual feedback tween(alienGraphics, { alpha: 0.3 }, { duration: 100, onFinish: function onFinish() { tween(alienGraphics, { alpha: 1 }, { duration: 100 }); } }); return false; // Not destroyed }; return self; }); var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); self.radius = ballGraphics.width / 2; self.speedX = 0; self.speedY = 0; self.active = false; self.launch = function (speedX, speedY) { self.speedX = speedX; self.speedY = speedY; self.active = true; }; self.update = function () { if (!self.active) { return; } self.x += self.speedX; self.y += self.speedY; // Bounce off sides if (self.x - self.radius <= 0 || self.x + self.radius >= 2048) { self.speedX *= -1; LK.getSound('bounce').play(); } // Bounce off top if (self.y - self.radius <= 0) { self.speedY *= -1; LK.getSound('bounce').play(); } }; return self; }); var Paddle = Container.expand(function () { var self = Container.call(this); var paddleGraphics = self.attachAsset('paddle', { anchorX: 0.5, anchorY: 0.5 }); self.width = paddleGraphics.width; self.height = paddleGraphics.height; self.originalWidth = paddleGraphics.width; self.expandPaddle = function (factor) { var newWidth = self.originalWidth * factor; tween(paddleGraphics, { width: newWidth }, { duration: 300, easing: tween.easeOut }); self.width = newWidth; }; self.resetSize = function () { tween(paddleGraphics, { width: self.originalWidth }, { duration: 300, easing: tween.easeOut }); self.width = self.originalWidth; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'expand'; // Default type self.speedY = 3; // Falling speed self.update = function () { self.y += self.speedY; }; return self; }); var Star = Container.expand(function () { var self = Container.call(this); var starGraphics = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5 }); self.speedY = Math.random() * 1 + 0.5; self.update = function () { self.y += self.speedY; if (self.y > 2732) { self.y = 0; self.x = Math.random() * 2048; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 }); /**** * Game Code ****/ // Game state variables var level = 1; var lives = 3; var paddle; var balls = []; var aliens = []; var powerUps = []; var stars = []; var isGameStarted = false; var isPaddlePowerUpActive = false; var paddlePowerUpTimer = null; // UI elements var scoreTxt; var livesTxt; var levelTxt; var startInstructionTxt; // Game settings var baseSpeed = 6; var alienRows = 3; var alienCols = 6; var alienSpacing = 120; // Initialize the game function initGame() { // Set up stars background for (var i = 0; i < 100; i++) { var star = new Star(); star.x = Math.random() * 2048; star.y = Math.random() * 2732; game.addChild(star); stars.push(star); } // Create paddle paddle = new Paddle(); paddle.x = 2048 / 2; paddle.y = 2732 - 100; game.addChild(paddle); // Create initial ball createBall(); // Create UI elements scoreTxt = new Text2('Score: ' + LK.getScore(), { size: 50, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); livesTxt = new Text2('Lives: ' + lives, { size: 50, fill: 0xFFFFFF }); livesTxt.anchor.set(1, 0); LK.gui.topLeft.addChild(livesTxt); levelTxt = new Text2('Level: ' + level, { size: 50, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); startInstructionTxt = new Text2('Tap to start', { size: 70, fill: 0xFFFFFF }); startInstructionTxt.anchor.set(0.5, 0.5); startInstructionTxt.x = 0; startInstructionTxt.y = 0; LK.gui.center.addChild(startInstructionTxt); // Create aliens createAliens(); // Start background music LK.playMusic('spaceBgMusic', { fade: { start: 0, end: 0.4, duration: 1000 } }); } function createBall() { var ball = new Ball(); ball.x = paddle.x; ball.y = paddle.y - paddle.height / 2 - ball.radius; game.addChild(ball); balls.push(ball); return ball; } function createAliens() { // Clear any existing aliens for (var i = aliens.length - 1; i >= 0; i--) { game.removeChild(aliens[i]); aliens.splice(i, 1); } // Create new aliens grid var startX = (2048 - alienCols * alienSpacing) / 2 + alienSpacing / 2; var startY = 200; for (var row = 0; row < alienRows; row++) { for (var col = 0; col < alienCols; col++) { var alien = new Alien(); alien.x = startX + col * alienSpacing; alien.y = startY + row * alienSpacing; // Higher rows have more health and worth more points if (row === 2) { alien.health = level + 1; alien.points = 30; tween(alien, { tint: 0xff0000 }, { duration: 0 }); } else if (row === 1) { alien.health = level; alien.points = 20; tween(alien, { tint: 0xff8800 }, { duration: 0 }); } game.addChild(alien); aliens.push(alien); } } } function startGame() { if (!isGameStarted) { isGameStarted = true; // Hide start instruction LK.gui.center.removeChild(startInstructionTxt); // Launch the ball var ball = balls[0]; var angleRad = Math.PI / 4 + Math.random() * Math.PI / 2; ball.launch(Math.cos(angleRad) * baseSpeed, -Math.sin(angleRad) * baseSpeed); } } function spawnPowerUp(x, y) { if (Math.random() > 0.3) { return; } // 30% chance to spawn var powerUp = new PowerUp(); powerUp.x = x; powerUp.y = y; // Randomize powerup type var types = ['expand', 'multiBall', 'slowDown']; powerUp.type = types[Math.floor(Math.random() * types.length)]; // Set color based on type if (powerUp.type === 'expand') { tween(powerUp, { tint: 0xf542f2 }, { duration: 0 }); } else if (powerUp.type === 'multiBall') { tween(powerUp, { tint: 0x42a4f5 }, { duration: 0 }); } else if (powerUp.type === 'slowDown') { tween(powerUp, { tint: 0xf5a742 }, { duration: 0 }); } game.addChild(powerUp); powerUps.push(powerUp); } function activatePowerUp(type) { LK.getSound('powerUpCollect').play(); switch (type) { case 'expand': // Cancel existing timer if active if (paddlePowerUpTimer) { LK.clearTimeout(paddlePowerUpTimer); } // Expand paddle paddle.expandPaddle(1.5); isPaddlePowerUpActive = true; // Reset after 10 seconds paddlePowerUpTimer = LK.setTimeout(function () { paddle.resetSize(); isPaddlePowerUpActive = false; }, 10000); break; case 'multiBall': // Create two new balls for (var i = 0; i < 2; i++) { var newBall = createBall(); var angle = Math.PI / 4 + Math.random() * Math.PI / 2; if (Math.random() > 0.5) { angle = Math.PI - angle; } newBall.launch(Math.cos(angle) * baseSpeed, -Math.sin(angle) * baseSpeed); } break; case 'slowDown': // Slow down all balls temporarily for (var j = 0; j < balls.length; j++) { var ball = balls[j]; var currentSpeed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY); var slowFactor = 0.5; ball.speedX = ball.speedX / currentSpeed * (baseSpeed * slowFactor); ball.speedY = ball.speedY / currentSpeed * (baseSpeed * slowFactor); tween(ball, { alpha: 0.7 }, { duration: 0 }); } // Reset ball speed after 8 seconds LK.setTimeout(function () { for (var k = 0; k < balls.length; k++) { var ball = balls[k]; var currentSpeed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY); ball.speedX = ball.speedX / currentSpeed * baseSpeed; ball.speedY = ball.speedY / currentSpeed * baseSpeed; tween(ball, { alpha: 1 }, { duration: 300 }); } }, 8000); break; } } function advanceLevel() { level++; levelTxt.setText('Level: ' + level); // Increase base speed baseSpeed = 6 + level * 0.5; // Add more rows for higher levels (max 5) alienRows = Math.min(5, 2 + Math.floor(level / 2)); // Create new aliens createAliens(); // Reset paddle if power-up was active if (isPaddlePowerUpActive) { paddle.resetSize(); LK.clearTimeout(paddlePowerUpTimer); isPaddlePowerUpActive = false; } // Create a new ball if there are none if (balls.length === 0) { var ball = createBall(); var angleRad = Math.PI / 4 + Math.random() * Math.PI / 2; ball.launch(Math.cos(angleRad) * baseSpeed, -Math.sin(angleRad) * baseSpeed); } } function loseLife() { lives--; livesTxt.setText('Lives: ' + lives); LK.getSound('ballLost').play(); if (lives <= 0) { LK.showGameOver(); return; } // Create a new ball createBall(); // Reset game state for new life isGameStarted = false; startInstructionTxt = new Text2('Tap to continue', { size: 70, fill: 0xFFFFFF }); startInstructionTxt.anchor.set(0.5, 0.5); startInstructionTxt.x = 0; startInstructionTxt.y = 0; LK.gui.center.addChild(startInstructionTxt); } // Movement handling function handleMove(x, y, obj) { // Update paddle position horizontally, constrained to screen bounds var halfPaddleWidth = paddle.width / 2; paddle.x = Math.max(halfPaddleWidth, Math.min(2048 - halfPaddleWidth, x)); // If game hasn't started, keep ball on paddle if (!isGameStarted && balls.length > 0) { balls[0].x = paddle.x; } } // Input handlers game.down = function (x, y, obj) { startGame(); handleMove(x, y, obj); }; game.move = handleMove; // Main update loop game.update = function () { // Update stars for (var s = 0; s < stars.length; s++) { stars[s].update(); } // Update all balls for (var i = balls.length - 1; i >= 0; i--) { var ball = balls[i]; // Check if ball is below the screen if (ball.y - ball.radius > 2732) { game.removeChild(ball); balls.splice(i, 1); // Only lose a life if this was the last ball if (balls.length === 0) { loseLife(); } continue; } // Check paddle collision if (ball.speedY > 0 && ball.y + ball.radius >= paddle.y - paddle.height / 2 && ball.y - ball.radius <= paddle.y + paddle.height / 2 && ball.x + ball.radius >= paddle.x - paddle.width / 2 && ball.x - ball.radius <= paddle.x + paddle.width / 2) { // Calculate bounce angle based on hit position relative to paddle center var hitPos = (ball.x - paddle.x) / (paddle.width / 2); var angle = hitPos * (Math.PI / 3); // Max 60 degree bounce ball.speedY = -Math.abs(ball.speedY); // Adjust X velocity based on where the ball hit the paddle var speed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY); ball.speedX = Math.sin(angle) * speed; ball.speedY = -Math.cos(angle) * speed; LK.getSound('bounce').play(); } // Check alien collisions for (var j = aliens.length - 1; j >= 0; j--) { var alien = aliens[j]; var dx = ball.x - alien.x; var dy = ball.y - alien.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= ball.radius + alien.radius) { // Bounce the ball var nx = dx / distance; var ny = dy / distance; var p = 2 * (ball.speedX * nx + ball.speedY * ny); ball.speedX -= p * nx; ball.speedY -= p * ny; // Damage the alien if (alien.hitByBall()) { // Add score LK.setScore(LK.getScore() + alien.points); scoreTxt.setText('Score: ' + LK.getScore()); // Spawn power-up spawnPowerUp(alien.x, alien.y); // Remove alien game.removeChild(alien); aliens.splice(j, 1); } // Only process one collision at a time break; } } } // Update power-ups for (var k = powerUps.length - 1; k >= 0; k--) { var powerUp = powerUps[k]; powerUp.update(); // Check if power-up is below screen if (powerUp.y > 2732) { game.removeChild(powerUp); powerUps.splice(k, 1); continue; } // Check collision with paddle if (powerUp.y + 15 >= paddle.y - paddle.height / 2 && powerUp.y - 15 <= paddle.y + paddle.height / 2 && powerUp.x + 15 >= paddle.x - paddle.width / 2 && powerUp.x - 15 <= paddle.x + paddle.width / 2) { activatePowerUp(powerUp.type); game.removeChild(powerUp); powerUps.splice(k, 1); } } // Check if all aliens are destroyed if (aliens.length === 0) { advanceLevel(); } }; // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,512 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Alien = Container.expand(function () {
+ var self = Container.call(this);
+ var alienGraphics = self.attachAsset('alien', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = alienGraphics.width / 2;
+ self.health = 1;
+ self.points = 10;
+ self.hitByBall = function () {
+ LK.getSound('alienHit').play();
+ self.health--;
+ if (self.health <= 0) {
+ return true; // Destroyed
+ }
+ // Visual feedback
+ tween(alienGraphics, {
+ alpha: 0.3
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(alienGraphics, {
+ alpha: 1
+ }, {
+ duration: 100
+ });
+ }
+ });
+ return false; // Not destroyed
+ };
+ return self;
+});
+var Ball = Container.expand(function () {
+ var self = Container.call(this);
+ var ballGraphics = self.attachAsset('ball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = ballGraphics.width / 2;
+ self.speedX = 0;
+ self.speedY = 0;
+ self.active = false;
+ self.launch = function (speedX, speedY) {
+ self.speedX = speedX;
+ self.speedY = speedY;
+ self.active = true;
+ };
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x += self.speedX;
+ self.y += self.speedY;
+ // Bounce off sides
+ if (self.x - self.radius <= 0 || self.x + self.radius >= 2048) {
+ self.speedX *= -1;
+ LK.getSound('bounce').play();
+ }
+ // Bounce off top
+ if (self.y - self.radius <= 0) {
+ self.speedY *= -1;
+ LK.getSound('bounce').play();
+ }
+ };
+ return self;
+});
+var Paddle = Container.expand(function () {
+ var self = Container.call(this);
+ var paddleGraphics = self.attachAsset('paddle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = paddleGraphics.width;
+ self.height = paddleGraphics.height;
+ self.originalWidth = paddleGraphics.width;
+ self.expandPaddle = function (factor) {
+ var newWidth = self.originalWidth * factor;
+ tween(paddleGraphics, {
+ width: newWidth
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ self.width = newWidth;
+ };
+ self.resetSize = function () {
+ tween(paddleGraphics, {
+ width: self.originalWidth
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ self.width = self.originalWidth;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'expand'; // Default type
+ self.speedY = 3; // Falling speed
+ self.update = function () {
+ self.y += self.speedY;
+ };
+ return self;
+});
+var Star = Container.expand(function () {
+ var self = Container.call(this);
+ var starGraphics = self.attachAsset('star', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speedY = Math.random() * 1 + 0.5;
+ self.update = function () {
+ self.y += self.speedY;
+ if (self.y > 2732) {
+ self.y = 0;
+ self.x = Math.random() * 2048;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000022
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var level = 1;
+var lives = 3;
+var paddle;
+var balls = [];
+var aliens = [];
+var powerUps = [];
+var stars = [];
+var isGameStarted = false;
+var isPaddlePowerUpActive = false;
+var paddlePowerUpTimer = null;
+// UI elements
+var scoreTxt;
+var livesTxt;
+var levelTxt;
+var startInstructionTxt;
+// Game settings
+var baseSpeed = 6;
+var alienRows = 3;
+var alienCols = 6;
+var alienSpacing = 120;
+// Initialize the game
+function initGame() {
+ // Set up stars background
+ for (var i = 0; i < 100; i++) {
+ var star = new Star();
+ star.x = Math.random() * 2048;
+ star.y = Math.random() * 2732;
+ game.addChild(star);
+ stars.push(star);
+ }
+ // Create paddle
+ paddle = new Paddle();
+ paddle.x = 2048 / 2;
+ paddle.y = 2732 - 100;
+ game.addChild(paddle);
+ // Create initial ball
+ createBall();
+ // Create UI elements
+ scoreTxt = new Text2('Score: ' + LK.getScore(), {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ scoreTxt.anchor.set(0, 0);
+ LK.gui.topRight.addChild(scoreTxt);
+ livesTxt = new Text2('Lives: ' + lives, {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ livesTxt.anchor.set(1, 0);
+ LK.gui.topLeft.addChild(livesTxt);
+ levelTxt = new Text2('Level: ' + level, {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ levelTxt.anchor.set(0.5, 0);
+ LK.gui.top.addChild(levelTxt);
+ startInstructionTxt = new Text2('Tap to start', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ startInstructionTxt.anchor.set(0.5, 0.5);
+ startInstructionTxt.x = 0;
+ startInstructionTxt.y = 0;
+ LK.gui.center.addChild(startInstructionTxt);
+ // Create aliens
+ createAliens();
+ // Start background music
+ LK.playMusic('spaceBgMusic', {
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 1000
+ }
+ });
+}
+function createBall() {
+ var ball = new Ball();
+ ball.x = paddle.x;
+ ball.y = paddle.y - paddle.height / 2 - ball.radius;
+ game.addChild(ball);
+ balls.push(ball);
+ return ball;
+}
+function createAliens() {
+ // Clear any existing aliens
+ for (var i = aliens.length - 1; i >= 0; i--) {
+ game.removeChild(aliens[i]);
+ aliens.splice(i, 1);
+ }
+ // Create new aliens grid
+ var startX = (2048 - alienCols * alienSpacing) / 2 + alienSpacing / 2;
+ var startY = 200;
+ for (var row = 0; row < alienRows; row++) {
+ for (var col = 0; col < alienCols; col++) {
+ var alien = new Alien();
+ alien.x = startX + col * alienSpacing;
+ alien.y = startY + row * alienSpacing;
+ // Higher rows have more health and worth more points
+ if (row === 2) {
+ alien.health = level + 1;
+ alien.points = 30;
+ tween(alien, {
+ tint: 0xff0000
+ }, {
+ duration: 0
+ });
+ } else if (row === 1) {
+ alien.health = level;
+ alien.points = 20;
+ tween(alien, {
+ tint: 0xff8800
+ }, {
+ duration: 0
+ });
+ }
+ game.addChild(alien);
+ aliens.push(alien);
+ }
+ }
+}
+function startGame() {
+ if (!isGameStarted) {
+ isGameStarted = true;
+ // Hide start instruction
+ LK.gui.center.removeChild(startInstructionTxt);
+ // Launch the ball
+ var ball = balls[0];
+ var angleRad = Math.PI / 4 + Math.random() * Math.PI / 2;
+ ball.launch(Math.cos(angleRad) * baseSpeed, -Math.sin(angleRad) * baseSpeed);
+ }
+}
+function spawnPowerUp(x, y) {
+ if (Math.random() > 0.3) {
+ return;
+ } // 30% chance to spawn
+ var powerUp = new PowerUp();
+ powerUp.x = x;
+ powerUp.y = y;
+ // Randomize powerup type
+ var types = ['expand', 'multiBall', 'slowDown'];
+ powerUp.type = types[Math.floor(Math.random() * types.length)];
+ // Set color based on type
+ if (powerUp.type === 'expand') {
+ tween(powerUp, {
+ tint: 0xf542f2
+ }, {
+ duration: 0
+ });
+ } else if (powerUp.type === 'multiBall') {
+ tween(powerUp, {
+ tint: 0x42a4f5
+ }, {
+ duration: 0
+ });
+ } else if (powerUp.type === 'slowDown') {
+ tween(powerUp, {
+ tint: 0xf5a742
+ }, {
+ duration: 0
+ });
+ }
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+}
+function activatePowerUp(type) {
+ LK.getSound('powerUpCollect').play();
+ switch (type) {
+ case 'expand':
+ // Cancel existing timer if active
+ if (paddlePowerUpTimer) {
+ LK.clearTimeout(paddlePowerUpTimer);
+ }
+ // Expand paddle
+ paddle.expandPaddle(1.5);
+ isPaddlePowerUpActive = true;
+ // Reset after 10 seconds
+ paddlePowerUpTimer = LK.setTimeout(function () {
+ paddle.resetSize();
+ isPaddlePowerUpActive = false;
+ }, 10000);
+ break;
+ case 'multiBall':
+ // Create two new balls
+ for (var i = 0; i < 2; i++) {
+ var newBall = createBall();
+ var angle = Math.PI / 4 + Math.random() * Math.PI / 2;
+ if (Math.random() > 0.5) {
+ angle = Math.PI - angle;
+ }
+ newBall.launch(Math.cos(angle) * baseSpeed, -Math.sin(angle) * baseSpeed);
+ }
+ break;
+ case 'slowDown':
+ // Slow down all balls temporarily
+ for (var j = 0; j < balls.length; j++) {
+ var ball = balls[j];
+ var currentSpeed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY);
+ var slowFactor = 0.5;
+ ball.speedX = ball.speedX / currentSpeed * (baseSpeed * slowFactor);
+ ball.speedY = ball.speedY / currentSpeed * (baseSpeed * slowFactor);
+ tween(ball, {
+ alpha: 0.7
+ }, {
+ duration: 0
+ });
+ }
+ // Reset ball speed after 8 seconds
+ LK.setTimeout(function () {
+ for (var k = 0; k < balls.length; k++) {
+ var ball = balls[k];
+ var currentSpeed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY);
+ ball.speedX = ball.speedX / currentSpeed * baseSpeed;
+ ball.speedY = ball.speedY / currentSpeed * baseSpeed;
+ tween(ball, {
+ alpha: 1
+ }, {
+ duration: 300
+ });
+ }
+ }, 8000);
+ break;
+ }
+}
+function advanceLevel() {
+ level++;
+ levelTxt.setText('Level: ' + level);
+ // Increase base speed
+ baseSpeed = 6 + level * 0.5;
+ // Add more rows for higher levels (max 5)
+ alienRows = Math.min(5, 2 + Math.floor(level / 2));
+ // Create new aliens
+ createAliens();
+ // Reset paddle if power-up was active
+ if (isPaddlePowerUpActive) {
+ paddle.resetSize();
+ LK.clearTimeout(paddlePowerUpTimer);
+ isPaddlePowerUpActive = false;
+ }
+ // Create a new ball if there are none
+ if (balls.length === 0) {
+ var ball = createBall();
+ var angleRad = Math.PI / 4 + Math.random() * Math.PI / 2;
+ ball.launch(Math.cos(angleRad) * baseSpeed, -Math.sin(angleRad) * baseSpeed);
+ }
+}
+function loseLife() {
+ lives--;
+ livesTxt.setText('Lives: ' + lives);
+ LK.getSound('ballLost').play();
+ if (lives <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ // Create a new ball
+ createBall();
+ // Reset game state for new life
+ isGameStarted = false;
+ startInstructionTxt = new Text2('Tap to continue', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ startInstructionTxt.anchor.set(0.5, 0.5);
+ startInstructionTxt.x = 0;
+ startInstructionTxt.y = 0;
+ LK.gui.center.addChild(startInstructionTxt);
+}
+// Movement handling
+function handleMove(x, y, obj) {
+ // Update paddle position horizontally, constrained to screen bounds
+ var halfPaddleWidth = paddle.width / 2;
+ paddle.x = Math.max(halfPaddleWidth, Math.min(2048 - halfPaddleWidth, x));
+ // If game hasn't started, keep ball on paddle
+ if (!isGameStarted && balls.length > 0) {
+ balls[0].x = paddle.x;
+ }
+}
+// Input handlers
+game.down = function (x, y, obj) {
+ startGame();
+ handleMove(x, y, obj);
+};
+game.move = handleMove;
+// Main update loop
+game.update = function () {
+ // Update stars
+ for (var s = 0; s < stars.length; s++) {
+ stars[s].update();
+ }
+ // Update all balls
+ for (var i = balls.length - 1; i >= 0; i--) {
+ var ball = balls[i];
+ // Check if ball is below the screen
+ if (ball.y - ball.radius > 2732) {
+ game.removeChild(ball);
+ balls.splice(i, 1);
+ // Only lose a life if this was the last ball
+ if (balls.length === 0) {
+ loseLife();
+ }
+ continue;
+ }
+ // Check paddle collision
+ if (ball.speedY > 0 && ball.y + ball.radius >= paddle.y - paddle.height / 2 && ball.y - ball.radius <= paddle.y + paddle.height / 2 && ball.x + ball.radius >= paddle.x - paddle.width / 2 && ball.x - ball.radius <= paddle.x + paddle.width / 2) {
+ // Calculate bounce angle based on hit position relative to paddle center
+ var hitPos = (ball.x - paddle.x) / (paddle.width / 2);
+ var angle = hitPos * (Math.PI / 3); // Max 60 degree bounce
+ ball.speedY = -Math.abs(ball.speedY);
+ // Adjust X velocity based on where the ball hit the paddle
+ var speed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY);
+ ball.speedX = Math.sin(angle) * speed;
+ ball.speedY = -Math.cos(angle) * speed;
+ LK.getSound('bounce').play();
+ }
+ // Check alien collisions
+ for (var j = aliens.length - 1; j >= 0; j--) {
+ var alien = aliens[j];
+ var dx = ball.x - alien.x;
+ var dy = ball.y - alien.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= ball.radius + alien.radius) {
+ // Bounce the ball
+ var nx = dx / distance;
+ var ny = dy / distance;
+ var p = 2 * (ball.speedX * nx + ball.speedY * ny);
+ ball.speedX -= p * nx;
+ ball.speedY -= p * ny;
+ // Damage the alien
+ if (alien.hitByBall()) {
+ // Add score
+ LK.setScore(LK.getScore() + alien.points);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Spawn power-up
+ spawnPowerUp(alien.x, alien.y);
+ // Remove alien
+ game.removeChild(alien);
+ aliens.splice(j, 1);
+ }
+ // Only process one collision at a time
+ break;
+ }
+ }
+ }
+ // Update power-ups
+ for (var k = powerUps.length - 1; k >= 0; k--) {
+ var powerUp = powerUps[k];
+ powerUp.update();
+ // Check if power-up is below screen
+ if (powerUp.y > 2732) {
+ game.removeChild(powerUp);
+ powerUps.splice(k, 1);
+ continue;
+ }
+ // Check collision with paddle
+ if (powerUp.y + 15 >= paddle.y - paddle.height / 2 && powerUp.y - 15 <= paddle.y + paddle.height / 2 && powerUp.x + 15 >= paddle.x - paddle.width / 2 && powerUp.x - 15 <= paddle.x + paddle.width / 2) {
+ activatePowerUp(powerUp.type);
+ game.removeChild(powerUp);
+ powerUps.splice(k, 1);
+ }
+ }
+ // Check if all aliens are destroyed
+ if (aliens.length === 0) {
+ advanceLevel();
+ }
+};
+// Initialize the game
+initGame();
\ No newline at end of file