User prompt
Add sound effects to each new wave, when you die, and when you get a power up
User prompt
Every 10 waves make a boss ship with better bullets and has more health then other enemies
User prompt
I can’t see the logo on the green power ups
User prompt
Make the power up logos more visible
User prompt
Make a logo on the power ups to show what the power up is
User prompt
Make rare power ups that don’t spawn as much with double and triple shot
User prompt
Make the faster firing power up not as laggy
User prompt
Make it so you can pick up the power ups and powers your character
User prompt
Make power ups flow down sometimes, after you kill an enemy
User prompt
Make some enemies have faster bullets and a different Star Wars ship
User prompt
Make the ships look like a Star Wars ship
User prompt
Make the character and enemies look like ships
Code edit (1 edits merged)
Please save this source code
User prompt
Galactic Defender
Initial prompt
A space invader game shooting at other ships
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.direction = 1; // 1 for right, -1 for left
self.shootTimer = Math.floor(Math.random() * 120) + 60; // Random shoot timing
self.shootDelay = 120; // Shoot every 2 seconds on average
self.update = function () {
// Move horizontally
self.x += self.speed * self.direction;
// Bounce off edges and move down
if (self.x <= 100 || self.x >= 1948) {
self.direction *= -1;
self.y += 60;
}
// Occasional shooting
self.shootTimer--;
if (self.shootTimer <= 0 && Math.random() < 0.1) {
self.shootTimer = self.shootDelay + Math.floor(Math.random() * 60);
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
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 = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.shootTimer = 0;
self.shootDelay = 10; // Shoot every 10 ticks
self.update = function () {
// Auto-shoot
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
// Create bullet
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 40;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000022
});
/****
* Game Code
****/
// Game variables
var player;
var enemies = [];
var playerBullets = [];
var enemyBullets = [];
var waveNumber = 1;
var enemiesPerWave = 12;
var waveSpawnTimer = 0;
var gameStarted = false;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var waveTxt = new Text2('Wave: 1', {
size: 50,
fill: 0xFFFF00
});
waveTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(waveTxt);
// Create player
player = game.addChild(new PlayerShip());
player.x = 1024;
player.y = 2600;
// Spawn initial wave
function spawnWave() {
var enemiesInRow = 6;
var rows = Math.ceil(enemiesPerWave / enemiesInRow);
var startX = 300;
var startY = 200;
var spacingX = 200;
var spacingY = 100;
for (var i = 0; i < enemiesPerWave; i++) {
var row = Math.floor(i / enemiesInRow);
var col = i % enemiesInRow;
var enemy = new EnemyShip();
enemy.x = startX + col * spacingX;
enemy.y = startY + row * spacingY;
enemy.speed = 1 + waveNumber * 0.5; // Increase speed each wave
enemies.push(enemy);
game.addChild(enemy);
}
}
// Initial wave spawn
spawnWave();
// Touch controls for player movement
var isDragging = false;
game.down = function (x, y, obj) {
isDragging = true;
player.x = x;
};
game.move = function (x, y, obj) {
if (isDragging) {
player.x = Math.max(50, Math.min(1998, x)); // Keep player in bounds
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Main game loop
game.update = function () {
// Update 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 >= -50 && bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
if (bullet.intersects(enemies[j])) {
// Hit enemy
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('enemyHit').play();
LK.effects.flashObject(enemies[j], 0xffffff, 200);
// Remove enemy
enemies[j].destroy();
enemies.splice(j, 1);
// Remove bullet
bullet.destroy();
playerBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update 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 player
if (bullet.intersects(player)) {
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
bullet.lastY = bullet.y;
}
// Check if enemies reached player
for (var i = 0; i < enemies.length; i++) {
if (enemies[i].intersects(player) || enemies[i].y > 2500) {
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// Check if wave is complete
if (enemies.length === 0) {
waveSpawnTimer++;
if (waveSpawnTimer > 120) {
// 2 second delay between waves
waveNumber++;
enemiesPerWave = Math.min(20, 12 + waveNumber); // Cap at 20 enemies
waveTxt.setText('Wave: ' + waveNumber);
spawnWave();
waveSpawnTimer = 0;
}
}
// Victory condition - survived 10 waves
if (waveNumber > 10 && enemies.length === 0) {
LK.showYouWin();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,240 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var EnemyShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.direction = 1; // 1 for right, -1 for left
+ self.shootTimer = Math.floor(Math.random() * 120) + 60; // Random shoot timing
+ self.shootDelay = 120; // Shoot every 2 seconds on average
+ self.update = function () {
+ // Move horizontally
+ self.x += self.speed * self.direction;
+ // Bounce off edges and move down
+ if (self.x <= 100 || self.x >= 1948) {
+ self.direction *= -1;
+ self.y += 60;
+ }
+ // Occasional shooting
+ self.shootTimer--;
+ if (self.shootTimer <= 0 && Math.random() < 0.1) {
+ self.shootTimer = self.shootDelay + Math.floor(Math.random() * 60);
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 30;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ };
+ 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 = -12;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.shootTimer = 0;
+ self.shootDelay = 10; // Shoot every 10 ticks
+ self.update = function () {
+ // Auto-shoot
+ self.shootTimer++;
+ if (self.shootTimer >= self.shootDelay) {
+ self.shootTimer = 0;
+ // Create bullet
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 40;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000022
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var enemies = [];
+var playerBullets = [];
+var enemyBullets = [];
+var waveNumber = 1;
+var enemiesPerWave = 12;
+var waveSpawnTimer = 0;
+var gameStarted = false;
+// UI Elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var waveTxt = new Text2('Wave: 1', {
+ size: 50,
+ fill: 0xFFFF00
+});
+waveTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(waveTxt);
+// Create player
+player = game.addChild(new PlayerShip());
+player.x = 1024;
+player.y = 2600;
+// Spawn initial wave
+function spawnWave() {
+ var enemiesInRow = 6;
+ var rows = Math.ceil(enemiesPerWave / enemiesInRow);
+ var startX = 300;
+ var startY = 200;
+ var spacingX = 200;
+ var spacingY = 100;
+ for (var i = 0; i < enemiesPerWave; i++) {
+ var row = Math.floor(i / enemiesInRow);
+ var col = i % enemiesInRow;
+ var enemy = new EnemyShip();
+ enemy.x = startX + col * spacingX;
+ enemy.y = startY + row * spacingY;
+ enemy.speed = 1 + waveNumber * 0.5; // Increase speed each wave
+ enemies.push(enemy);
+ game.addChild(enemy);
+ }
+}
+// Initial wave spawn
+spawnWave();
+// Touch controls for player movement
+var isDragging = false;
+game.down = function (x, y, obj) {
+ isDragging = true;
+ player.x = x;
+};
+game.move = function (x, y, obj) {
+ if (isDragging) {
+ player.x = Math.max(50, Math.min(1998, x)); // Keep player in bounds
+ }
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Main game loop
+game.update = function () {
+ // Update 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 >= -50 && bullet.y < -50) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemies
+ var hitEnemy = false;
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ if (bullet.intersects(enemies[j])) {
+ // Hit enemy
+ LK.setScore(LK.getScore() + 10);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ LK.getSound('enemyHit').play();
+ LK.effects.flashObject(enemies[j], 0xffffff, 200);
+ // Remove enemy
+ enemies[j].destroy();
+ enemies.splice(j, 1);
+ // Remove bullet
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ hitEnemy = true;
+ break;
+ }
+ }
+ if (!hitEnemy) {
+ bullet.lastY = bullet.y;
+ }
+ }
+ // Update 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 player
+ if (bullet.intersects(player)) {
+ LK.getSound('playerHit').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ bullet.lastY = bullet.y;
+ }
+ // Check if enemies reached player
+ for (var i = 0; i < enemies.length; i++) {
+ if (enemies[i].intersects(player) || enemies[i].y > 2500) {
+ LK.getSound('playerHit').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Check if wave is complete
+ if (enemies.length === 0) {
+ waveSpawnTimer++;
+ if (waveSpawnTimer > 120) {
+ // 2 second delay between waves
+ waveNumber++;
+ enemiesPerWave = Math.min(20, 12 + waveNumber); // Cap at 20 enemies
+ waveTxt.setText('Wave: ' + waveNumber);
+ spawnWave();
+ waveSpawnTimer = 0;
+ }
+ }
+ // Victory condition - survived 10 waves
+ if (waveNumber > 10 && enemies.length === 0) {
+ LK.showYouWin();
+ }
+};
\ No newline at end of file