/**** * 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