/****
* 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 = 20; // Fire every 1/3 second
self.update = function () {
self.fireTimer++;
if (self.fireTimer >= self.fireRate) {
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 Bomb = Container.expand(function () {
var self = Container.call(this);
var bombGraphics = self.attachAsset('bomb', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
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 = 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.health = 1;
self.fireTimer = 0;
self.fireRate = 120; // Fire every 2 seconds
self.update = function () {
self.y += self.speed;
self.fireTimer++;
// Fire bullets occasionally
if (self.fireTimer >= self.fireRate && Math.random() < 0.3) {
self.fireTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
}
// Drop bombs occasionally
if (Math.random() < 0.002) {
var bomb = new Bomb();
bomb.x = self.x;
bomb.y = self.y + 30;
bombs.push(bomb);
game.addChild(bomb);
}
};
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;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Game variables
var battleship;
var playerBullets = [];
var enemyPlanes = [];
var enemyBullets = [];
var bombs = [];
var waveTimer = 0;
var waveSize = 3;
var enemySpawnRate = 180; // 3 seconds
var dragNode = null;
// 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) {
dragNode.x = Math.max(60, Math.min(2048 - 60, x));
}
}
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() {
var formation = Math.floor(Math.random() * 3); // 3 different formations
for (var i = 0; i < waveSize; i++) {
var enemy = new EnemyPlane();
if (formation === 0) {
// Line formation
enemy.x = 200 + i * 200;
enemy.y = -50;
} else if (formation === 1) {
// V formation
enemy.x = 1024 + (i - Math.floor(waveSize / 2)) * 150;
enemy.y = -50 - Math.abs(i - Math.floor(waveSize / 2)) * 30;
} else {
// Scattered formation
enemy.x = 200 + Math.random() * 1648;
enemy.y = -50 - Math.random() * 100;
}
enemy.speed = 1 + Math.random() * 2;
enemyPlanes.push(enemy);
game.addChild(enemy);
}
}
// Main game update loop
game.update = function () {
waveTimer++;
// Spawn enemy waves
if (waveTimer >= enemySpawnRate) {
waveTimer = 0;
spawnEnemyWave();
// Increase difficulty over time
if (enemySpawnRate > 60) {
enemySpawnRate -= 2;
}
if (waveSize < 6) {
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 hitEnemy = false;
for (var j = enemyPlanes.length - 1; j >= 0; j--) {
var enemy = enemyPlanes[j];
if (bullet.intersects(enemy)) {
// Enemy hit
enemy.health--;
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + 100);
scoreTxt.setText('Score: ' + LK.getScore());
LK.effects.flashObject(enemy, 0xff0000, 300);
LK.getSound('enemyHit').play();
setTimeout(function () {
enemy.destroy();
}, 300);
enemyPlanes.splice(j, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
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;
// Remove enemies that go off screen
if (enemy.lastY <= 2782 && enemy.y > 2782) {
enemy.destroy();
enemyPlanes.splice(i, 1);
continue;
}
enemy.lastY = enemy.y;
}
// 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) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
continue;
}
bullet.lastY = bullet.y;
}
// Update and check bombs
for (var i = bombs.length - 1; i >= 0; i--) {
var bomb = bombs[i];
if (bomb.lastY === undefined) bomb.lastY = bomb.y;
// Remove bombs that go off screen
if (bomb.lastY <= 2782 && bomb.y > 2782) {
bomb.destroy();
bombs.splice(i, 1);
continue;
}
// Check collision with battleship
if (bomb.intersects(battleship)) {
battleship.health -= 2; // Bombs do more damage
healthTxt.setText('Health: ' + battleship.health);
LK.effects.flashObject(battleship, 0xff0000, 800);
LK.getSound('explosion').play();
bomb.destroy();
bombs.splice(i, 1);
if (battleship.health <= 0) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
continue;
}
bomb.lastY = bomb.y;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,294 @@
-/****
+/****
+* 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 = 20; // Fire every 1/3 second
+ self.update = function () {
+ self.fireTimer++;
+ if (self.fireTimer >= self.fireRate) {
+ 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 Bomb = Container.expand(function () {
+ var self = Container.call(this);
+ var bombGraphics = self.attachAsset('bomb', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ 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 = 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.health = 1;
+ self.fireTimer = 0;
+ self.fireRate = 120; // Fire every 2 seconds
+ self.update = function () {
+ self.y += self.speed;
+ self.fireTimer++;
+ // Fire bullets occasionally
+ if (self.fireTimer >= self.fireRate && Math.random() < 0.3) {
+ self.fireTimer = 0;
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 30;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ // Drop bombs occasionally
+ if (Math.random() < 0.002) {
+ var bomb = new Bomb();
+ bomb.x = self.x;
+ bomb.y = self.y + 30;
+ bombs.push(bomb);
+ game.addChild(bomb);
+ }
+ };
+ 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;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x001122
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var battleship;
+var playerBullets = [];
+var enemyPlanes = [];
+var enemyBullets = [];
+var bombs = [];
+var waveTimer = 0;
+var waveSize = 3;
+var enemySpawnRate = 180; // 3 seconds
+var dragNode = null;
+// 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) {
+ dragNode.x = Math.max(60, Math.min(2048 - 60, x));
+ }
+}
+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() {
+ var formation = Math.floor(Math.random() * 3); // 3 different formations
+ for (var i = 0; i < waveSize; i++) {
+ var enemy = new EnemyPlane();
+ if (formation === 0) {
+ // Line formation
+ enemy.x = 200 + i * 200;
+ enemy.y = -50;
+ } else if (formation === 1) {
+ // V formation
+ enemy.x = 1024 + (i - Math.floor(waveSize / 2)) * 150;
+ enemy.y = -50 - Math.abs(i - Math.floor(waveSize / 2)) * 30;
+ } else {
+ // Scattered formation
+ enemy.x = 200 + Math.random() * 1648;
+ enemy.y = -50 - Math.random() * 100;
+ }
+ enemy.speed = 1 + Math.random() * 2;
+ enemyPlanes.push(enemy);
+ game.addChild(enemy);
+ }
+}
+// Main game update loop
+game.update = function () {
+ waveTimer++;
+ // Spawn enemy waves
+ if (waveTimer >= enemySpawnRate) {
+ waveTimer = 0;
+ spawnEnemyWave();
+ // Increase difficulty over time
+ if (enemySpawnRate > 60) {
+ enemySpawnRate -= 2;
+ }
+ if (waveSize < 6) {
+ 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 hitEnemy = false;
+ for (var j = enemyPlanes.length - 1; j >= 0; j--) {
+ var enemy = enemyPlanes[j];
+ if (bullet.intersects(enemy)) {
+ // Enemy hit
+ enemy.health--;
+ if (enemy.health <= 0) {
+ LK.setScore(LK.getScore() + 100);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ LK.effects.flashObject(enemy, 0xff0000, 300);
+ LK.getSound('enemyHit').play();
+ setTimeout(function () {
+ enemy.destroy();
+ }, 300);
+ enemyPlanes.splice(j, 1);
+ }
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ hitEnemy = true;
+ break;
+ }
+ }
+ if (!hitEnemy) {
+ 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;
+ // Remove enemies that go off screen
+ if (enemy.lastY <= 2782 && enemy.y > 2782) {
+ enemy.destroy();
+ enemyPlanes.splice(i, 1);
+ continue;
+ }
+ enemy.lastY = enemy.y;
+ }
+ // 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) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ continue;
+ }
+ bullet.lastY = bullet.y;
+ }
+ // Update and check bombs
+ for (var i = bombs.length - 1; i >= 0; i--) {
+ var bomb = bombs[i];
+ if (bomb.lastY === undefined) bomb.lastY = bomb.y;
+ // Remove bombs that go off screen
+ if (bomb.lastY <= 2782 && bomb.y > 2782) {
+ bomb.destroy();
+ bombs.splice(i, 1);
+ continue;
+ }
+ // Check collision with battleship
+ if (bomb.intersects(battleship)) {
+ battleship.health -= 2; // Bombs do more damage
+ healthTxt.setText('Health: ' + battleship.health);
+ LK.effects.flashObject(battleship, 0xff0000, 800);
+ LK.getSound('explosion').play();
+ bomb.destroy();
+ bombs.splice(i, 1);
+ if (battleship.health <= 0) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ continue;
+ }
+ bomb.lastY = bomb.y;
+ }
+};
\ No newline at end of file