User prompt
buat satu musuh yang bisa menembak
User prompt
buat efek meledak pada musuh ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
kurangi jumlah jumlah musuh yang muncul secara drastis
User prompt
menara bisa menembak kesegala arah
Code edit (1 edits merged)
Please save this source code
User prompt
Dragon Guardian: Tower Defense
Initial prompt
buat permainan side scroller shooter penunggang naga terbang penjaga menara perak tinggi dalam hutan. menghancurkan kekuatan jahat yang ingin masuki menara
/**** * 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; }); 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 ****/ 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 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; // Position initial elements dragon.x = 300; dragon.y = 1366; tower.x = 150; tower.y = 2200; // 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 healthTxt = new Text2('Tower Health: 100', { size: 60, fill: 0xFFFFFF }); healthTxt.anchor.set(0.5, 0); LK.gui.top.addChild(healthTxt); 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 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) { dragon.x = Math.max(100, Math.min(1900, x)); dragon.y = Math.max(100, Math.min(2600, y)); } }; 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 () { // 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, 120); } // 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 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); 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]; // Check if enemy reached tower if (enemy.x < 200) { tower.takeDamage(enemy.damage); enemy.destroy(); enemies.splice(i, 1); continue; } // Check collision with dragon if (enemy.intersects(dragon)) { tower.takeDamage(5); enemy.destroy(); enemies.splice(i, 1); LK.effects.flashObject(dragon, 0xff0000, 300); } } // 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); } } // 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 if (projectile.x < -100 || projectile.x > 2200 || projectile.y < -100 || projectile.y > 2800) { projectile.destroy(); enemyProjectiles.splice(i, 1); continue; } // Check collision with dragon if (projectile.intersects(dragon)) { tower.takeDamage(projectile.damage); LK.effects.flashObject(dragon, 0xff0000, 300); projectile.destroy(); enemyProjectiles.splice(i, 1); } // 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(); } }; // Start background music LK.playMusic('bgmusic');
===================================================================
--- original.js
+++ change.js
@@ -59,8 +59,24 @@
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,
@@ -142,8 +158,61 @@
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;
+});
var Tower = Container.expand(function () {
var self = Container.call(this);
var towerGraphics = self.attachAsset('tower', {
anchorX: 0.5,
@@ -232,8 +301,9 @@
var enemies = [];
var powerups = [];
var towerProjectiles = [];
var explosions = [];
+var enemyProjectiles = [];
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var waveLevel = 1;
var gameSpeed = 1;
@@ -289,9 +359,12 @@
};
// Spawn functions
function spawnEnemy() {
var enemy;
- if (Math.random() < 0.3 + waveLevel * 0.1) {
+ 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();
}
@@ -481,8 +554,31 @@
break;
}
}
}
+ // 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
+ if (projectile.intersects(dragon)) {
+ tower.takeDamage(projectile.damage);
+ LK.effects.flashObject(dragon, 0xff0000, 300);
+ projectile.destroy();
+ enemyProjectiles.splice(i, 1);
+ }
+ // 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