User prompt
semua musuh bisa menembak
User prompt
buat musuh bisa 3 kali menghindar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
musuh bisa menghindari 2 kali saat muncul ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make image background sharp and detail
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'baseTexture')' in or related to this line: 'forestBg.texture.baseTexture.scaleMode = 0; // SCALE_MODES.NEAREST for sharp pixels' Line Number: 438
User prompt
make image background sharp and detail
User prompt
buat animasi tower melayang pendek vertical atas bawah ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
buat animasi halus saat swipe control ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
musuh mati setelah 5 kali tembak
User prompt
musuh bisa menembak dari 4 arah mata angin
User prompt
musuh mengeluarkan satu peluru setiap satu detik
User prompt
reduce enemy
User prompt
musuh mati setelah 3 kali ditembak
User prompt
buat interval keluar peluru tower 1 detik
User prompt
rubah peluru tower menjadi peluru pengejar musuh ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
perbaiki gerakkan player hinggah mudah dikendalikan
User prompt
tower aktif menyerang
User prompt
buat jangkauan serang tower jauh ke atas.
User prompt
tower aktif menyerang dengan peluru yang di luncurkan ke atas miring kanan. peluru diatas kemudian meledak dan menyebarkan pecahan peluru ke segala arah untuk hancurkan musuh ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
jangan hilangkan tower. tower ikut menyerang juga
User prompt
rubah tugas tidak lagi melindungi tower.
User prompt
buat gerakkan player respon cepat ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
permudah gerakkan player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
peluru musuh bisa dihancurkan
User prompt
buat control karakter pemain lebih halus dan tidak gerak cepat sekejap ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Dragon = Container.expand(function () { var self = Container.call(this); var dragonGraphics = self.attachAsset('dragon', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.fireRate = 10; self.fireTimer = 0; self.speed = 8; self.update = function () { if (self.fireTimer > 0) { self.fireTimer--; } }; self.canShoot = function () { return self.fireTimer <= 0; }; self.shoot = function () { if (self.canShoot()) { var fireball = new Fireball(); fireball.x = self.x + 60; fireball.y = self.y; fireballs.push(fireball); game.addChild(fireball); self.fireTimer = self.fireRate; LK.getSound('shoot').play(); } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy1', { anchorX: 0.5, anchorY: 0.5 }); self.health = 10; self.speed = 3; self.damage = 10; self.update = function () { self.x -= self.speed; }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xff0000, 200); if (self.health <= 0) { self.destroy(); return true; } return false; }; return self; }); var EnemyProjectile = Container.expand(function () { var self = Container.call(this); var projectileGraphics = self.attachAsset('enemyProjectile', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.damage = 10; self.directionX = -1; self.directionY = 0; self.update = function () { self.x += self.speed * self.directionX; self.y += self.speed * self.directionY; }; return self; }); var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); self.lifespan = 30; self.maxLifespan = 30; self.update = function () { self.lifespan--; var progress = 1 - self.lifespan / self.maxLifespan; // Scale up then down if (progress < 0.3) { explosionGraphics.scaleX = explosionGraphics.scaleY = progress * 6; } else { explosionGraphics.scaleX = explosionGraphics.scaleY = (1 - progress) * 2; } // Fade out explosionGraphics.alpha = 1 - progress; // Remove when done if (self.lifespan <= 0) { self.destroy(); for (var i = explosions.length - 1; i >= 0; i--) { if (explosions[i] === self) { explosions.splice(i, 1); break; } } } }; return self; }); var FastEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy2', { anchorX: 0.5, anchorY: 0.5 }); self.health = 15; self.speed = 5; self.damage = 15; self.update = function () { self.x -= self.speed; self.y += Math.sin(self.x * 0.02) * 2; }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xff0000, 200); if (self.health <= 0) { self.destroy(); return true; } return false; }; return self; }); var Fireball = Container.expand(function () { var self = Container.call(this); var fireballGraphics = self.attachAsset('fireball', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.damage = 10; self.update = function () { self.x += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.type = 'damage'; // damage, firerate, speed self.update = function () { self.x -= self.speed; self.rotation += 0.1; }; return self; }); var ShootingEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy2', { anchorX: 0.5, anchorY: 0.5 }); self.health = 20; self.speed = 2; self.damage = 20; self.fireRate = 60; self.fireTimer = 0; self.update = function () { self.x -= self.speed; if (self.fireTimer > 0) { self.fireTimer--; } // Shoot at dragon if in range if (self.x < 1800 && self.canShoot()) { self.shootAt(dragon.x, dragon.y); } }; self.canShoot = function () { return self.fireTimer <= 0; }; self.shootAt = function (targetX, targetY) { if (self.canShoot()) { var projectile = new EnemyProjectile(); projectile.x = self.x - 30; projectile.y = self.y; var deltaX = targetX - projectile.x; var deltaY = targetY - projectile.y; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (distance > 0) { projectile.directionX = deltaX / distance; projectile.directionY = deltaY / distance; } enemyProjectiles.push(projectile); game.addChild(projectile); self.fireTimer = self.fireRate; LK.getSound('shoot').play(); } }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xff0000, 200); if (self.health <= 0) { self.destroy(); return true; } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ // Background var forestBg = game.addChild(LK.getAsset('forestBg', { anchorX: 0, anchorY: 0, x: 0, y: 0, alpha: 0.7 })); // Game variables var dragon = game.addChild(new Dragon()); var fireballs = []; var enemies = []; var powerups = []; var explosions = []; var enemyProjectiles = []; var enemySpawnTimer = 0; var powerUpSpawnTimer = 0; var waveLevel = 1; var gameSpeed = 1; var survivalTime = 0; var enemiesKilled = 0; // Position initial elements dragon.x = 1024; dragon.y = 1366; // UI Elements var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); scoreTxt.x = 150; scoreTxt.y = 50; LK.gui.topLeft.addChild(scoreTxt); var timeTxt = new Text2('Time: 0s', { size: 60, fill: 0xFFFFFF }); timeTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timeTxt); var waveTxt = new Text2('Wave: 1', { size: 50, fill: 0xFFFFFF }); waveTxt.anchor.set(1, 0); LK.gui.topRight.addChild(waveTxt); function updateTime() { timeTxt.setText('Time: ' + Math.floor(survivalTime / 60) + 's'); } function updateScore() { scoreTxt.setText('Score: ' + LK.getScore()); } function updateWave() { waveTxt.setText('Wave: ' + waveLevel); } // Touch controls var isDragging = false; game.down = function (x, y, obj) { isDragging = true; dragon.shoot(); }; game.move = function (x, y, obj) { if (isDragging) { var targetX = Math.max(100, Math.min(1900, x)); var targetY = Math.max(100, Math.min(2600, y)); // Stop any existing movement tweens tween.stop(dragon, { x: true, y: true }); // Create smooth movement tween with faster response time tween(dragon, { x: targetX, y: targetY }, { duration: 100, easing: tween.easeOut }); } }; game.up = function (x, y, obj) { isDragging = false; }; // Spawn functions function spawnEnemy() { var enemy; var rand = Math.random(); if (rand < 0.2 + waveLevel * 0.05) { enemy = new ShootingEnemy(); } else if (rand < 0.4 + waveLevel * 0.1) { enemy = new FastEnemy(); } else { enemy = new Enemy(); } enemy.x = 2100; enemy.y = Math.random() * 2200 + 300; enemies.push(enemy); game.addChild(enemy); } function spawnPowerUp() { var powerup = new PowerUp(); powerup.x = 2100; powerup.y = Math.random() * 2200 + 300; var rand = Math.random(); if (rand < 0.4) { powerup.type = 'damage'; } else if (rand < 0.7) { powerup.type = 'firerate'; } else { powerup.type = 'speed'; } powerups.push(powerup); game.addChild(powerup); } function createExplosion(x, y) { var explosion = new Explosion(); explosion.x = x; explosion.y = y; explosions.push(explosion); game.addChild(explosion); LK.getSound('explosion').play(); // Create additional tween effects for more dramatic explosion var particles = []; for (var i = 0; i < 5; i++) { var particle = LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); particle.x = x; particle.y = y; game.addChild(particle); particles.push(particle); var randomX = x + (Math.random() - 0.5) * 200; var randomY = y + (Math.random() - 0.5) * 200; tween(particle, { x: randomX, y: randomY, alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { particle.destroy(); } }); } } // Main game loop game.update = function () { // Update survival time survivalTime++; if (LK.ticks % 60 == 0) { updateTime(); } // Increase difficulty over time if (LK.ticks % 1800 == 0) { // Every 30 seconds waveLevel++; updateWave(); gameSpeed += 0.1; } // Spawn enemies enemySpawnTimer--; if (enemySpawnTimer <= 0) { spawnEnemy(); enemySpawnTimer = Math.max(180 - waveLevel * 5, 60); } // Spawn power-ups occasionally powerUpSpawnTimer--; if (powerUpSpawnTimer <= 0) { if (Math.random() < 0.3) { spawnPowerUp(); } powerUpSpawnTimer = Math.random() * 600 + 300; // 5-15 seconds } // Update fireballs for (var i = fireballs.length - 1; i >= 0; i--) { var fireball = fireballs[i]; // Remove if off screen if (fireball.x > 2200) { fireball.destroy(); fireballs.splice(i, 1); continue; } // Check collision with enemy projectiles for (var k = enemyProjectiles.length - 1; k >= 0; k--) { var enemyProjectile = enemyProjectiles[k]; if (fireball.intersects(enemyProjectile)) { // Destroy both projectiles fireball.destroy(); fireballs.splice(i, 1); enemyProjectile.destroy(); enemyProjectiles.splice(k, 1); // Add small score bonus for defensive play LK.setScore(LK.getScore() + 5); updateScore(); LK.getSound('enemyHit').play(); // Create small explosion effect createExplosion(fireball.x, fireball.y); break; } } // Skip enemy collision check if fireball was already destroyed if (i >= fireballs.length) continue; // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (fireball.intersects(enemy)) { if (enemy.takeDamage(fireball.damage)) { createExplosion(enemy.x, enemy.y); enemies.splice(j, 1); enemiesKilled++; LK.setScore(LK.getScore() + 10); updateScore(); LK.getSound('enemyHit').play(); } fireball.destroy(); fireballs.splice(i, 1); break; } } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Remove enemies that go off screen (left side) if (enemy.x < -100) { enemy.destroy(); enemies.splice(i, 1); continue; } // Check collision with dragon - game over if hit if (enemy.intersects(dragon)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } // Update power-ups for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; // Remove if off screen if (powerup.x < -100) { powerup.destroy(); powerups.splice(i, 1); continue; } // Check collision with dragon if (powerup.intersects(dragon)) { if (powerup.type === 'damage') { dragon.damage = Math.min(dragon.damage + 5, 50); } else if (powerup.type === 'firerate') { dragon.fireRate = Math.max(dragon.fireRate - 2, 3); } else if (powerup.type === 'speed') { dragon.speed = Math.min(dragon.speed + 1, 15); } LK.getSound('powerUpCollect').play(); LK.effects.flashObject(dragon, 0xffd700, 500); powerup.destroy(); powerups.splice(i, 1); } } // Update enemy projectiles for (var i = enemyProjectiles.length - 1; i >= 0; i--) { var projectile = enemyProjectiles[i]; // Remove if off screen if (projectile.x < -100 || projectile.x > 2200 || projectile.y < -100 || projectile.y > 2800) { projectile.destroy(); enemyProjectiles.splice(i, 1); continue; } // Check collision with dragon - game over if hit if (projectile.intersects(dragon)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } // Auto-shoot for dragon if (LK.ticks % 20 == 0) { dragon.shoot(); } }; // Start background music LK.playMusic('bgmusic');
===================================================================
--- original.js
+++ change.js
@@ -211,71 +211,8 @@
return false;
};
return self;
});
-var Tower = Container.expand(function () {
- var self = Container.call(this);
- var towerGraphics = self.attachAsset('tower', {
- anchorX: 0.5,
- anchorY: 1.0
- });
- self.maxHealth = 100;
- self.health = 100;
- self.fireRate = 30;
- self.fireTimer = 0;
- self.update = function () {
- if (self.fireTimer > 0) {
- self.fireTimer--;
- }
- };
- self.canShoot = function () {
- return self.fireTimer <= 0;
- };
- self.shootAt = function (targetX, targetY) {
- if (self.canShoot()) {
- var projectile = new TowerProjectile();
- projectile.x = self.x;
- projectile.y = self.y - 150;
- var deltaX = targetX - projectile.x;
- var deltaY = targetY - projectile.y;
- var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
- if (distance > 0) {
- projectile.directionX = deltaX / distance;
- projectile.directionY = deltaY / distance;
- }
- towerProjectiles.push(projectile);
- game.addChild(projectile);
- self.fireTimer = self.fireRate;
- LK.getSound('shoot').play();
- }
- };
- self.takeDamage = function (damage) {
- self.health -= damage;
- LK.effects.flashObject(self, 0xff0000, 500);
- if (self.health <= 0) {
- self.health = 0;
- LK.showGameOver();
- }
- updateHealthBar();
- };
- return self;
-});
-var TowerProjectile = Container.expand(function () {
- var self = Container.call(this);
- var projectileGraphics = self.attachAsset('fireball', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.speed = 8;
- self.damage = 15;
- self.directionX = 1;
- self.directionY = 0;
- self.update = function () {
- self.x += self.speed * self.directionX;
- self.y += self.speed * self.directionY;
- };
- return self;
-});
/****
* Initialize Game
****/
@@ -295,24 +232,22 @@
alpha: 0.7
}));
// Game variables
var dragon = game.addChild(new Dragon());
-var tower = game.addChild(new Tower());
var fireballs = [];
var enemies = [];
var powerups = [];
-var towerProjectiles = [];
var explosions = [];
var enemyProjectiles = [];
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var waveLevel = 1;
var gameSpeed = 1;
+var survivalTime = 0;
+var enemiesKilled = 0;
// Position initial elements
-dragon.x = 300;
+dragon.x = 1024;
dragon.y = 1366;
-tower.x = 150;
-tower.y = 2200;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
@@ -320,22 +255,22 @@
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
-var healthTxt = new Text2('Tower Health: 100', {
+var timeTxt = new Text2('Time: 0s', {
size: 60,
fill: 0xFFFFFF
});
-healthTxt.anchor.set(0.5, 0);
-LK.gui.top.addChild(healthTxt);
+timeTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(timeTxt);
var waveTxt = new Text2('Wave: 1', {
size: 50,
fill: 0xFFFFFF
});
waveTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(waveTxt);
-function updateHealthBar() {
- healthTxt.setText('Tower Health: ' + tower.health);
+function updateTime() {
+ timeTxt.setText('Time: ' + Math.floor(survivalTime / 60) + 's');
}
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
@@ -439,8 +374,13 @@
}
}
// Main game loop
game.update = function () {
+ // Update survival time
+ survivalTime++;
+ if (LK.ticks % 60 == 0) {
+ updateTime();
+ }
// Increase difficulty over time
if (LK.ticks % 1800 == 0) {
// Every 30 seconds
waveLevel++;
@@ -450,9 +390,9 @@
// Spawn enemies
enemySpawnTimer--;
if (enemySpawnTimer <= 0) {
spawnEnemy();
- enemySpawnTimer = Math.max(180 - waveLevel * 5, 120);
+ enemySpawnTimer = Math.max(180 - waveLevel * 5, 60);
}
// Spawn power-ups occasionally
powerUpSpawnTimer--;
if (powerUpSpawnTimer <= 0) {
@@ -496,8 +436,9 @@
if (fireball.intersects(enemy)) {
if (enemy.takeDamage(fireball.damage)) {
createExplosion(enemy.x, enemy.y);
enemies.splice(j, 1);
+ enemiesKilled++;
LK.setScore(LK.getScore() + 10);
updateScore();
LK.getSound('enemyHit').play();
}
@@ -509,21 +450,18 @@
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
- // Check if enemy reached tower
- if (enemy.x < 200) {
- tower.takeDamage(enemy.damage);
+ // Remove enemies that go off screen (left side)
+ if (enemy.x < -100) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
- // Check collision with dragon
+ // Check collision with dragon - game over if hit
if (enemy.intersects(dragon)) {
- tower.takeDamage(5);
- enemy.destroy();
- enemies.splice(i, 1);
- LK.effects.flashObject(dragon, 0xff0000, 300);
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
}
}
// Update power-ups
for (var i = powerups.length - 1; i >= 0; i--) {
@@ -548,47 +486,8 @@
powerup.destroy();
powerups.splice(i, 1);
}
}
- // Tower auto-shooting at nearest enemy
- if (enemies.length > 0 && LK.ticks % 45 == 0) {
- var nearestEnemy = enemies[0];
- var minDistance = Math.abs(nearestEnemy.x - tower.x) + Math.abs(nearestEnemy.y - tower.y);
- for (var k = 1; k < enemies.length; k++) {
- var distance = Math.abs(enemies[k].x - tower.x) + Math.abs(enemies[k].y - tower.y);
- if (distance < minDistance) {
- minDistance = distance;
- nearestEnemy = enemies[k];
- }
- }
- tower.shootAt(nearestEnemy.x, nearestEnemy.y);
- }
- // Update tower projectiles
- for (var i = towerProjectiles.length - 1; i >= 0; i--) {
- var projectile = towerProjectiles[i];
- // Remove if off screen
- if (projectile.x > 2200 || projectile.x < -100 || projectile.y > 2800 || projectile.y < -100) {
- projectile.destroy();
- towerProjectiles.splice(i, 1);
- continue;
- }
- // Check collision with enemies
- for (var j = enemies.length - 1; j >= 0; j--) {
- var enemy = enemies[j];
- if (projectile.intersects(enemy)) {
- if (enemy.takeDamage(projectile.damage)) {
- createExplosion(enemy.x, enemy.y);
- enemies.splice(j, 1);
- LK.setScore(LK.getScore() + 15);
- updateScore();
- LK.getSound('enemyHit').play();
- }
- projectile.destroy();
- towerProjectiles.splice(i, 1);
- break;
- }
- }
- }
// Update enemy projectiles
for (var i = enemyProjectiles.length - 1; i >= 0; i--) {
var projectile = enemyProjectiles[i];
// Remove if off screen
@@ -596,21 +495,13 @@
projectile.destroy();
enemyProjectiles.splice(i, 1);
continue;
}
- // Check collision with dragon
+ // Check collision with dragon - game over if hit
if (projectile.intersects(dragon)) {
- tower.takeDamage(projectile.damage);
- LK.effects.flashObject(dragon, 0xff0000, 300);
- projectile.destroy();
- enemyProjectiles.splice(i, 1);
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
}
- // Check collision with tower
- if (projectile.intersects(tower)) {
- tower.takeDamage(projectile.damage);
- projectile.destroy();
- enemyProjectiles.splice(i, 1);
- }
}
// Auto-shoot for dragon
if (LK.ticks % 20 == 0) {
dragon.shoot();
silver red row dragon mecha side scroller. In-Game asset. 2d. High contrast. No shadows
goblin spear ghotic fantasy warplane. side scroller. In-Game asset. 2d. High contrast. No shadows
anime image realistic ghotic medieval futuristic landscape from distance add clear blue sky day In-Game asset. 2d. High contrast. No shadows. In-Game asset. 2d. High contrast. No shadows