/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphic = self.attachAsset('enemyShip', { anchorX: 0.5, anchorY: 0.5 }); self.health = 2; self.speed = 2; self.fireRate = 120; self.nextFire = Math.floor(Math.random() * 60); self.scoreValue = 100; self.movementPattern = Math.floor(Math.random() * 3); // 0: Straight, 1: Sine wave, 2: Zigzag self.movementTime = 0; self.update = function () { self.y += self.speed; // Movement patterns self.movementTime++; if (self.movementPattern === 1) { // Sine wave movement self.x += Math.sin(self.movementTime * 0.05) * 3; } else if (self.movementPattern === 2) { // Zigzag movement if (self.movementTime % 60 < 30) { self.x += 2; } else { self.x -= 2; } } // Fire bullets if (self.nextFire <= 0) { if (enemyBullets.length < 50) { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 50; game.addChild(bullet); enemyBullets.push(bullet); LK.getSound('enemyShoot').play(); } self.nextFire = self.fireRate; } else { self.nextFire--; } }; self.takeDamage = function () { self.health--; if (self.health <= 0) { // Create explosion var explosion = new Explosion(); explosion.x = self.x; explosion.y = self.y; game.addChild(explosion); // Play explosion sound LK.getSound('explosion').play(); // Add score LK.setScore(LK.getScore() + self.scoreValue); // Random chance to spawn power-up if (Math.random() < 0.2) { var powerUp = new PowerUp(); powerUp.x = self.x; powerUp.y = self.y; game.addChild(powerUp); powerUps.push(powerUp); } return true; // Enemy is destroyed } // Flash enemy red to indicate damage LK.effects.flashObject(self, 0xff0000, 200); return false; // Enemy survived }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphic = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.update = function () { self.y += self.speed; }; return self; }); var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphic = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); self.lifetime = 0; self.maxLifetime = 30; self.update = function () { self.lifetime++; // Scale down and fade out var progress = self.lifetime / self.maxLifetime; explosionGraphic.alpha = 1 - progress; explosionGraphic.scale.x = 1 + progress; explosionGraphic.scale.y = 1 + progress; if (self.lifetime >= self.maxLifetime) { self.destroy(); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphic = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.fireRate = 15; self.nextFire = 0; self.lives = 3; self.isInvulnerable = false; self.invulnerableTime = 0; self.maxInvulnerableTime = 120; self.powerUps = { shield: false, doubleFire: false, speedBoost: false }; self.powerUpTimers = { shield: 0, doubleFire: 0, speedBoost: 0 }; self.update = function () { // Update fire cooldown if (self.nextFire > 0) { self.nextFire--; } // Update invulnerability if (self.isInvulnerable) { self.invulnerableTime++; // Blink effect during invulnerability playerGraphic.alpha = Math.sin(self.invulnerableTime * 0.2) * 0.5 + 0.5; if (self.invulnerableTime >= self.maxInvulnerableTime) { self.isInvulnerable = false; playerGraphic.alpha = 1; } } // Update power-up timers for (var powerUp in self.powerUpTimers) { if (self.powerUps[powerUp] && self.powerUpTimers[powerUp] > 0) { self.powerUpTimers[powerUp]--; if (self.powerUpTimers[powerUp] <= 0) { self.powerUps[powerUp] = false; } } } }; self.fire = function () { if (self.nextFire <= 0) { if (self.powerUps.doubleFire) { // Double fire power-up var bullet1 = new PlayerBullet(); bullet1.x = self.x - 20; bullet1.y = self.y - 20; game.addChild(bullet1); playerBullets.push(bullet1); var bullet2 = new PlayerBullet(); bullet2.x = self.x + 20; bullet2.y = self.y - 20; game.addChild(bullet2); playerBullets.push(bullet2); } else { // Normal fire var bullet = new PlayerBullet(); bullet.x = self.x; bullet.y = self.y - 20; game.addChild(bullet); playerBullets.push(bullet); } // Reset fire cooldown self.nextFire = self.fireRate; // Play shoot sound LK.getSound('playerShoot').play(); } }; self.takeDamage = function () { if (self.isInvulnerable) { return false; } if (self.powerUps.shield) { // Shield absorbs the hit self.powerUps.shield = false; // Flash player blue to indicate shield hit LK.effects.flashObject(self, 0x3498db, 500); return false; } // Player takes damage self.lives--; // Update lives display updateLivesDisplay(); if (self.lives <= 0) { // Game over var explosion = new Explosion(); explosion.x = self.x; explosion.y = self.y; game.addChild(explosion); // Play explosion sound LK.getSound('explosion').play(); // Flash screen red LK.effects.flashScreen(0xff0000, 1000); // Update high score if needed if (LK.getScore() > storage.highScore) { storage.highScore = LK.getScore(); } // Show game over after a delay LK.setTimeout(function () { LK.showGameOver(); }, 1500); return true; // Player is destroyed } // Make player invulnerable temporarily self.isInvulnerable = true; self.invulnerableTime = 0; // Flash player red LK.effects.flashObject(self, 0xff0000, 200); return false; // Player survived }; self.activatePowerUp = function (type) { var POWER_UP_DURATION = 300; // 5 seconds at 60 FPS if (type === 0) { // Shield self.powerUps.shield = true; tween(playerGraphic, { tint: 0x3498db }, { duration: 300 }); LK.setTimeout(function () { tween(playerGraphic, { tint: 0xffffff }, { duration: 300 }); }, 300); } else if (type === 1) { // Double fire self.powerUps.doubleFire = true; self.powerUpTimers.doubleFire = POWER_UP_DURATION; } else if (type === 2) { // Speed boost self.powerUps.speedBoost = true; self.powerUpTimers.speedBoost = POWER_UP_DURATION; self.speed = 15; // Increased speed // Reset speed when power-up expires LK.setTimeout(function () { self.speed = 10; }, POWER_UP_DURATION * (1000 / 60)); // Convert frames to milliseconds } // Play power-up collect sound LK.getSound('powerUpCollect').play(); }; return self; }); var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphic = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -15; self.update = function () { self.y += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphic = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.type = Math.floor(Math.random() * 3); // 0: Shield, 1: Double fire, 2: Speed boost // Set color based on powerup type if (self.type === 0) { powerUpGraphic.tint = 0x3498db; // Blue for shield } else if (self.type === 1) { powerUpGraphic.tint = 0xe74c3c; // Red for double fire } else { powerUpGraphic.tint = 0x2ecc71; // Green for speed boost } // Add pulse animation self.pulseDirection = 1; self.pulseValue = 0; self.update = function () { self.y += self.speed; // Pulse animation self.pulseValue += 0.05 * self.pulseDirection; if (self.pulseValue >= 1) { self.pulseDirection = -1; } else if (self.pulseValue <= 0) { self.pulseDirection = 1; } powerUpGraphic.scale.x = 1 + self.pulseValue * 0.2; powerUpGraphic.scale.y = 1 + self.pulseValue * 0.2; }; return self; }); var Star = Container.expand(function () { var self = Container.call(this); var starGraphic = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1 + Math.random() * 3; self.alpha = 0.3 + Math.random() * 0.7; starGraphic.alpha = self.alpha; self.update = function () { self.y += self.speed; // Reset star position when it goes off screen if (self.y > 2732) { self.y = -10; self.x = Math.random() * 2048; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 }); /**** * Game Code ****/ // Game variables var player; var playerBullets = []; var enemies = []; var enemyBullets = []; var powerUps = []; var stars = []; var isGameStarted = false; var spawnRate = 120; // Enemy spawn rate (in frames) var nextSpawn = 60; var difficulty = 1; var difficultyTimer = 0; var waveNumber = 1; var dragOffset = { x: 0, y: 0 }; // UI Elements var scoreText; var highScoreText; var livesDisplay = []; var waveText; var startText; // Initialize stars function initStars() { 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); } } // Initialize player function initPlayer() { player = new Player(); player.x = 2048 / 2; player.y = 2732 - 300; game.addChild(player); } // Initialize UI function initUI() { // Score display scoreText = new Text2('Score: 0', { size: 70, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreText); scoreText.x = 120; // Leave space for the menu icon scoreText.y = 20; // High score display highScoreText = new Text2('High Score: ' + storage.highScore, { size: 70, fill: 0xFFFF00 }); highScoreText.anchor.set(1, 0); LK.gui.topRight.addChild(highScoreText); highScoreText.y = 20; highScoreText.x = -20; // Wave display waveText = new Text2('Wave: 1', { size: 70, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0); LK.gui.top.addChild(waveText); waveText.y = 20; // Lives display updateLivesDisplay(); // Start text startText = new Text2('Tap to Start', { size: 100, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); LK.gui.center.addChild(startText); } // Update lives display function updateLivesDisplay() { // Remove existing lives display for (var i = 0; i < livesDisplay.length; i++) { LK.gui.bottomLeft.removeChild(livesDisplay[i]); } livesDisplay = []; // Create new lives display for (var i = 0; i < player.lives; i++) { var lifeIcon = LK.getAsset('playerShip', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); lifeIcon.x = 30 + i * 50; lifeIcon.y = -30; LK.gui.bottomLeft.addChild(lifeIcon); livesDisplay.push(lifeIcon); } } // Start game function startGame() { if (!isGameStarted) { isGameStarted = true; LK.gui.center.removeChild(startText); LK.setScore(0); scoreText.setText('Score: 0'); updateLivesDisplay(); // Start background music LK.playMusic('gameBgMusic', { fade: { start: 0, end: 0.4, duration: 1000 } }); } } // Spawn enemy function spawnEnemy() { var enemy = new Enemy(); enemy.x = 100 + Math.random() * (2048 - 200); enemy.y = -100; // Adjust enemy properties based on difficulty enemy.health = Math.min(5, 1 + Math.floor(difficulty / 2)); enemy.speed = 2 + difficulty * 0.5; enemy.fireRate = Math.max(60, 120 - difficulty * 10); enemy.scoreValue = 100 * difficulty; game.addChild(enemy); enemies.push(enemy); } // Game initialization initStars(); initPlayer(); initUI(); // Touch events game.down = function (x, y, obj) { if (!isGameStarted) { startGame(); return; } dragOffset.x = x - player.x; dragOffset.y = y - player.y; // Fire when tapping player.fire(); }; game.move = function (x, y, obj) { if (!isGameStarted || !player) { return; } // Move player, but keep within screen bounds var targetX = x - dragOffset.x; var targetY = y - dragOffset.y; player.x = Math.max(75, Math.min(2048 - 75, targetX)); player.y = Math.max(75, Math.min(2732 - 75, targetY)); }; game.up = function (x, y, obj) { // Nothing specific needed for up event }; // Main game update loop game.update = function () { if (!isGameStarted) { return; } // Update score display scoreText.setText('Score: ' + LK.getScore()); // Update player if (player) { player.update(); // Auto-fire if (LK.ticks % 30 === 0) { player.fire(); } } // Update stars for (var i = 0; i < stars.length; i++) { stars[i].update(); } // Update bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var bullet = playerBullets[i]; // Check if bullet is off screen if (bullet.y < -50) { bullet.destroy(); playerBullets.splice(i, 1); continue; } // Check for collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Hit enemy var destroyed = enemy.takeDamage(); if (destroyed) { enemies.splice(j, 1); enemy.destroy(); } // Remove bullet bullet.destroy(); playerBullets.splice(i, 1); break; } } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; // Check if bullet is off screen if (bullet.y > 2732 + 50) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check for collision with player if (player && bullet.intersects(player)) { // Hit player var destroyed = player.takeDamage(); if (destroyed) { player = null; } // Remove bullet bullet.destroy(); enemyBullets.splice(i, 1); } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.update(); // Check if enemy is off screen if (enemy.y > 2732 + 100) { enemy.destroy(); enemies.splice(i, 1); } // Check for collision with player if (player && enemy.intersects(player)) { // Hit player var destroyed = player.takeDamage(); if (destroyed) { player = null; } // Destroy enemy enemy.destroy(); enemies.splice(i, 1); } } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; powerUp.update(); // Check if power-up is off screen if (powerUp.y > 2732 + 50) { powerUp.destroy(); powerUps.splice(i, 1); continue; } // Check for collision with player if (player && powerUp.intersects(player)) { // Activate power-up player.activatePowerUp(powerUp.type); // Remove power-up powerUp.destroy(); powerUps.splice(i, 1); } } // Spawn enemies if (nextSpawn <= 0) { spawnEnemy(); nextSpawn = spawnRate; } else { nextSpawn--; } // Increase difficulty over time difficultyTimer++; if (difficultyTimer >= 600) { // Every 10 seconds (600 frames) difficultyTimer = 0; difficulty += 0.5; waveNumber = Math.floor(difficulty); waveText.setText('Wave: ' + waveNumber); } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,625 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0
+});
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphic = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 2;
+ self.speed = 2;
+ self.fireRate = 120;
+ self.nextFire = Math.floor(Math.random() * 60);
+ self.scoreValue = 100;
+ self.movementPattern = Math.floor(Math.random() * 3); // 0: Straight, 1: Sine wave, 2: Zigzag
+ self.movementTime = 0;
+ self.update = function () {
+ self.y += self.speed;
+ // Movement patterns
+ self.movementTime++;
+ if (self.movementPattern === 1) {
+ // Sine wave movement
+ self.x += Math.sin(self.movementTime * 0.05) * 3;
+ } else if (self.movementPattern === 2) {
+ // Zigzag movement
+ if (self.movementTime % 60 < 30) {
+ self.x += 2;
+ } else {
+ self.x -= 2;
+ }
+ }
+ // Fire bullets
+ if (self.nextFire <= 0) {
+ if (enemyBullets.length < 50) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 50;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ LK.getSound('enemyShoot').play();
+ }
+ self.nextFire = self.fireRate;
+ } else {
+ self.nextFire--;
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ if (self.health <= 0) {
+ // Create explosion
+ var explosion = new Explosion();
+ explosion.x = self.x;
+ explosion.y = self.y;
+ game.addChild(explosion);
+ // Play explosion sound
+ LK.getSound('explosion').play();
+ // Add score
+ LK.setScore(LK.getScore() + self.scoreValue);
+ // Random chance to spawn power-up
+ if (Math.random() < 0.2) {
+ var powerUp = new PowerUp();
+ powerUp.x = self.x;
+ powerUp.y = self.y;
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+ }
+ return true; // Enemy is destroyed
+ }
+ // Flash enemy red to indicate damage
+ LK.effects.flashObject(self, 0xff0000, 200);
+ return false; // Enemy survived
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphic = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ var explosionGraphic = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.lifetime = 0;
+ self.maxLifetime = 30;
+ self.update = function () {
+ self.lifetime++;
+ // Scale down and fade out
+ var progress = self.lifetime / self.maxLifetime;
+ explosionGraphic.alpha = 1 - progress;
+ explosionGraphic.scale.x = 1 + progress;
+ explosionGraphic.scale.y = 1 + progress;
+ if (self.lifetime >= self.maxLifetime) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphic = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.fireRate = 15;
+ self.nextFire = 0;
+ self.lives = 3;
+ self.isInvulnerable = false;
+ self.invulnerableTime = 0;
+ self.maxInvulnerableTime = 120;
+ self.powerUps = {
+ shield: false,
+ doubleFire: false,
+ speedBoost: false
+ };
+ self.powerUpTimers = {
+ shield: 0,
+ doubleFire: 0,
+ speedBoost: 0
+ };
+ self.update = function () {
+ // Update fire cooldown
+ if (self.nextFire > 0) {
+ self.nextFire--;
+ }
+ // Update invulnerability
+ if (self.isInvulnerable) {
+ self.invulnerableTime++;
+ // Blink effect during invulnerability
+ playerGraphic.alpha = Math.sin(self.invulnerableTime * 0.2) * 0.5 + 0.5;
+ if (self.invulnerableTime >= self.maxInvulnerableTime) {
+ self.isInvulnerable = false;
+ playerGraphic.alpha = 1;
+ }
+ }
+ // Update power-up timers
+ for (var powerUp in self.powerUpTimers) {
+ if (self.powerUps[powerUp] && self.powerUpTimers[powerUp] > 0) {
+ self.powerUpTimers[powerUp]--;
+ if (self.powerUpTimers[powerUp] <= 0) {
+ self.powerUps[powerUp] = false;
+ }
+ }
+ }
+ };
+ self.fire = function () {
+ if (self.nextFire <= 0) {
+ if (self.powerUps.doubleFire) {
+ // Double fire power-up
+ var bullet1 = new PlayerBullet();
+ bullet1.x = self.x - 20;
+ bullet1.y = self.y - 20;
+ game.addChild(bullet1);
+ playerBullets.push(bullet1);
+ var bullet2 = new PlayerBullet();
+ bullet2.x = self.x + 20;
+ bullet2.y = self.y - 20;
+ game.addChild(bullet2);
+ playerBullets.push(bullet2);
+ } else {
+ // Normal fire
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 20;
+ game.addChild(bullet);
+ playerBullets.push(bullet);
+ }
+ // Reset fire cooldown
+ self.nextFire = self.fireRate;
+ // Play shoot sound
+ LK.getSound('playerShoot').play();
+ }
+ };
+ self.takeDamage = function () {
+ if (self.isInvulnerable) {
+ return false;
+ }
+ if (self.powerUps.shield) {
+ // Shield absorbs the hit
+ self.powerUps.shield = false;
+ // Flash player blue to indicate shield hit
+ LK.effects.flashObject(self, 0x3498db, 500);
+ return false;
+ }
+ // Player takes damage
+ self.lives--;
+ // Update lives display
+ updateLivesDisplay();
+ if (self.lives <= 0) {
+ // Game over
+ var explosion = new Explosion();
+ explosion.x = self.x;
+ explosion.y = self.y;
+ game.addChild(explosion);
+ // Play explosion sound
+ LK.getSound('explosion').play();
+ // Flash screen red
+ LK.effects.flashScreen(0xff0000, 1000);
+ // Update high score if needed
+ if (LK.getScore() > storage.highScore) {
+ storage.highScore = LK.getScore();
+ }
+ // Show game over after a delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1500);
+ return true; // Player is destroyed
+ }
+ // Make player invulnerable temporarily
+ self.isInvulnerable = true;
+ self.invulnerableTime = 0;
+ // Flash player red
+ LK.effects.flashObject(self, 0xff0000, 200);
+ return false; // Player survived
+ };
+ self.activatePowerUp = function (type) {
+ var POWER_UP_DURATION = 300; // 5 seconds at 60 FPS
+ if (type === 0) {
+ // Shield
+ self.powerUps.shield = true;
+ tween(playerGraphic, {
+ tint: 0x3498db
+ }, {
+ duration: 300
+ });
+ LK.setTimeout(function () {
+ tween(playerGraphic, {
+ tint: 0xffffff
+ }, {
+ duration: 300
+ });
+ }, 300);
+ } else if (type === 1) {
+ // Double fire
+ self.powerUps.doubleFire = true;
+ self.powerUpTimers.doubleFire = POWER_UP_DURATION;
+ } else if (type === 2) {
+ // Speed boost
+ self.powerUps.speedBoost = true;
+ self.powerUpTimers.speedBoost = POWER_UP_DURATION;
+ self.speed = 15; // Increased speed
+ // Reset speed when power-up expires
+ LK.setTimeout(function () {
+ self.speed = 10;
+ }, POWER_UP_DURATION * (1000 / 60)); // Convert frames to milliseconds
+ }
+ // Play power-up collect sound
+ LK.getSound('powerUpCollect').play();
+ };
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphic = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -15;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphic = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 5;
+ self.type = Math.floor(Math.random() * 3); // 0: Shield, 1: Double fire, 2: Speed boost
+ // Set color based on powerup type
+ if (self.type === 0) {
+ powerUpGraphic.tint = 0x3498db; // Blue for shield
+ } else if (self.type === 1) {
+ powerUpGraphic.tint = 0xe74c3c; // Red for double fire
+ } else {
+ powerUpGraphic.tint = 0x2ecc71; // Green for speed boost
+ }
+ // Add pulse animation
+ self.pulseDirection = 1;
+ self.pulseValue = 0;
+ self.update = function () {
+ self.y += self.speed;
+ // Pulse animation
+ self.pulseValue += 0.05 * self.pulseDirection;
+ if (self.pulseValue >= 1) {
+ self.pulseDirection = -1;
+ } else if (self.pulseValue <= 0) {
+ self.pulseDirection = 1;
+ }
+ powerUpGraphic.scale.x = 1 + self.pulseValue * 0.2;
+ powerUpGraphic.scale.y = 1 + self.pulseValue * 0.2;
+ };
+ return self;
+});
+var Star = Container.expand(function () {
+ var self = Container.call(this);
+ var starGraphic = self.attachAsset('star', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 1 + Math.random() * 3;
+ self.alpha = 0.3 + Math.random() * 0.7;
+ starGraphic.alpha = self.alpha;
+ self.update = function () {
+ self.y += self.speed;
+ // Reset star position when it goes off screen
+ if (self.y > 2732) {
+ self.y = -10;
+ 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 variables
+var player;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerUps = [];
+var stars = [];
+var isGameStarted = false;
+var spawnRate = 120; // Enemy spawn rate (in frames)
+var nextSpawn = 60;
+var difficulty = 1;
+var difficultyTimer = 0;
+var waveNumber = 1;
+var dragOffset = {
+ x: 0,
+ y: 0
+};
+// UI Elements
+var scoreText;
+var highScoreText;
+var livesDisplay = [];
+var waveText;
+var startText;
+// Initialize stars
+function initStars() {
+ 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);
+ }
+}
+// Initialize player
+function initPlayer() {
+ player = new Player();
+ player.x = 2048 / 2;
+ player.y = 2732 - 300;
+ game.addChild(player);
+}
+// Initialize UI
+function initUI() {
+ // Score display
+ scoreText = new Text2('Score: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(0, 0);
+ LK.gui.topLeft.addChild(scoreText);
+ scoreText.x = 120; // Leave space for the menu icon
+ scoreText.y = 20;
+ // High score display
+ highScoreText = new Text2('High Score: ' + storage.highScore, {
+ size: 70,
+ fill: 0xFFFF00
+ });
+ highScoreText.anchor.set(1, 0);
+ LK.gui.topRight.addChild(highScoreText);
+ highScoreText.y = 20;
+ highScoreText.x = -20;
+ // Wave display
+ waveText = new Text2('Wave: 1', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ waveText.anchor.set(0.5, 0);
+ LK.gui.top.addChild(waveText);
+ waveText.y = 20;
+ // Lives display
+ updateLivesDisplay();
+ // Start text
+ startText = new Text2('Tap to Start', {
+ size: 100,
+ fill: 0xFFFFFF
+ });
+ startText.anchor.set(0.5, 0.5);
+ LK.gui.center.addChild(startText);
+}
+// Update lives display
+function updateLivesDisplay() {
+ // Remove existing lives display
+ for (var i = 0; i < livesDisplay.length; i++) {
+ LK.gui.bottomLeft.removeChild(livesDisplay[i]);
+ }
+ livesDisplay = [];
+ // Create new lives display
+ for (var i = 0; i < player.lives; i++) {
+ var lifeIcon = LK.getAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.3,
+ scaleY: 0.3
+ });
+ lifeIcon.x = 30 + i * 50;
+ lifeIcon.y = -30;
+ LK.gui.bottomLeft.addChild(lifeIcon);
+ livesDisplay.push(lifeIcon);
+ }
+}
+// Start game
+function startGame() {
+ if (!isGameStarted) {
+ isGameStarted = true;
+ LK.gui.center.removeChild(startText);
+ LK.setScore(0);
+ scoreText.setText('Score: 0');
+ updateLivesDisplay();
+ // Start background music
+ LK.playMusic('gameBgMusic', {
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 1000
+ }
+ });
+ }
+}
+// Spawn enemy
+function spawnEnemy() {
+ var enemy = new Enemy();
+ enemy.x = 100 + Math.random() * (2048 - 200);
+ enemy.y = -100;
+ // Adjust enemy properties based on difficulty
+ enemy.health = Math.min(5, 1 + Math.floor(difficulty / 2));
+ enemy.speed = 2 + difficulty * 0.5;
+ enemy.fireRate = Math.max(60, 120 - difficulty * 10);
+ enemy.scoreValue = 100 * difficulty;
+ game.addChild(enemy);
+ enemies.push(enemy);
+}
+// Game initialization
+initStars();
+initPlayer();
+initUI();
+// Touch events
+game.down = function (x, y, obj) {
+ if (!isGameStarted) {
+ startGame();
+ return;
+ }
+ dragOffset.x = x - player.x;
+ dragOffset.y = y - player.y;
+ // Fire when tapping
+ player.fire();
+};
+game.move = function (x, y, obj) {
+ if (!isGameStarted || !player) {
+ return;
+ }
+ // Move player, but keep within screen bounds
+ var targetX = x - dragOffset.x;
+ var targetY = y - dragOffset.y;
+ player.x = Math.max(75, Math.min(2048 - 75, targetX));
+ player.y = Math.max(75, Math.min(2732 - 75, targetY));
+};
+game.up = function (x, y, obj) {
+ // Nothing specific needed for up event
+};
+// Main game update loop
+game.update = function () {
+ if (!isGameStarted) {
+ return;
+ }
+ // Update score display
+ scoreText.setText('Score: ' + LK.getScore());
+ // Update player
+ if (player) {
+ player.update();
+ // Auto-fire
+ if (LK.ticks % 30 === 0) {
+ player.fire();
+ }
+ }
+ // Update stars
+ for (var i = 0; i < stars.length; i++) {
+ stars[i].update();
+ }
+ // Update bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ // Check if bullet is off screen
+ if (bullet.y < -50) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check for collision with enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ // Hit enemy
+ var destroyed = enemy.takeDamage();
+ if (destroyed) {
+ enemies.splice(j, 1);
+ enemy.destroy();
+ }
+ // Remove bullet
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ // Check if bullet is off screen
+ if (bullet.y > 2732 + 50) {
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check for collision with player
+ if (player && bullet.intersects(player)) {
+ // Hit player
+ var destroyed = player.takeDamage();
+ if (destroyed) {
+ player = null;
+ }
+ // Remove bullet
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ enemy.update();
+ // Check if enemy is off screen
+ if (enemy.y > 2732 + 100) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ // Check for collision with player
+ if (player && enemy.intersects(player)) {
+ // Hit player
+ var destroyed = player.takeDamage();
+ if (destroyed) {
+ player = null;
+ }
+ // Destroy enemy
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ }
+ // Update power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ powerUp.update();
+ // Check if power-up is off screen
+ if (powerUp.y > 2732 + 50) {
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ continue;
+ }
+ // Check for collision with player
+ if (player && powerUp.intersects(player)) {
+ // Activate power-up
+ player.activatePowerUp(powerUp.type);
+ // Remove power-up
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+ // Spawn enemies
+ if (nextSpawn <= 0) {
+ spawnEnemy();
+ nextSpawn = spawnRate;
+ } else {
+ nextSpawn--;
+ }
+ // Increase difficulty over time
+ difficultyTimer++;
+ if (difficultyTimer >= 600) {
+ // Every 10 seconds (600 frames)
+ difficultyTimer = 0;
+ difficulty += 0.5;
+ waveNumber = Math.floor(difficulty);
+ waveText.setText('Wave: ' + waveNumber);
+ }
+};
\ No newline at end of file
Space shooter with high weapons like missile and cannon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. 3d
Space shooter with high weapons like missile and cannon blast. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. 3d
Bullet. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. 3d
Powerup. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. 3d
Star. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. 3d
Spaceship. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. 3d