/**** * 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); } };
/****
* 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);
}
};
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