User prompt
Make when the bullet touch each other it deleted
User prompt
Make the small spaceships have long range
User prompt
Fix the game I cannot see the enemy while the enemy is shooting at our mothership and our small spaceships is not shooting while the enemy is shooting
User prompt
Make so when the enemy die add the exploding ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When bullet touches the edge it needs to be deleted
User prompt
Make a starting screen
User prompt
When bullet touch each other it skips the collision of bullets
User prompt
Make the bullet deleted when touched the enemy
User prompt
Make my units have long range the entire map
Code edit (1 edits merged)
Please save this source code
User prompt
Space Fleet Defense
Initial prompt
Make a game where you are on space and you have to protect your spaceship by buying small spaceships to attack by make your small spaceship shooting at enemy's base spaceship
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.targetX = 0; self.targetY = 0; self.damage = 1; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.health = 3; self.maxHealth = 3; self.shootCooldown = 0; self.maxShootCooldown = 120; self.reward = 15; self.update = function () { // Ensure enemy is visible and active if (!self.visible || self.alpha <= 0) return; var dx = mothership.x - self.x; var dy = mothership.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 80) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } if (self.shootCooldown > 0) { self.shootCooldown--; } if (self.shootCooldown <= 0 && distance < 400) { var enemyBullet = new EnemyBullet(); enemyBullet.x = self.x; enemyBullet.y = self.y; enemyBullets.push(enemyBullet); game.addChild(enemyBullet); self.shootCooldown = self.maxShootCooldown; } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { return true; } return false; }; 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 = 4; self.damage = 10; self.update = function () { var dx = mothership.x - self.x; var dy = mothership.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var Fighter = Container.expand(function () { var self = Container.call(this); var fighterGraphics = self.attachAsset('fighter', { anchorX: 0.5, anchorY: 0.5 }); self.orbitRadius = 200; self.orbitSpeed = 0.02; self.angle = Math.random() * Math.PI * 2; self.shootCooldown = 0; self.maxShootCooldown = 40; self.range = 2000; self.update = function () { self.angle += self.orbitSpeed; self.x = mothership.x + Math.cos(self.angle) * self.orbitRadius; self.y = mothership.y + Math.sin(self.angle) * self.orbitRadius; if (self.shootCooldown > 0) { self.shootCooldown--; } if (self.shootCooldown <= 0) { var closestEnemy = null; var closestDistance = self.range; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } if (closestEnemy) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.targetX = closestEnemy.x; bullet.targetY = closestEnemy.y; bullets.push(bullet); game.addChild(bullet); self.shootCooldown = self.maxShootCooldown; LK.getSound('shoot').play(); } } }; return self; }); var Mothership = Container.expand(function () { var self = Container.call(this); var mothershipGraphics = self.attachAsset('mothership', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xff0000, 300); if (self.health <= 0) { self.health = 0; LK.showGameOver(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000011 }); /**** * Game Code ****/ var gameState = 'start'; // 'start', 'playing', 'gameOver' var mothership; var fighters = []; var enemies = []; var bullets = []; var enemyBullets = []; var credits = 100; var wave = 1; var enemiesInWave = 5; var enemiesSpawned = 0; var waveComplete = false; var spawnTimer = 0; var maxSpawnTimer = 180; var fighterCost = 50; // Starting screen elements var titleText = new Text2('SPACE FLEET DEFENSE', { size: 120, fill: 0x4a90e2 }); titleText.anchor.set(0.5, 0.5); LK.gui.center.addChild(titleText); var instructionText = new Text2('Defend your mothership!\nBuy fighters to attack enemies.\nSurvive 10 waves to win!', { size: 80, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); instructionText.y = 200; LK.gui.center.addChild(instructionText); var startButton = new Text2('TAP TO START', { size: 100, fill: 0x7ed321 }); startButton.anchor.set(0.5, 0.5); startButton.y = 400; LK.gui.center.addChild(startButton); // Game UI elements (initially hidden) var creditsText = new Text2('Credits: 100', { size: 60, fill: 0xFFFFFF }); creditsText.anchor.set(0, 0); creditsText.x = 20; creditsText.y = 20; creditsText.visible = false; LK.gui.topLeft.addChild(creditsText); var healthText = new Text2('Health: 100/100', { size: 60, fill: 0xFFFFFF }); healthText.anchor.set(0.5, 0); healthText.visible = false; LK.gui.top.addChild(healthText); var waveText = new Text2('Wave: 1', { size: 60, fill: 0xFFFFFF }); waveText.anchor.set(1, 0); waveText.visible = false; LK.gui.topRight.addChild(waveText); var buyButton = new Text2('Buy Fighter (50)', { size: 80, fill: 0x00FF00 }); buyButton.anchor.set(0.5, 1); buyButton.visible = false; LK.gui.bottom.addChild(buyButton); startButton.down = function (x, y, obj) { if (gameState === 'start') { startGame(); } }; buyButton.down = function (x, y, obj) { if (gameState === 'playing' && credits >= fighterCost) { credits -= fighterCost; var fighter = new Fighter(); fighter.orbitRadius = 200 + fighters.length * 30; fighters.push(fighter); game.addChild(fighter); LK.getSound('purchase').play(); fighterCost += 10; buyButton.setText('Buy Fighter (' + fighterCost + ')'); creditsText.setText('Credits: ' + credits); } }; function startGame() { gameState = 'playing'; // Hide start screen titleText.visible = false; instructionText.visible = false; startButton.visible = false; // Show game UI creditsText.visible = true; healthText.visible = true; waveText.visible = true; buyButton.visible = true; // Initialize game objects mothership = game.addChild(new Mothership()); mothership.x = 2048 / 2; mothership.y = 2732 / 2; } function spawnEnemy() { var enemy = new Enemy(); var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top enemy.x = Math.random() * 2048; enemy.y = -50; break; case 1: // Right enemy.x = 2048 + 50; enemy.y = Math.random() * 2732; break; case 2: // Bottom enemy.x = Math.random() * 2048; enemy.y = 2732 + 50; break; case 3: // Left enemy.x = -50; enemy.y = Math.random() * 2732; break; } enemy.health += Math.floor(wave / 3); enemy.maxHealth = enemy.health; enemy.speed += wave * 0.1; enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } function startNextWave() { wave++; enemiesInWave = 5 + wave * 2; enemiesSpawned = 0; waveComplete = false; waveText.setText('Wave: ' + wave); maxSpawnTimer = Math.max(60, 180 - wave * 10); } game.update = function () { if (gameState !== 'playing') { return; } if (!waveComplete && enemiesSpawned < enemiesInWave) { spawnTimer++; if (spawnTimer >= maxSpawnTimer) { spawnEnemy(); spawnTimer = 0; } } if (enemiesSpawned >= enemiesInWave && enemies.length === 0 && !waveComplete) { waveComplete = true; credits += 50 + wave * 10; creditsText.setText('Credits: ' + credits); LK.setTimeout(function () { startNextWave(); }, 2000); } for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (!bullet || bullet.destroyed) continue; // Skip if bullet is already destroyed var hitEnemy = false; var hitEnemyBullet = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { if (enemy.takeDamage(bullet.damage)) { credits += enemy.reward; creditsText.setText('Credits: ' + credits); LK.getSound('enemyHit').play(); // Create explosion effect var enemyToDestroy = enemy; // Capture enemy reference tween(enemy, { scaleX: 2, scaleY: 2, alpha: 0, tint: 0xFF4444 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { enemyToDestroy.destroy(); } }); enemies.splice(j, 1); } bullet.destroyed = true; // Mark as destroyed bullet.destroy(); bullets.splice(i, 1); hitEnemy = true; break; } } if (!hitEnemy && !bullet.destroyed) { // Check collision with enemy bullets for (var k = enemyBullets.length - 1; k >= 0; k--) { var enemyBullet = enemyBullets[k]; if (bullet.intersects(enemyBullet)) { // Destroy both bullets bullet.destroyed = true; bullet.destroy(); bullets.splice(i, 1); enemyBullet.destroy(); enemyBullets.splice(k, 1); hitEnemyBullet = true; break; } } } if (!hitEnemy && !hitEnemyBullet && !bullet.destroyed) { if (bullet.x < 0 || bullet.x > 2048 || bullet.y < 0 || bullet.y > 2732) { bullet.destroyed = true; // Mark as destroyed bullet.destroy(); bullets.splice(i, 1); } } } for (var i = enemyBullets.length - 1; i >= 0; i--) { var enemyBullet = enemyBullets[i]; if (enemyBullet.intersects(mothership)) { mothership.takeDamage(enemyBullet.damage); healthText.setText('Health: ' + mothership.health + '/' + mothership.maxHealth); enemyBullet.destroy(); enemyBullets.splice(i, 1); } else if (enemyBullet.x < -100 || enemyBullet.x > 2148 || enemyBullet.y < -100 || enemyBullet.y > 2832) { enemyBullet.destroy(); enemyBullets.splice(i, 1); } } for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (enemy.intersects(mothership)) { mothership.takeDamage(20); healthText.setText('Health: ' + mothership.health + '/' + mothership.maxHealth); // Create explosion effect var enemyToDestroy = enemy; // Capture enemy reference tween(enemy, { scaleX: 2, scaleY: 2, alpha: 0, tint: 0xFF4444 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { enemyToDestroy.destroy(); } }); enemies.splice(i, 1); } } if (buyButton) { if (credits >= fighterCost) { buyButton.tint = 0x00ff00; } else { buyButton.tint = 0x666666; } } if (wave >= 10) { LK.showYouWin(); } };
===================================================================
--- original.js
+++ change.js
@@ -327,8 +327,9 @@
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (!bullet || bullet.destroyed) continue; // Skip if bullet is already destroyed
var hitEnemy = false;
+ var hitEnemyBullet = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
if (enemy.takeDamage(bullet.damage)) {
@@ -358,8 +359,24 @@
break;
}
}
if (!hitEnemy && !bullet.destroyed) {
+ // Check collision with enemy bullets
+ for (var k = enemyBullets.length - 1; k >= 0; k--) {
+ var enemyBullet = enemyBullets[k];
+ if (bullet.intersects(enemyBullet)) {
+ // Destroy both bullets
+ bullet.destroyed = true;
+ bullet.destroy();
+ bullets.splice(i, 1);
+ enemyBullet.destroy();
+ enemyBullets.splice(k, 1);
+ hitEnemyBullet = true;
+ break;
+ }
+ }
+ }
+ if (!hitEnemy && !hitEnemyBullet && !bullet.destroyed) {
if (bullet.x < 0 || bullet.x > 2048 || bullet.y < 0 || bullet.y > 2732) {
bullet.destroyed = true; // Mark as destroyed
bullet.destroy();
bullets.splice(i, 1);