User prompt
minimize level, lives and score 0.5.
User prompt
tap to start will disappear from the screen when the game starts.
User prompt
The background of the tap to start place should be a dark gray background and cover the entire text.
User prompt
minimize the tap to start location very slightly and add a gray background.
User prompt
move the lives place very slightly to the left.
User prompt
move your lives a little to the right.
User prompt
move your lives a little to the right.
User prompt
move your lives a little to the left.
User prompt
shift the level slightly to the left.
User prompt
Move the level a little to the right and down.
User prompt
Let's move the score a little lower.
User prompt
just enlarge the text by 2 times
Code edit (2 edits merged)
Please save this source code
User prompt
enlarge all articles by 2x ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Asteroid Battle Blitz
Initial prompt
asteroid breast war
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, level: 1 }); /**** * Classes ****/ var Asteroid = Container.expand(function () { var self = Container.call(this); // Random size between 0.6 and 1.8 var scale = 0.6 + Math.random() * 1.2; var asteroidGraphics = self.attachAsset('asteroid', { anchorX: 0.5, anchorY: 0.5, scaleX: scale, scaleY: scale }); // Asteroid properties based on size self.speed = 3 + Math.random() * 4; self.rotationSpeed = (Math.random() - 0.5) * 0.05; self.health = Math.floor(20 * scale); self.scoreValue = Math.floor(50 * scale); self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; }; self.takeDamage = function (amount) { self.health -= amount; // Flash asteroid when hit LK.effects.flashObject(self, 0xff0000, 200); return self.health <= 0; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -15; // Moving upward self.damage = 10; self.update = function () { self.y += self.speed; }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; // Moving downward self.damage = 10; self.update = function () { self.y += self.speed; }; return self; }); var EnemyShip = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('enemyShip', { anchorX: 0.5, anchorY: 0.5 }); // Enemy ship properties self.speed = 2 + Math.random() * 2; self.health = 30; self.scoreValue = 100; self.movementPattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine wave self.movementCounter = 0; self.fireInterval = 60 + Math.floor(Math.random() * 60); // Frames between shots self.fireCounter = Math.floor(Math.random() * 60); // Randomize initial fire timing self.update = function () { // Basic downward movement self.y += self.speed; // Apply movement pattern self.movementCounter++; switch (self.movementPattern) { case 0: // Straight down break; case 1: // Zigzag self.x += Math.sin(self.movementCounter * 0.1) * 3; break; case 2: // Sine wave self.x += Math.sin(self.movementCounter * 0.05) * 4; break; } // Update fire counter self.fireCounter++; }; self.shouldFire = function () { if (self.fireCounter >= self.fireInterval) { self.fireCounter = 0; return true; } return false; }; self.takeDamage = function (amount) { self.health -= amount; // Flash enemy when hit LK.effects.flashObject(self, 0xff0000, 200); return self.health <= 0; }; return self; }); var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); self.lifetime = 20; // Frames until explosion disappears self.update = function () { self.lifetime--; // Scale up and fade out self.scale.x += 0.05; self.scale.y += 0.05; explosionGraphics.alpha = self.lifetime / 20; return self.lifetime <= 0; // Return true if explosion should be removed }; return self; }); var PlayerShip = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); // Ship properties self.speed = 8; self.health = 100; self.maxHealth = 100; self.shieldActive = false; self.shieldDuration = 0; self.shieldGraphics = null; self.fireRate = 15; self.powerUpTimer = 0; self.powerUpType = null; self.activateShield = function (duration) { if (!self.shieldGraphics) { self.shieldGraphics = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); } else { self.shieldGraphics.alpha = 0.5; } self.shieldActive = true; self.shieldDuration = duration; }; self.deactivateShield = function () { if (self.shieldGraphics) { self.shieldGraphics.alpha = 0; } self.shieldActive = false; self.shieldDuration = 0; }; self.takeDamage = function (amount) { if (self.shieldActive) { return; } self.health -= amount; if (self.health <= 0) { self.health = 0; return true; // Ship destroyed } // Flash ship when damaged LK.effects.flashObject(self, 0xff0000, 300); return false; // Ship still alive }; self.activatePowerUp = function (type, duration) { // Reset any current power-up if (self.powerUpType) { self.deactivatePowerUp(); } self.powerUpType = type; self.powerUpTimer = duration; // Apply power-up effect switch (type) { case 'speed': self.speed = 12; shipGraphics.tint = 0x2ecc71; // Green tint for speed break; case 'fireRate': self.fireRate = 5; shipGraphics.tint = 0xf1c40f; // Yellow tint for fire rate break; } }; self.deactivatePowerUp = function () { // Reset to default values self.speed = 8; self.fireRate = 15; shipGraphics.tint = 0xffffff; // Reset tint self.powerUpType = null; }; self.update = function () { // Update shield if (self.shieldActive) { self.shieldDuration--; if (self.shieldDuration <= 0) { self.deactivateShield(); } } // Update power-ups if (self.powerUpType) { self.powerUpTimer--; if (self.powerUpTimer <= 0) { self.deactivatePowerUp(); } } }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerupGraphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); // Define power-up types and set random type var types = ['shield', 'speed', 'fireRate']; self.type = types[Math.floor(Math.random() * types.length)]; self.speed = 2 + Math.random() * 2; self.duration = 300; // 5 seconds at 60fps // Set color based on type switch (self.type) { case 'shield': powerupGraphics.tint = 0x3498db; // Blue break; case 'speed': powerupGraphics.tint = 0x2ecc71; // Green break; case 'fireRate': powerupGraphics.tint = 0xf1c40f; // Yellow break; } self.update = function () { self.y += self.speed; self.rotation += 0.02; // Rotate for visual effect }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game state variables var gameWidth = 2048; var gameHeight = 2732; var player; var playerBullets = []; var enemyBullets = []; var asteroids = []; var enemies = []; var powerUps = []; var explosions = []; var score = 0; var level = storage.level; var lives = 3; var gameActive = true; var lastShootTime = 0; var waveTimer = 0; var nextWaveTime = 300; // 5 seconds at 60fps var waveCount = 0; var levelComplete = false; // Scoring and UI elements var scoreTxt = new Text2('SCORE: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); var levelTxt = new Text2('LEVEL: ' + level, { size: 80, fill: 0xFFFFFF }); levelTxt.anchor.set(1, 0); LK.gui.topLeft.addChild(levelTxt); levelTxt.x = 200; // Move away from the corner var livesTxt = new Text2('LIVES: ' + lives, { size: 80, fill: 0xFFFFFF }); livesTxt.anchor.set(0.5, 0); LK.gui.top.addChild(livesTxt); // Initialize player function initializePlayer() { player = new PlayerShip(); player.x = gameWidth / 2; player.y = gameHeight - 200; game.addChild(player); } // Create a new asteroid function createAsteroid() { var asteroid = new Asteroid(); asteroid.x = Math.random() * gameWidth; asteroid.y = -100; asteroids.push(asteroid); game.addChild(asteroid); } // Create a new enemy ship function createEnemy() { var enemy = new EnemyShip(); enemy.x = Math.random() * gameWidth; enemy.y = -100; enemies.push(enemy); game.addChild(enemy); } // Create a player bullet function createPlayerBullet() { var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y - 40; playerBullets.push(bullet); game.addChild(bullet); // Play shoot sound LK.getSound('shoot').play(); // Update last shoot time lastShootTime = LK.ticks; } // Create an enemy bullet function createEnemyBullet(enemy) { var bullet = new EnemyBullet(); bullet.x = enemy.x; bullet.y = enemy.y + 30; enemyBullets.push(bullet); game.addChild(bullet); } // Create a power-up function createPowerUp(x, y) { // 20% chance to spawn a power-up if (Math.random() < 0.2) { var powerUp = new PowerUp(); powerUp.x = x; powerUp.y = y; powerUps.push(powerUp); game.addChild(powerUp); } } // Create an explosion function createExplosion(x, y, scale) { var explosion = new Explosion(); explosion.x = x; explosion.y = y; explosion.scale.set(scale || 1); explosions.push(explosion); game.addChild(explosion); // Play explosion sound LK.getSound('explosion').play(); } // Start a new wave of enemies and asteroids function startWave() { waveCount++; // Number of asteroids and enemies increases with level and wave var numAsteroids = 5 + Math.floor(level * 1.5) + Math.floor(waveCount * 0.5); var numEnemies = Math.floor(level * 0.8) + Math.floor(waveCount * 0.3); // Spawn asteroids over time for (var i = 0; i < numAsteroids; i++) { LK.setTimeout(createAsteroid, i * 30); } // Spawn enemies over time for (var j = 0; j < numEnemies; j++) { LK.setTimeout(createEnemy, j * 60 + 600); // Delay enemies a bit after asteroids } } // Check for level completion function checkLevelCompletion() { // Level is complete when all waves are finished and all enemies and asteroids are cleared if (waveCount >= level + 2 && enemies.length === 0 && asteroids.length === 0 && !levelComplete) { levelComplete = true; // Display level complete message var levelCompleteTxt = new Text2('LEVEL ' + level + ' COMPLETE!', { size: 120, fill: 0xFFFFFF }); levelCompleteTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(levelCompleteTxt); // Start next level after delay LK.setTimeout(function () { level++; storage.level = level; // Reset game state for next level levelTxt.setText('LEVEL: ' + level); waveCount = 0; waveTimer = 0; levelComplete = false; // Remove level complete text LK.gui.center.removeChild(levelCompleteTxt); }, 3000); } } // Update score display function updateScore(points) { score += points; LK.setScore(score); scoreTxt.setText('SCORE: ' + score); // Update high score if needed if (score > storage.highScore) { storage.highScore = score; } } // Reset game state function resetGame() { // Clear all game objects playerBullets = []; enemyBullets = []; asteroids = []; enemies = []; powerUps = []; explosions = []; // Reset variables score = 0; lives = 3; waveCount = 0; waveTimer = 0; levelComplete = false; gameActive = true; // Update UI scoreTxt.setText('SCORE: 0'); livesTxt.setText('LIVES: ' + lives); levelTxt.setText('LEVEL: ' + level); // Initialize player initializePlayer(); // Start first wave startWave(); } // Initialize game function initGame() { game.setBackgroundColor(0x0a0a2a); // Dark blue space background // Initialize player initializePlayer(); // Start music LK.playMusic('spaceTheme', { fade: { start: 0, end: 0.4, duration: 1000 } }); // Start first wave startWave(); } // Dragging support for touch controls var isDragging = false; // Mouse/touch handlers game.down = function (x, y, obj) { if (!gameActive) { return; } // Start dragging isDragging = true; // Move player to touch position player.x = x; player.y = y; }; game.up = function (x, y, obj) { isDragging = false; }; game.move = function (x, y, obj) { if (!gameActive || !isDragging) { return; } // Move player to follow touch player.x = x; // Limit vertical movement to bottom half of screen player.y = Math.max(gameHeight / 2, Math.min(y, gameHeight - 100)); }; // Game update function game.update = function () { if (!gameActive) { return; } // Update player if (player) { player.update(); // Keep player within screen bounds player.x = Math.max(50, Math.min(player.x, gameWidth - 50)); player.y = Math.max(50, Math.min(player.y, gameHeight - 50)); // Auto-fire based on fire rate if (LK.ticks - lastShootTime >= player.fireRate) { createPlayerBullet(); } } // Wave timer logic if (!levelComplete) { waveTimer++; if (waveTimer >= nextWaveTime && waveCount < level + 2) { startWave(); waveTimer = 0; nextWaveTime = 600; // 10 seconds between waves } } // Update player bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var bullet = playerBullets[i]; bullet.update(); // Remove bullets that go off screen if (bullet.y < -50) { game.removeChild(bullet); playerBullets.splice(i, 1); continue; } // Check collision with asteroids for (var j = asteroids.length - 1; j >= 0; j--) { var asteroid = asteroids[j]; if (bullet.intersects(asteroid)) { // Damage asteroid if (asteroid.takeDamage(bullet.damage)) { // Asteroid destroyed updateScore(asteroid.scoreValue); createExplosion(asteroid.x, asteroid.y, asteroid.scale.x); createPowerUp(asteroid.x, asteroid.y); game.removeChild(asteroid); asteroids.splice(j, 1); } // Remove bullet game.removeChild(bullet); playerBullets.splice(i, 1); break; } } // Check collision with enemies if (bullet) { for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; if (bullet.intersects(enemy)) { // Damage enemy if (enemy.takeDamage(bullet.damage)) { // Enemy destroyed updateScore(enemy.scoreValue); createExplosion(enemy.x, enemy.y, 1.2); createPowerUp(enemy.x, enemy.y); game.removeChild(enemy); enemies.splice(k, 1); } // Remove bullet game.removeChild(bullet); playerBullets.splice(i, 1); break; } } } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; bullet.update(); // Remove bullets that go off screen if (bullet.y > gameHeight + 50) { game.removeChild(bullet); enemyBullets.splice(i, 1); continue; } // Check collision with player if (player && bullet.intersects(player)) { // Damage player if (player.takeDamage(bullet.damage)) { // Player lost a life lives--; livesTxt.setText('LIVES: ' + lives); if (lives <= 0) { // Game over createExplosion(player.x, player.y, 2); game.removeChild(player); player = null; gameActive = false; LK.showGameOver(); } else { // Respawn player createExplosion(player.x, player.y, 1.5); game.removeChild(player); // Small delay before respawning LK.setTimeout(function () { initializePlayer(); }, 1000); } } // Remove bullet game.removeChild(bullet); enemyBullets.splice(i, 1); } } // Update asteroids for (var i = asteroids.length - 1; i >= 0; i--) { var asteroid = asteroids[i]; asteroid.update(); // Remove asteroids that go off screen if (asteroid.y > gameHeight + 100) { game.removeChild(asteroid); asteroids.splice(i, 1); continue; } // Check collision with player if (player && asteroid.intersects(player)) { if (player.takeDamage(20)) { // Player lost a life lives--; livesTxt.setText('LIVES: ' + lives); if (lives <= 0) { // Game over createExplosion(player.x, player.y, 2); game.removeChild(player); player = null; gameActive = false; LK.showGameOver(); } else { // Respawn player createExplosion(player.x, player.y, 1.5); game.removeChild(player); // Small delay before respawning LK.setTimeout(function () { initializePlayer(); }, 1000); } } // Destroy asteroid createExplosion(asteroid.x, asteroid.y, asteroid.scale.x); game.removeChild(asteroid); asteroids.splice(i, 1); } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.update(); // Remove enemies that go off screen if (enemy.y > gameHeight + 100) { game.removeChild(enemy); enemies.splice(i, 1); continue; } // Check if enemy should fire if (enemy.shouldFire() && player) { createEnemyBullet(enemy); } // Check collision with player if (player && enemy.intersects(player)) { if (player.takeDamage(30)) { // Player lost a life lives--; livesTxt.setText('LIVES: ' + lives); if (lives <= 0) { // Game over createExplosion(player.x, player.y, 2); game.removeChild(player); player = null; gameActive = false; LK.showGameOver(); } else { // Respawn player createExplosion(player.x, player.y, 1.5); game.removeChild(player); // Small delay before respawning LK.setTimeout(function () { initializePlayer(); }, 1000); } } // Destroy enemy createExplosion(enemy.x, enemy.y, 1.2); game.removeChild(enemy); enemies.splice(i, 1); } } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; powerUp.update(); // Remove power-ups that go off screen if (powerUp.y > gameHeight + 50) { game.removeChild(powerUp); powerUps.splice(i, 1); continue; } // Check collision with player if (player && powerUp.intersects(player)) { // Apply power-up effect switch (powerUp.type) { case 'shield': player.activateShield(300); // 5 second shield break; case 'speed': player.activatePowerUp('speed', 300); // 5 second speed boost break; case 'fireRate': player.activatePowerUp('fireRate', 300); // 5 second fire rate boost break; } // Play power-up sound LK.getSound('powerUp').play(); // Remove power-up game.removeChild(powerUp); powerUps.splice(i, 1); } } // Update explosions for (var i = explosions.length - 1; i >= 0; i--) { var explosion = explosions[i]; if (explosion.update()) { // Remove explosion if lifetime is over game.removeChild(explosion); explosions.splice(i, 1); } } // Check for level completion checkLevelCompletion(); }; // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,729 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0,
+ level: 1
+});
+
+/****
+* Classes
+****/
+var Asteroid = Container.expand(function () {
+ var self = Container.call(this);
+ // Random size between 0.6 and 1.8
+ var scale = 0.6 + Math.random() * 1.2;
+ var asteroidGraphics = self.attachAsset('asteroid', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: scale,
+ scaleY: scale
+ });
+ // Asteroid properties based on size
+ self.speed = 3 + Math.random() * 4;
+ self.rotationSpeed = (Math.random() - 0.5) * 0.05;
+ self.health = Math.floor(20 * scale);
+ self.scoreValue = Math.floor(50 * scale);
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += self.rotationSpeed;
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ // Flash asteroid when hit
+ LK.effects.flashObject(self, 0xff0000, 200);
+ return self.health <= 0;
+ };
+ return self;
+});
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -15; // Moving upward
+ self.damage = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10; // Moving downward
+ self.damage = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var EnemyShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Enemy ship properties
+ self.speed = 2 + Math.random() * 2;
+ self.health = 30;
+ self.scoreValue = 100;
+ self.movementPattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine wave
+ self.movementCounter = 0;
+ self.fireInterval = 60 + Math.floor(Math.random() * 60); // Frames between shots
+ self.fireCounter = Math.floor(Math.random() * 60); // Randomize initial fire timing
+ self.update = function () {
+ // Basic downward movement
+ self.y += self.speed;
+ // Apply movement pattern
+ self.movementCounter++;
+ switch (self.movementPattern) {
+ case 0:
+ // Straight down
+ break;
+ case 1:
+ // Zigzag
+ self.x += Math.sin(self.movementCounter * 0.1) * 3;
+ break;
+ case 2:
+ // Sine wave
+ self.x += Math.sin(self.movementCounter * 0.05) * 4;
+ break;
+ }
+ // Update fire counter
+ self.fireCounter++;
+ };
+ self.shouldFire = function () {
+ if (self.fireCounter >= self.fireInterval) {
+ self.fireCounter = 0;
+ return true;
+ }
+ return false;
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ // Flash enemy when hit
+ LK.effects.flashObject(self, 0xff0000, 200);
+ return self.health <= 0;
+ };
+ return self;
+});
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ var explosionGraphics = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.8
+ });
+ self.lifetime = 20; // Frames until explosion disappears
+ self.update = function () {
+ self.lifetime--;
+ // Scale up and fade out
+ self.scale.x += 0.05;
+ self.scale.y += 0.05;
+ explosionGraphics.alpha = self.lifetime / 20;
+ return self.lifetime <= 0; // Return true if explosion should be removed
+ };
+ return self;
+});
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Ship properties
+ self.speed = 8;
+ self.health = 100;
+ self.maxHealth = 100;
+ self.shieldActive = false;
+ self.shieldDuration = 0;
+ self.shieldGraphics = null;
+ self.fireRate = 15;
+ self.powerUpTimer = 0;
+ self.powerUpType = null;
+ self.activateShield = function (duration) {
+ if (!self.shieldGraphics) {
+ self.shieldGraphics = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5
+ });
+ } else {
+ self.shieldGraphics.alpha = 0.5;
+ }
+ self.shieldActive = true;
+ self.shieldDuration = duration;
+ };
+ self.deactivateShield = function () {
+ if (self.shieldGraphics) {
+ self.shieldGraphics.alpha = 0;
+ }
+ self.shieldActive = false;
+ self.shieldDuration = 0;
+ };
+ self.takeDamage = function (amount) {
+ if (self.shieldActive) {
+ return;
+ }
+ self.health -= amount;
+ if (self.health <= 0) {
+ self.health = 0;
+ return true; // Ship destroyed
+ }
+ // Flash ship when damaged
+ LK.effects.flashObject(self, 0xff0000, 300);
+ return false; // Ship still alive
+ };
+ self.activatePowerUp = function (type, duration) {
+ // Reset any current power-up
+ if (self.powerUpType) {
+ self.deactivatePowerUp();
+ }
+ self.powerUpType = type;
+ self.powerUpTimer = duration;
+ // Apply power-up effect
+ switch (type) {
+ case 'speed':
+ self.speed = 12;
+ shipGraphics.tint = 0x2ecc71; // Green tint for speed
+ break;
+ case 'fireRate':
+ self.fireRate = 5;
+ shipGraphics.tint = 0xf1c40f; // Yellow tint for fire rate
+ break;
+ }
+ };
+ self.deactivatePowerUp = function () {
+ // Reset to default values
+ self.speed = 8;
+ self.fireRate = 15;
+ shipGraphics.tint = 0xffffff; // Reset tint
+ self.powerUpType = null;
+ };
+ self.update = function () {
+ // Update shield
+ if (self.shieldActive) {
+ self.shieldDuration--;
+ if (self.shieldDuration <= 0) {
+ self.deactivateShield();
+ }
+ }
+ // Update power-ups
+ if (self.powerUpType) {
+ self.powerUpTimer--;
+ if (self.powerUpTimer <= 0) {
+ self.deactivatePowerUp();
+ }
+ }
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerupGraphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Define power-up types and set random type
+ var types = ['shield', 'speed', 'fireRate'];
+ self.type = types[Math.floor(Math.random() * types.length)];
+ self.speed = 2 + Math.random() * 2;
+ self.duration = 300; // 5 seconds at 60fps
+ // Set color based on type
+ switch (self.type) {
+ case 'shield':
+ powerupGraphics.tint = 0x3498db; // Blue
+ break;
+ case 'speed':
+ powerupGraphics.tint = 0x2ecc71; // Green
+ break;
+ case 'fireRate':
+ powerupGraphics.tint = 0xf1c40f; // Yellow
+ break;
+ }
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.02; // Rotate for visual effect
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var gameWidth = 2048;
+var gameHeight = 2732;
+var player;
+var playerBullets = [];
+var enemyBullets = [];
+var asteroids = [];
+var enemies = [];
+var powerUps = [];
+var explosions = [];
+var score = 0;
+var level = storage.level;
+var lives = 3;
+var gameActive = true;
+var lastShootTime = 0;
+var waveTimer = 0;
+var nextWaveTime = 300; // 5 seconds at 60fps
+var waveCount = 0;
+var levelComplete = false;
+// Scoring and UI elements
+var scoreTxt = new Text2('SCORE: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreTxt);
+var levelTxt = new Text2('LEVEL: ' + level, {
+ size: 80,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(1, 0);
+LK.gui.topLeft.addChild(levelTxt);
+levelTxt.x = 200; // Move away from the corner
+var livesTxt = new Text2('LIVES: ' + lives, {
+ size: 80,
+ fill: 0xFFFFFF
+});
+livesTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(livesTxt);
+// Initialize player
+function initializePlayer() {
+ player = new PlayerShip();
+ player.x = gameWidth / 2;
+ player.y = gameHeight - 200;
+ game.addChild(player);
+}
+// Create a new asteroid
+function createAsteroid() {
+ var asteroid = new Asteroid();
+ asteroid.x = Math.random() * gameWidth;
+ asteroid.y = -100;
+ asteroids.push(asteroid);
+ game.addChild(asteroid);
+}
+// Create a new enemy ship
+function createEnemy() {
+ var enemy = new EnemyShip();
+ enemy.x = Math.random() * gameWidth;
+ enemy.y = -100;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+// Create a player bullet
+function createPlayerBullet() {
+ var bullet = new Bullet();
+ bullet.x = player.x;
+ bullet.y = player.y - 40;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ // Play shoot sound
+ LK.getSound('shoot').play();
+ // Update last shoot time
+ lastShootTime = LK.ticks;
+}
+// Create an enemy bullet
+function createEnemyBullet(enemy) {
+ var bullet = new EnemyBullet();
+ bullet.x = enemy.x;
+ bullet.y = enemy.y + 30;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+}
+// Create a power-up
+function createPowerUp(x, y) {
+ // 20% chance to spawn a power-up
+ if (Math.random() < 0.2) {
+ var powerUp = new PowerUp();
+ powerUp.x = x;
+ powerUp.y = y;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+ }
+}
+// Create an explosion
+function createExplosion(x, y, scale) {
+ var explosion = new Explosion();
+ explosion.x = x;
+ explosion.y = y;
+ explosion.scale.set(scale || 1);
+ explosions.push(explosion);
+ game.addChild(explosion);
+ // Play explosion sound
+ LK.getSound('explosion').play();
+}
+// Start a new wave of enemies and asteroids
+function startWave() {
+ waveCount++;
+ // Number of asteroids and enemies increases with level and wave
+ var numAsteroids = 5 + Math.floor(level * 1.5) + Math.floor(waveCount * 0.5);
+ var numEnemies = Math.floor(level * 0.8) + Math.floor(waveCount * 0.3);
+ // Spawn asteroids over time
+ for (var i = 0; i < numAsteroids; i++) {
+ LK.setTimeout(createAsteroid, i * 30);
+ }
+ // Spawn enemies over time
+ for (var j = 0; j < numEnemies; j++) {
+ LK.setTimeout(createEnemy, j * 60 + 600); // Delay enemies a bit after asteroids
+ }
+}
+// Check for level completion
+function checkLevelCompletion() {
+ // Level is complete when all waves are finished and all enemies and asteroids are cleared
+ if (waveCount >= level + 2 && enemies.length === 0 && asteroids.length === 0 && !levelComplete) {
+ levelComplete = true;
+ // Display level complete message
+ var levelCompleteTxt = new Text2('LEVEL ' + level + ' COMPLETE!', {
+ size: 120,
+ fill: 0xFFFFFF
+ });
+ levelCompleteTxt.anchor.set(0.5, 0.5);
+ LK.gui.center.addChild(levelCompleteTxt);
+ // Start next level after delay
+ LK.setTimeout(function () {
+ level++;
+ storage.level = level;
+ // Reset game state for next level
+ levelTxt.setText('LEVEL: ' + level);
+ waveCount = 0;
+ waveTimer = 0;
+ levelComplete = false;
+ // Remove level complete text
+ LK.gui.center.removeChild(levelCompleteTxt);
+ }, 3000);
+ }
+}
+// Update score display
+function updateScore(points) {
+ score += points;
+ LK.setScore(score);
+ scoreTxt.setText('SCORE: ' + score);
+ // Update high score if needed
+ if (score > storage.highScore) {
+ storage.highScore = score;
+ }
+}
+// Reset game state
+function resetGame() {
+ // Clear all game objects
+ playerBullets = [];
+ enemyBullets = [];
+ asteroids = [];
+ enemies = [];
+ powerUps = [];
+ explosions = [];
+ // Reset variables
+ score = 0;
+ lives = 3;
+ waveCount = 0;
+ waveTimer = 0;
+ levelComplete = false;
+ gameActive = true;
+ // Update UI
+ scoreTxt.setText('SCORE: 0');
+ livesTxt.setText('LIVES: ' + lives);
+ levelTxt.setText('LEVEL: ' + level);
+ // Initialize player
+ initializePlayer();
+ // Start first wave
+ startWave();
+}
+// Initialize game
+function initGame() {
+ game.setBackgroundColor(0x0a0a2a); // Dark blue space background
+ // Initialize player
+ initializePlayer();
+ // Start music
+ LK.playMusic('spaceTheme', {
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 1000
+ }
+ });
+ // Start first wave
+ startWave();
+}
+// Dragging support for touch controls
+var isDragging = false;
+// Mouse/touch handlers
+game.down = function (x, y, obj) {
+ if (!gameActive) {
+ return;
+ }
+ // Start dragging
+ isDragging = true;
+ // Move player to touch position
+ player.x = x;
+ player.y = y;
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+game.move = function (x, y, obj) {
+ if (!gameActive || !isDragging) {
+ return;
+ }
+ // Move player to follow touch
+ player.x = x;
+ // Limit vertical movement to bottom half of screen
+ player.y = Math.max(gameHeight / 2, Math.min(y, gameHeight - 100));
+};
+// Game update function
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Update player
+ if (player) {
+ player.update();
+ // Keep player within screen bounds
+ player.x = Math.max(50, Math.min(player.x, gameWidth - 50));
+ player.y = Math.max(50, Math.min(player.y, gameHeight - 50));
+ // Auto-fire based on fire rate
+ if (LK.ticks - lastShootTime >= player.fireRate) {
+ createPlayerBullet();
+ }
+ }
+ // Wave timer logic
+ if (!levelComplete) {
+ waveTimer++;
+ if (waveTimer >= nextWaveTime && waveCount < level + 2) {
+ startWave();
+ waveTimer = 0;
+ nextWaveTime = 600; // 10 seconds between waves
+ }
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ bullet.update();
+ // Remove bullets that go off screen
+ if (bullet.y < -50) {
+ game.removeChild(bullet);
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with asteroids
+ for (var j = asteroids.length - 1; j >= 0; j--) {
+ var asteroid = asteroids[j];
+ if (bullet.intersects(asteroid)) {
+ // Damage asteroid
+ if (asteroid.takeDamage(bullet.damage)) {
+ // Asteroid destroyed
+ updateScore(asteroid.scoreValue);
+ createExplosion(asteroid.x, asteroid.y, asteroid.scale.x);
+ createPowerUp(asteroid.x, asteroid.y);
+ game.removeChild(asteroid);
+ asteroids.splice(j, 1);
+ }
+ // Remove bullet
+ game.removeChild(bullet);
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ // Check collision with enemies
+ if (bullet) {
+ for (var k = enemies.length - 1; k >= 0; k--) {
+ var enemy = enemies[k];
+ if (bullet.intersects(enemy)) {
+ // Damage enemy
+ if (enemy.takeDamage(bullet.damage)) {
+ // Enemy destroyed
+ updateScore(enemy.scoreValue);
+ createExplosion(enemy.x, enemy.y, 1.2);
+ createPowerUp(enemy.x, enemy.y);
+ game.removeChild(enemy);
+ enemies.splice(k, 1);
+ }
+ // Remove bullet
+ game.removeChild(bullet);
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ bullet.update();
+ // Remove bullets that go off screen
+ if (bullet.y > gameHeight + 50) {
+ game.removeChild(bullet);
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player && bullet.intersects(player)) {
+ // Damage player
+ if (player.takeDamage(bullet.damage)) {
+ // Player lost a life
+ lives--;
+ livesTxt.setText('LIVES: ' + lives);
+ if (lives <= 0) {
+ // Game over
+ createExplosion(player.x, player.y, 2);
+ game.removeChild(player);
+ player = null;
+ gameActive = false;
+ LK.showGameOver();
+ } else {
+ // Respawn player
+ createExplosion(player.x, player.y, 1.5);
+ game.removeChild(player);
+ // Small delay before respawning
+ LK.setTimeout(function () {
+ initializePlayer();
+ }, 1000);
+ }
+ }
+ // Remove bullet
+ game.removeChild(bullet);
+ enemyBullets.splice(i, 1);
+ }
+ }
+ // Update asteroids
+ for (var i = asteroids.length - 1; i >= 0; i--) {
+ var asteroid = asteroids[i];
+ asteroid.update();
+ // Remove asteroids that go off screen
+ if (asteroid.y > gameHeight + 100) {
+ game.removeChild(asteroid);
+ asteroids.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player && asteroid.intersects(player)) {
+ if (player.takeDamage(20)) {
+ // Player lost a life
+ lives--;
+ livesTxt.setText('LIVES: ' + lives);
+ if (lives <= 0) {
+ // Game over
+ createExplosion(player.x, player.y, 2);
+ game.removeChild(player);
+ player = null;
+ gameActive = false;
+ LK.showGameOver();
+ } else {
+ // Respawn player
+ createExplosion(player.x, player.y, 1.5);
+ game.removeChild(player);
+ // Small delay before respawning
+ LK.setTimeout(function () {
+ initializePlayer();
+ }, 1000);
+ }
+ }
+ // Destroy asteroid
+ createExplosion(asteroid.x, asteroid.y, asteroid.scale.x);
+ game.removeChild(asteroid);
+ asteroids.splice(i, 1);
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ enemy.update();
+ // Remove enemies that go off screen
+ if (enemy.y > gameHeight + 100) {
+ game.removeChild(enemy);
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check if enemy should fire
+ if (enemy.shouldFire() && player) {
+ createEnemyBullet(enemy);
+ }
+ // Check collision with player
+ if (player && enemy.intersects(player)) {
+ if (player.takeDamage(30)) {
+ // Player lost a life
+ lives--;
+ livesTxt.setText('LIVES: ' + lives);
+ if (lives <= 0) {
+ // Game over
+ createExplosion(player.x, player.y, 2);
+ game.removeChild(player);
+ player = null;
+ gameActive = false;
+ LK.showGameOver();
+ } else {
+ // Respawn player
+ createExplosion(player.x, player.y, 1.5);
+ game.removeChild(player);
+ // Small delay before respawning
+ LK.setTimeout(function () {
+ initializePlayer();
+ }, 1000);
+ }
+ }
+ // Destroy enemy
+ createExplosion(enemy.x, enemy.y, 1.2);
+ game.removeChild(enemy);
+ enemies.splice(i, 1);
+ }
+ }
+ // Update power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ powerUp.update();
+ // Remove power-ups that go off screen
+ if (powerUp.y > gameHeight + 50) {
+ game.removeChild(powerUp);
+ powerUps.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player && powerUp.intersects(player)) {
+ // Apply power-up effect
+ switch (powerUp.type) {
+ case 'shield':
+ player.activateShield(300); // 5 second shield
+ break;
+ case 'speed':
+ player.activatePowerUp('speed', 300); // 5 second speed boost
+ break;
+ case 'fireRate':
+ player.activatePowerUp('fireRate', 300); // 5 second fire rate boost
+ break;
+ }
+ // Play power-up sound
+ LK.getSound('powerUp').play();
+ // Remove power-up
+ game.removeChild(powerUp);
+ powerUps.splice(i, 1);
+ }
+ }
+ // Update explosions
+ for (var i = explosions.length - 1; i >= 0; i--) {
+ var explosion = explosions[i];
+ if (explosion.update()) {
+ // Remove explosion if lifetime is over
+ game.removeChild(explosion);
+ explosions.splice(i, 1);
+ }
+ }
+ // Check for level completion
+ checkLevelCompletion();
+};
+// Initialize the game
+initGame();
\ No newline at end of file
bulletShape. In-Game asset. 2d. High contrast. No shadows
fireButton is round and orange with a bullet pattern.. In-Game asset. 2d. High contrast. No shadows
rotateLeftButton is a square button with an arrow towards the left side.. In-Game asset. 2d. High contrast. No shadows
amungas memes no text one cracter. In-Game asset. 2d. High contrast. No shadows
trol face no text one cracter. In-Game asset. 2d. High contrast. No shadows
make those famous dog memes that are so well known.one cracter. head. In-Game asset. 2d. High contrast. No shadows
very well known pickles make Rick memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
making very well known cat memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
make very well known white ghost memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
make very well known frog memes. single character. no writing. just head grinning. In-Game asset. 2d. High contrast. No shadows
make very well known duck memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
make very well known rainbow cat memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
very well known squid game just make cookie memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
make very well known minecraft memes. single character. no writing.. In-Game asset. 2d. High contrast. No shadows
It's a spaceship made of orange pixels, reminiscent of arcade games.. In-Game asset. 2d. High contrast. No shadows
Not the hand with the cat.
A stylish orange letter G.. In-Game asset. 2d. High contrast. No shadows
shoot
Sound effect
meme0Explosion
Sound effect
meme1Explosion
Sound effect
meme2Explosion
Sound effect
meme3Explosion
Sound effect
meme4Explosion
Sound effect
meme5Explosion
Sound effect
meme6Explosion
Sound effect
meme7Explosion
Sound effect
meme8Explosion
Sound effect
meme9Explosion
Sound effect
levelStart
Sound effect
gameStart
Sound effect
beatSound
Sound effect
gameMusic1
Music
gameMusic2
Music
introMusic
Sound effect
gameMusic3
Music
meme10Explosion
Sound effect
meme11Explosion
Sound effect
meme12Explosion
Sound effect
outroMusic
Music