/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Battleship = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('battleship', { anchorX: 0.5, anchorY: 0.5 }); self.health = 3; self.fireTimer = 0; self.fireRate = 30; // Fire every 0.5 second (reduced frequency) self.update = function () { self.fireTimer++; // Only fire when timer reaches fire rate and limit total bullets if (self.fireTimer >= self.fireRate && playerBullets.length < 8) { self.fireTimer = 0; var bullet = new PlayerBullet(); bullet.x = self.x; bullet.y = self.y - 50; playerBullets.push(bullet); game.addChild(bullet); LK.getSound('playerShoot').play(); } }; 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 = 6; self.update = function () { self.y += self.speed; }; return self; }); var EnemyPlane = Container.expand(function () { var self = Container.call(this); var planeGraphics = self.attachAsset('enemyPlane', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.speedX = 0; self.speedY = 2; self.health = 1; self.fireTimer = 0; self.fireRate = 120; // Fire every 2 seconds self.bulletCount = 0; // Track number of bullets fired self.maxBullets = 5; // Maximum bullets this enemy can fire self.update = function () { self.x += self.speedX; self.y += self.speedY; self.fireTimer++; // Fire bullets occasionally if (self.fireTimer >= self.fireRate && Math.random() < 0.3 && self.bulletCount < self.maxBullets) { self.fireTimer = 0; self.bulletCount++; // Increment bullet count var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 30; enemyBullets.push(bullet); game.addChild(bullet); } }; return self; }); var EnemyPlane2 = Container.expand(function () { var self = Container.call(this); var planeGraphics = self.attachAsset('enemyplane2', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.speedX = 0; self.speedY = 2; self.health = 1; self.fireTimer = 0; self.fireRate = 120; // Fire every 2 seconds self.bulletCount = 0; // Track number of bullets fired self.maxBullets = 5; // Maximum bullets this enemy can fire self.update = function () { self.x += self.speedX; self.y += self.speedY; self.fireTimer++; // Fire bullets occasionally if (self.fireTimer >= self.fireRate && Math.random() < 0.3 && self.bulletCount < self.maxBullets) { self.fireTimer = 0; self.bulletCount++; // Increment bullet count var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 30; enemyBullets.push(bullet); game.addChild(bullet); } }; return self; }); var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); self.alpha = 0.8; self.scaleX = 0.1; self.scaleY = 0.1; return self; }); var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.update = function () { self.y += self.speed; }; return self; }); var PlayerExplosion = Container.expand(function () { var self = Container.call(this); // Create 3 explosion balls var ball1 = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); var ball2 = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); var ball3 = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); // Position balls in triangle formation ball1.x = 0; ball1.y = -30; ball2.x = -25; ball2.y = 20; ball3.x = 25; ball3.y = 20; // Initialize all balls small and transparent ball1.scaleX = ball1.scaleY = 0.1; ball2.scaleX = ball2.scaleY = 0.1; ball3.scaleX = ball3.scaleY = 0.1; ball1.alpha = ball2.alpha = ball3.alpha = 0.9; self.explode = function () { // Animate ball 1 tween(ball1, { scaleX: 4, scaleY: 4, alpha: 0 }, { duration: 800, easing: tween.easeOut }); // Animate ball 2 with slight delay LK.setTimeout(function () { tween(ball2, { scaleX: 3.5, scaleY: 3.5, alpha: 0 }, { duration: 700, easing: tween.easeOut }); }, 150); // Animate ball 3 with more delay LK.setTimeout(function () { tween(ball3, { scaleX: 4.5, scaleY: 4.5, alpha: 0 }, { duration: 900, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }, 300); }; return self; }); var SinkingShip = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('battleship', { anchorX: 0.5, anchorY: 0.5 }); self.sink = function () { // Animate ship sinking down and rotating tween(self, { y: self.y + 200, rotation: 0.3, alpha: 0 }, { duration: 2000, easing: tween.easeIn, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x001122 }); /**** * Game Code ****/ // Add background var background = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Game variables var battleship; var playerBullets = []; var enemyPlanes = []; var enemyPlanes2 = []; var enemyBullets = []; var waveTimer = 0; var waveSize = 1; var enemySpawnRate = 600; // 10 seconds (10 * 60 FPS = 600 ticks) var dragNode = null; var targetX = 2048 / 2; // Target position for smooth movement var isMoving = false; // Track if ship is currently moving // UI Elements var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var healthTxt = new Text2('Health: 3', { size: 50, fill: 0xFF0000 }); healthTxt.anchor.set(1, 0); LK.gui.topRight.addChild(healthTxt); // Create battleship battleship = game.addChild(new Battleship()); battleship.x = 2048 / 2; battleship.y = 2732 - 150; // Touch/Mouse controls function handleMove(x, y, obj) { if (dragNode) { // Set target position instead of immediate movement targetX = Math.max(60, Math.min(2048 - 60, x)); // Start smooth movement if not already moving if (!isMoving) { isMoving = true; tween(dragNode, { x: targetX }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { isMoving = false; // If target changed during movement, start new tween if (dragNode && Math.abs(dragNode.x - targetX) > 5) { isMoving = true; tween(dragNode, { x: targetX }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { isMoving = false; } }); } } }); } else { // If already moving, stop current tween and start new one tween.stop(dragNode, { x: true }); isMoving = true; tween(dragNode, { x: targetX }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { isMoving = false; } }); } } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = battleship; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; // Spawn enemy waves function spawnEnemyWave() { // Spawn exactly 3 enemy planes total for (var i = 0; i < 3; i++) { if (i < 2) { // Spawn 2 regular enemies from left var enemy = new EnemyPlane(); enemy.x = -50; enemy.y = 200 + Math.random() * 800; enemy.speedX = 2 + Math.random() * 2; // Always positive (left to right) enemy.speedY = 0.5 + Math.random() * 1; enemyPlanes.push(enemy); game.addChild(enemy); } else { // Spawn 1 enemyplane2 from right var enemy2 = new EnemyPlane2(); enemy2.x = 2098; // Start from right side enemy2.y = 200 + Math.random() * 800; enemy2.speedX = -(2 + Math.random() * 2); // Always negative (right to left) enemy2.speedY = 0.5 + Math.random() * 1; enemyPlanes2.push(enemy2); game.addChild(enemy2); } } } // Play background music LK.playMusic('12epicwar'); // Main game update loop game.update = function () { waveTimer++; // Spawn enemy waves if (waveTimer >= enemySpawnRate) { waveTimer = 0; spawnEnemyWave(); // Increase difficulty over time if (enemySpawnRate > 300) { // Minimum 5 seconds instead of 3 seconds enemySpawnRate -= 2; } if (waveSize < 2) { waveSize += 0.1; } } // Update and check player bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var bullet = playerBullets[i]; if (bullet.lastY === undefined) bullet.lastY = bullet.y; // Remove bullets that go off screen if (bullet.lastY >= -10 && bullet.y < -10) { bullet.destroy(); playerBullets.splice(i, 1); continue; } // Check collision with enemy planes var hitTarget = false; for (var j = enemyPlanes.length - 1; j >= 0; j--) { var enemy = enemyPlanes[j]; if (bullet.intersects(enemy)) { // Enemy hit - dies in one shot with explosion animation LK.setScore(LK.getScore() + 100); scoreTxt.setText('Score: ' + LK.getScore()); LK.getSound('enemyHit').play(); // Create red fire explosion var explosion = new Explosion(); explosion.x = enemy.x; explosion.y = enemy.y; game.addChild(explosion); // Animate explosion growing and fading tween(explosion, { scaleX: 3, scaleY: 3, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { explosion.destroy(); } }); // Destroy enemy immediately enemy.destroy(); enemyPlanes.splice(j, 1); bullet.destroy(); playerBullets.splice(i, 1); hitTarget = true; break; } } // Check collision with enemy planes2 if (!hitTarget) { for (var j = enemyPlanes2.length - 1; j >= 0; j--) { var enemy2 = enemyPlanes2[j]; if (bullet.intersects(enemy2)) { // Enemy hit - dies in one shot with explosion animation LK.setScore(LK.getScore() + 100); scoreTxt.setText('Score: ' + LK.getScore()); LK.getSound('enemyHit').play(); // Create red fire explosion var explosion = new Explosion(); explosion.x = enemy2.x; explosion.y = enemy2.y; game.addChild(explosion); // Animate explosion growing and fading tween(explosion, { scaleX: 3, scaleY: 3, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { explosion.destroy(); } }); // Destroy enemy immediately enemy2.destroy(); enemyPlanes2.splice(j, 1); bullet.destroy(); playerBullets.splice(i, 1); hitTarget = true; break; } } } // Check collision with enemy bullets if (!hitTarget) { for (var k = enemyBullets.length - 1; k >= 0; k--) { var enemyBullet = enemyBullets[k]; if (bullet.intersects(enemyBullet)) { // Create explosion animation for both bullets tween(bullet, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { bullet.destroy(); } }); tween(enemyBullet, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { enemyBullet.destroy(); } }); // Flash effect for bullet collision LK.effects.flashObject(bullet, 0xffff00, 200); LK.effects.flashObject(enemyBullet, 0xff4500, 200); playerBullets.splice(i, 1); enemyBullets.splice(k, 1); hitTarget = true; break; } } } if (!hitTarget) { bullet.lastY = bullet.y; } } // Update and check enemy planes for (var i = enemyPlanes.length - 1; i >= 0; i--) { var enemy = enemyPlanes[i]; if (enemy.lastY === undefined) enemy.lastY = enemy.y; if (enemy.lastX === undefined) enemy.lastX = enemy.x; // Remove enemies that go off screen (bottom) if (enemy.lastY <= 2782 && enemy.y > 2782) { enemy.destroy(); enemyPlanes.splice(i, 1); continue; } // Remove enemies that go off screen (left side) if (enemy.lastX >= -100 && enemy.x < -100) { enemy.destroy(); enemyPlanes.splice(i, 1); continue; } enemy.lastY = enemy.y; enemy.lastX = enemy.x; } // Update and check enemy planes2 for (var i = enemyPlanes2.length - 1; i >= 0; i--) { var enemy2 = enemyPlanes2[i]; if (enemy2.lastY === undefined) enemy2.lastY = enemy2.y; if (enemy2.lastX === undefined) enemy2.lastX = enemy2.x; // Remove enemies that go off screen (bottom) if (enemy2.lastY <= 2782 && enemy2.y > 2782) { enemy2.destroy(); enemyPlanes2.splice(i, 1); continue; } // Remove enemies that go off screen (right side) if (enemy2.lastX <= 2148 && enemy2.x > 2148) { enemy2.destroy(); enemyPlanes2.splice(i, 1); continue; } enemy2.lastY = enemy2.y; enemy2.lastX = enemy2.x; } // Update and check enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; if (bullet.lastY === undefined) bullet.lastY = bullet.y; // Remove bullets that go off screen if (bullet.lastY <= 2782 && bullet.y > 2782) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check collision with battleship if (bullet.intersects(battleship)) { battleship.health--; healthTxt.setText('Health: ' + battleship.health); LK.effects.flashObject(battleship, 0xff0000, 500); LK.getSound('playerHit').play(); bullet.destroy(); enemyBullets.splice(i, 1); if (battleship.health <= 0) { // Create 3-ball explosion animation var playerExplosion = new PlayerExplosion(); playerExplosion.x = battleship.x; playerExplosion.y = battleship.y; game.addChild(playerExplosion); playerExplosion.explode(); // Create sinking ship animation var sinkingShip = new SinkingShip(); sinkingShip.x = battleship.x; sinkingShip.y = battleship.y; game.addChild(sinkingShip); // Hide original battleship battleship.alpha = 0; // Start sinking animation after explosion starts LK.setTimeout(function () { sinkingShip.sink(); }, 600); // Show game over after all animations complete LK.setTimeout(function () { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); }, 3200); return; } continue; } bullet.lastY = bullet.y; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Battleship = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('battleship', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.fireTimer = 0;
self.fireRate = 30; // Fire every 0.5 second (reduced frequency)
self.update = function () {
self.fireTimer++;
// Only fire when timer reaches fire rate and limit total bullets
if (self.fireTimer >= self.fireRate && playerBullets.length < 8) {
self.fireTimer = 0;
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('playerShoot').play();
}
};
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 = 6;
self.update = function () {
self.y += self.speed;
};
return self;
});
var EnemyPlane = Container.expand(function () {
var self = Container.call(this);
var planeGraphics = self.attachAsset('enemyPlane', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.speedX = 0;
self.speedY = 2;
self.health = 1;
self.fireTimer = 0;
self.fireRate = 120; // Fire every 2 seconds
self.bulletCount = 0; // Track number of bullets fired
self.maxBullets = 5; // Maximum bullets this enemy can fire
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
self.fireTimer++;
// Fire bullets occasionally
if (self.fireTimer >= self.fireRate && Math.random() < 0.3 && self.bulletCount < self.maxBullets) {
self.fireTimer = 0;
self.bulletCount++; // Increment bullet count
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyPlane2 = Container.expand(function () {
var self = Container.call(this);
var planeGraphics = self.attachAsset('enemyplane2', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.speedX = 0;
self.speedY = 2;
self.health = 1;
self.fireTimer = 0;
self.fireRate = 120; // Fire every 2 seconds
self.bulletCount = 0; // Track number of bullets fired
self.maxBullets = 5; // Maximum bullets this enemy can fire
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
self.fireTimer++;
// Fire bullets occasionally
if (self.fireTimer >= self.fireRate && Math.random() < 0.3 && self.bulletCount < self.maxBullets) {
self.fireTimer = 0;
self.bulletCount++; // Increment bullet count
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var Explosion = Container.expand(function () {
var self = Container.call(this);
var explosionGraphics = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
self.alpha = 0.8;
self.scaleX = 0.1;
self.scaleY = 0.1;
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerExplosion = Container.expand(function () {
var self = Container.call(this);
// Create 3 explosion balls
var ball1 = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
var ball2 = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
var ball3 = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
// Position balls in triangle formation
ball1.x = 0;
ball1.y = -30;
ball2.x = -25;
ball2.y = 20;
ball3.x = 25;
ball3.y = 20;
// Initialize all balls small and transparent
ball1.scaleX = ball1.scaleY = 0.1;
ball2.scaleX = ball2.scaleY = 0.1;
ball3.scaleX = ball3.scaleY = 0.1;
ball1.alpha = ball2.alpha = ball3.alpha = 0.9;
self.explode = function () {
// Animate ball 1
tween(ball1, {
scaleX: 4,
scaleY: 4,
alpha: 0
}, {
duration: 800,
easing: tween.easeOut
});
// Animate ball 2 with slight delay
LK.setTimeout(function () {
tween(ball2, {
scaleX: 3.5,
scaleY: 3.5,
alpha: 0
}, {
duration: 700,
easing: tween.easeOut
});
}, 150);
// Animate ball 3 with more delay
LK.setTimeout(function () {
tween(ball3, {
scaleX: 4.5,
scaleY: 4.5,
alpha: 0
}, {
duration: 900,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
}, 300);
};
return self;
});
var SinkingShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('battleship', {
anchorX: 0.5,
anchorY: 0.5
});
self.sink = function () {
// Animate ship sinking down and rotating
tween(self, {
y: self.y + 200,
rotation: 0.3,
alpha: 0
}, {
duration: 2000,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Add background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Game variables
var battleship;
var playerBullets = [];
var enemyPlanes = [];
var enemyPlanes2 = [];
var enemyBullets = [];
var waveTimer = 0;
var waveSize = 1;
var enemySpawnRate = 600; // 10 seconds (10 * 60 FPS = 600 ticks)
var dragNode = null;
var targetX = 2048 / 2; // Target position for smooth movement
var isMoving = false; // Track if ship is currently moving
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var healthTxt = new Text2('Health: 3', {
size: 50,
fill: 0xFF0000
});
healthTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(healthTxt);
// Create battleship
battleship = game.addChild(new Battleship());
battleship.x = 2048 / 2;
battleship.y = 2732 - 150;
// Touch/Mouse controls
function handleMove(x, y, obj) {
if (dragNode) {
// Set target position instead of immediate movement
targetX = Math.max(60, Math.min(2048 - 60, x));
// Start smooth movement if not already moving
if (!isMoving) {
isMoving = true;
tween(dragNode, {
x: targetX
}, {
duration: 400,
easing: tween.easeInOut,
onFinish: function onFinish() {
isMoving = false;
// If target changed during movement, start new tween
if (dragNode && Math.abs(dragNode.x - targetX) > 5) {
isMoving = true;
tween(dragNode, {
x: targetX
}, {
duration: 300,
easing: tween.easeInOut,
onFinish: function onFinish() {
isMoving = false;
}
});
}
}
});
} else {
// If already moving, stop current tween and start new one
tween.stop(dragNode, {
x: true
});
isMoving = true;
tween(dragNode, {
x: targetX
}, {
duration: 300,
easing: tween.easeInOut,
onFinish: function onFinish() {
isMoving = false;
}
});
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = battleship;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Spawn enemy waves
function spawnEnemyWave() {
// Spawn exactly 3 enemy planes total
for (var i = 0; i < 3; i++) {
if (i < 2) {
// Spawn 2 regular enemies from left
var enemy = new EnemyPlane();
enemy.x = -50;
enemy.y = 200 + Math.random() * 800;
enemy.speedX = 2 + Math.random() * 2; // Always positive (left to right)
enemy.speedY = 0.5 + Math.random() * 1;
enemyPlanes.push(enemy);
game.addChild(enemy);
} else {
// Spawn 1 enemyplane2 from right
var enemy2 = new EnemyPlane2();
enemy2.x = 2098; // Start from right side
enemy2.y = 200 + Math.random() * 800;
enemy2.speedX = -(2 + Math.random() * 2); // Always negative (right to left)
enemy2.speedY = 0.5 + Math.random() * 1;
enemyPlanes2.push(enemy2);
game.addChild(enemy2);
}
}
}
// Play background music
LK.playMusic('12epicwar');
// Main game update loop
game.update = function () {
waveTimer++;
// Spawn enemy waves
if (waveTimer >= enemySpawnRate) {
waveTimer = 0;
spawnEnemyWave();
// Increase difficulty over time
if (enemySpawnRate > 300) {
// Minimum 5 seconds instead of 3 seconds
enemySpawnRate -= 2;
}
if (waveSize < 2) {
waveSize += 0.1;
}
}
// Update and check player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= -10 && bullet.y < -10) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemy planes
var hitTarget = false;
for (var j = enemyPlanes.length - 1; j >= 0; j--) {
var enemy = enemyPlanes[j];
if (bullet.intersects(enemy)) {
// Enemy hit - dies in one shot with explosion animation
LK.setScore(LK.getScore() + 100);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
// Create red fire explosion
var explosion = new Explosion();
explosion.x = enemy.x;
explosion.y = enemy.y;
game.addChild(explosion);
// Animate explosion growing and fading
tween(explosion, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
explosion.destroy();
}
});
// Destroy enemy immediately
enemy.destroy();
enemyPlanes.splice(j, 1);
bullet.destroy();
playerBullets.splice(i, 1);
hitTarget = true;
break;
}
}
// Check collision with enemy planes2
if (!hitTarget) {
for (var j = enemyPlanes2.length - 1; j >= 0; j--) {
var enemy2 = enemyPlanes2[j];
if (bullet.intersects(enemy2)) {
// Enemy hit - dies in one shot with explosion animation
LK.setScore(LK.getScore() + 100);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
// Create red fire explosion
var explosion = new Explosion();
explosion.x = enemy2.x;
explosion.y = enemy2.y;
game.addChild(explosion);
// Animate explosion growing and fading
tween(explosion, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
explosion.destroy();
}
});
// Destroy enemy immediately
enemy2.destroy();
enemyPlanes2.splice(j, 1);
bullet.destroy();
playerBullets.splice(i, 1);
hitTarget = true;
break;
}
}
}
// Check collision with enemy bullets
if (!hitTarget) {
for (var k = enemyBullets.length - 1; k >= 0; k--) {
var enemyBullet = enemyBullets[k];
if (bullet.intersects(enemyBullet)) {
// Create explosion animation for both bullets
tween(bullet, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
bullet.destroy();
}
});
tween(enemyBullet, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
enemyBullet.destroy();
}
});
// Flash effect for bullet collision
LK.effects.flashObject(bullet, 0xffff00, 200);
LK.effects.flashObject(enemyBullet, 0xff4500, 200);
playerBullets.splice(i, 1);
enemyBullets.splice(k, 1);
hitTarget = true;
break;
}
}
}
if (!hitTarget) {
bullet.lastY = bullet.y;
}
}
// Update and check enemy planes
for (var i = enemyPlanes.length - 1; i >= 0; i--) {
var enemy = enemyPlanes[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastX === undefined) enemy.lastX = enemy.x;
// Remove enemies that go off screen (bottom)
if (enemy.lastY <= 2782 && enemy.y > 2782) {
enemy.destroy();
enemyPlanes.splice(i, 1);
continue;
}
// Remove enemies that go off screen (left side)
if (enemy.lastX >= -100 && enemy.x < -100) {
enemy.destroy();
enemyPlanes.splice(i, 1);
continue;
}
enemy.lastY = enemy.y;
enemy.lastX = enemy.x;
}
// Update and check enemy planes2
for (var i = enemyPlanes2.length - 1; i >= 0; i--) {
var enemy2 = enemyPlanes2[i];
if (enemy2.lastY === undefined) enemy2.lastY = enemy2.y;
if (enemy2.lastX === undefined) enemy2.lastX = enemy2.x;
// Remove enemies that go off screen (bottom)
if (enemy2.lastY <= 2782 && enemy2.y > 2782) {
enemy2.destroy();
enemyPlanes2.splice(i, 1);
continue;
}
// Remove enemies that go off screen (right side)
if (enemy2.lastX <= 2148 && enemy2.x > 2148) {
enemy2.destroy();
enemyPlanes2.splice(i, 1);
continue;
}
enemy2.lastY = enemy2.y;
enemy2.lastX = enemy2.x;
}
// Update and check enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY <= 2782 && bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with battleship
if (bullet.intersects(battleship)) {
battleship.health--;
healthTxt.setText('Health: ' + battleship.health);
LK.effects.flashObject(battleship, 0xff0000, 500);
LK.getSound('playerHit').play();
bullet.destroy();
enemyBullets.splice(i, 1);
if (battleship.health <= 0) {
// Create 3-ball explosion animation
var playerExplosion = new PlayerExplosion();
playerExplosion.x = battleship.x;
playerExplosion.y = battleship.y;
game.addChild(playerExplosion);
playerExplosion.explode();
// Create sinking ship animation
var sinkingShip = new SinkingShip();
sinkingShip.x = battleship.x;
sinkingShip.y = battleship.y;
game.addChild(sinkingShip);
// Hide original battleship
battleship.alpha = 0;
// Start sinking animation after explosion starts
LK.setTimeout(function () {
sinkingShip.sink();
}, 600);
// Show game over after all animations complete
LK.setTimeout(function () {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}, 3200);
return;
}
continue;
}
bullet.lastY = bullet.y;
}
};