User prompt
musuh datang setiap 10 detik
User prompt
musuh datang setiap 7 detik
User prompt
buat kontrol kapal lebih halus dan tidak kilat ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: Cannot read properties of null (reading 'x')' in or related to this line: 'if (Math.abs(dragNode.x - targetX) > 5) {' Line Number: 295 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
buat kapal dikontrol swipe dengan gerakan halus ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
fix music
User prompt
add background
User prompt
add background asset
User prompt
kurangi jumlah pesawat musuh menjadi 3
User prompt
delete bomb asset
User prompt
buat animasi tambahan kapal tenggelam saat game over ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
buat animasi ledakkan seperti 3 bola merah meledak saat player kena tembakkan untuk scene game over ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
buat animasi seperti 1 bola merah api ledakkan membesar saat musuh terkena tembakkan ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
tambah asset dengan nama enemyplane2 muncul dari sisi kanan ke kiri ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
perbaiki bahwa tidak ada enemyplane datang dari sisi kanan
User prompt
buat enemyplane musuh datang dari kiri ke kanan
User prompt
kurangi jumlah peluru player agar game tidak crash
User prompt
peluru musuh bisa hancur atau musnah saat kena tembak player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
buat musuh mati terkena sekali tembak dengan animasi meledak ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
kurang jumlah musuh yang musuh yang muncul agar game tidak crash
User prompt
hilangkan musuh yang bergerak vertical kebawah
User prompt
musuh hanya bisa menembak 5 peluru
User prompt
musuh bisa datang dari kiri menuju kanan dan bisa datang dari kanan menuju kiri
User prompt
reduce enemy number
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function' in or related to this line: 'setTimeout(function () {' Line Number: 228
/**** * 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(); LK.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; } };
/****
* 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();
LK.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;
}
};