User prompt
enemies start shooting after 500 points
User prompt
show powerup countdown on lower right
User prompt
powerup lasts 10 seconds
User prompt
add background
User prompt
my firerate is reduced little bit
User prompt
enemies at begining dont shoot.start shooting slowly after one minute and firerate increases
Code edit (1 edits merged)
Please save this source code
User prompt
Galactic Defender
Initial prompt
a space shooter game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Bullet
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bullet = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 18;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Ship
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var ship = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ship.width;
self.height = ship.height;
self.speed = 4 + Math.random() * 2;
self.shootCooldown = 60 + Math.floor(Math.random() * 60);
self.shootTimer = Math.floor(Math.random() * self.shootCooldown);
self.hp = 1;
self.update = function () {
self.y += self.speed;
if (self.shootTimer > 0) {
self.shootTimer--;
}
};
return self;
});
// Player Bullet
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bullet = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -32;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Ship
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var ship = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ship.width;
self.height = ship.height;
self.canShoot = true;
self.shootCooldown = 18; // frames between shots
self.shootTimer = 0;
self.lives = 1; // For MVP, 1 hit = game over
self.poweredUp = false;
self.powerupTimer = 0;
// Power-up effect
self.setPowerup = function (duration) {
self.poweredUp = true;
self.powerupTimer = duration;
ship.tint = 0x00ff99;
};
self.clearPowerup = function () {
self.poweredUp = false;
self.powerupTimer = 0;
ship.tint = 0xffffff;
};
self.update = function () {
if (self.shootTimer > 0) self.shootTimer--;
if (self.poweredUp) {
self.powerupTimer--;
if (self.powerupTimer <= 0) {
self.clearPowerup();
}
}
};
return self;
});
// Powerup
var Powerup = Container.expand(function () {
var self = Container.call(this);
var p = self.attachAsset('powerup', {
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: 0x000010
});
/****
* Game Code
****/
// Music
// Sounds
// Explosion effect (for flash)
// Power-up
// Enemy bullet
// Enemy ship
// Player bullet
// Spaceship (player)
// Play background music
LK.playMusic('galacticMusic');
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Game variables
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var dragNode = null;
var lastPlayerHit = false;
var spawnTimer = 0;
var powerupSpawnTimer = 0;
// Helper: Clamp value
function clamp(val, min, max) {
return Math.max(min, Math.min(max, val));
}
// Initialize player
player = new PlayerShip();
player.x = 2048 / 2;
player.y = 2732 - 220;
game.addChild(player);
// Move handler (drag player ship)
function handleMove(x, y, obj) {
if (dragNode === player) {
// Clamp player within screen bounds
var halfW = player.width / 2;
var halfH = player.height / 2;
player.x = clamp(x, halfW, 2048 - halfW);
player.y = clamp(y, 2048, 2732 - halfH); // Only allow movement in lower 700px
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch is on player
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (local.x >= -player.width / 2 && local.x <= player.width / 2 && local.y >= -player.height / 2 && local.y <= player.height / 2) {
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Fire player bullet
function firePlayerBullet() {
if (player.shootTimer === 0) {
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - player.height / 2 - 10;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
player.shootTimer = player.poweredUp ? 6 : player.shootCooldown;
// Power-up: triple shot
if (player.poweredUp) {
for (var i = -1; i <= 1; i += 2) {
var b = new PlayerBullet();
b.x = player.x + i * 50;
b.y = player.y - player.height / 2 - 10;
b.rotation = i * 0.18;
b.update = function (angle) {
return function () {
this.y += this.speed * Math.cos(angle);
this.x += this.speed * Math.sin(angle);
};
}(i * 0.18);
playerBullets.push(b);
game.addChild(b);
}
}
}
}
// Spawn enemy
function spawnEnemy() {
var enemy = new EnemyShip();
enemy.x = 180 + Math.random() * (2048 - 360);
enemy.y = -enemy.height / 2 - 10;
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn powerup
function spawnPowerup() {
var p = new Powerup();
p.x = 180 + Math.random() * (2048 - 360);
p.y = -p.height / 2 - 10;
powerups.push(p);
game.addChild(p);
}
// Main update loop
game.update = function () {
// Player update
player.update();
// Player auto-fire
if (LK.ticks % 2 === 0) {
firePlayerBullet();
}
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var b = playerBullets[i];
b.update();
// Remove if off screen
if (b.y < -80) {
b.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
if (b.intersects(e)) {
e.hp--;
if (e.hp <= 0) {
// Explosion effect
LK.effects.flashObject(e, 0xffffff, 200);
LK.getSound('explosion').play();
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(LK.getScore());
e.destroy();
enemies.splice(j, 1);
}
b.destroy();
playerBullets.splice(i, 1);
break;
}
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
e.update();
// Remove if off screen
if (e.y > 2732 + e.height) {
e.destroy();
enemies.splice(i, 1);
continue;
}
// Enemy shooting
if (e.shootTimer === 0) {
var eb = new EnemyBullet();
eb.x = e.x;
eb.y = e.y + e.height / 2 + 10;
enemyBullets.push(eb);
game.addChild(eb);
LK.getSound('enemyShoot').play();
e.shootTimer = e.shootCooldown;
}
// Check collision with player
if (e.intersects(player)) {
if (!lastPlayerHit) {
LK.effects.flashScreen(0xff0000, 800);
LK.getSound('explosion').play();
LK.showGameOver();
lastPlayerHit = true;
}
}
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
eb.update();
if (eb.y > 2732 + 60) {
eb.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (eb.intersects(player)) {
if (!lastPlayerHit) {
LK.effects.flashScreen(0xff0000, 800);
LK.getSound('explosion').play();
LK.showGameOver();
lastPlayerHit = true;
}
}
}
// Update powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
p.update();
if (p.y > 2732 + 60) {
p.destroy();
powerups.splice(i, 1);
continue;
}
// Check collision with player
if (p.intersects(player)) {
player.setPowerup(360); // 6 seconds at 60fps
LK.getSound('powerup').play();
p.destroy();
powerups.splice(i, 1);
}
}
// Enemy spawn logic
spawnTimer--;
if (spawnTimer <= 0) {
spawnEnemy();
spawnTimer = 36 + Math.floor(Math.random() * 24); // spawn every 1s approx
}
// Powerup spawn logic
powerupSpawnTimer--;
if (powerupSpawnTimer <= 0) {
if (Math.random() < 0.18) {
spawnPowerup();
}
powerupSpawnTimer = 360 + Math.floor(Math.random() * 240); // every 6-10s
}
// Reset lastPlayerHit if player is alive
if (!player.destroyed) {
lastPlayerHit = false;
}
};
// Reset game state on game over
LK.on('gameover', function () {
// Clean up all objects
for (var i = 0; i < playerBullets.length; i++) playerBullets[i].destroy();
for (var i = 0; i < enemies.length; i++) enemies[i].destroy();
for (var i = 0; i < enemyBullets.length; i++) enemyBullets[i].destroy();
for (var i = 0; i < powerups.length; i++) powerups[i].destroy();
playerBullets = [];
enemies = [];
enemyBullets = [];
powerups = [];
lastPlayerHit = false;
// Music will be handled by LK
});
// Reset game state on win (not used in MVP, but for future)
LK.on('youwin', function () {
for (var i = 0; i < playerBullets.length; i++) playerBullets[i].destroy();
for (var i = 0; i < enemies.length; i++) enemies[i].destroy();
for (var i = 0; i < enemyBullets.length; i++) enemyBullets[i].destroy();
for (var i = 0; i < powerups.length; i++) powerups[i].destroy();
playerBullets = [];
enemies = [];
enemyBullets = [];
powerups = [];
lastPlayerHit = false;
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,371 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Enemy Bullet
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bullet = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 18;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Enemy Ship
+var EnemyShip = Container.expand(function () {
+ var self = Container.call(this);
+ var ship = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ship.width;
+ self.height = ship.height;
+ self.speed = 4 + Math.random() * 2;
+ self.shootCooldown = 60 + Math.floor(Math.random() * 60);
+ self.shootTimer = Math.floor(Math.random() * self.shootCooldown);
+ self.hp = 1;
+ self.update = function () {
+ self.y += self.speed;
+ if (self.shootTimer > 0) {
+ self.shootTimer--;
+ }
+ };
+ return self;
+});
+// Player Bullet
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bullet = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -32;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Ship
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ var ship = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ship.width;
+ self.height = ship.height;
+ self.canShoot = true;
+ self.shootCooldown = 18; // frames between shots
+ self.shootTimer = 0;
+ self.lives = 1; // For MVP, 1 hit = game over
+ self.poweredUp = false;
+ self.powerupTimer = 0;
+ // Power-up effect
+ self.setPowerup = function (duration) {
+ self.poweredUp = true;
+ self.powerupTimer = duration;
+ ship.tint = 0x00ff99;
+ };
+ self.clearPowerup = function () {
+ self.poweredUp = false;
+ self.powerupTimer = 0;
+ ship.tint = 0xffffff;
+ };
+ self.update = function () {
+ if (self.shootTimer > 0) self.shootTimer--;
+ if (self.poweredUp) {
+ self.powerupTimer--;
+ if (self.powerupTimer <= 0) {
+ self.clearPowerup();
+ }
+ }
+ };
+ return self;
+});
+// Powerup
+var Powerup = Container.expand(function () {
+ var self = Container.call(this);
+ var p = self.attachAsset('powerup', {
+ 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: 0x000000
+ backgroundColor: 0x000010
+});
+
+/****
+* Game Code
+****/
+// Music
+// Sounds
+// Explosion effect (for flash)
+// Power-up
+// Enemy bullet
+// Enemy ship
+// Player bullet
+// Spaceship (player)
+// Play background music
+LK.playMusic('galacticMusic');
+// Score display
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Game variables
+var player;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerups = [];
+var dragNode = null;
+var lastPlayerHit = false;
+var spawnTimer = 0;
+var powerupSpawnTimer = 0;
+// Helper: Clamp value
+function clamp(val, min, max) {
+ return Math.max(min, Math.min(max, val));
+}
+// Initialize player
+player = new PlayerShip();
+player.x = 2048 / 2;
+player.y = 2732 - 220;
+game.addChild(player);
+// Move handler (drag player ship)
+function handleMove(x, y, obj) {
+ if (dragNode === player) {
+ // Clamp player within screen bounds
+ var halfW = player.width / 2;
+ var halfH = player.height / 2;
+ player.x = clamp(x, halfW, 2048 - halfW);
+ player.y = clamp(y, 2048, 2732 - halfH); // Only allow movement in lower 700px
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ // Only start drag if touch is on player
+ var local = player.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ if (local.x >= -player.width / 2 && local.x <= player.width / 2 && local.y >= -player.height / 2 && local.y <= player.height / 2) {
+ dragNode = player;
+ handleMove(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Fire player bullet
+function firePlayerBullet() {
+ if (player.shootTimer === 0) {
+ var bullet = new PlayerBullet();
+ bullet.x = player.x;
+ bullet.y = player.y - player.height / 2 - 10;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ player.shootTimer = player.poweredUp ? 6 : player.shootCooldown;
+ // Power-up: triple shot
+ if (player.poweredUp) {
+ for (var i = -1; i <= 1; i += 2) {
+ var b = new PlayerBullet();
+ b.x = player.x + i * 50;
+ b.y = player.y - player.height / 2 - 10;
+ b.rotation = i * 0.18;
+ b.update = function (angle) {
+ return function () {
+ this.y += this.speed * Math.cos(angle);
+ this.x += this.speed * Math.sin(angle);
+ };
+ }(i * 0.18);
+ playerBullets.push(b);
+ game.addChild(b);
+ }
+ }
+ }
+}
+// Spawn enemy
+function spawnEnemy() {
+ var enemy = new EnemyShip();
+ enemy.x = 180 + Math.random() * (2048 - 360);
+ enemy.y = -enemy.height / 2 - 10;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+// Spawn powerup
+function spawnPowerup() {
+ var p = new Powerup();
+ p.x = 180 + Math.random() * (2048 - 360);
+ p.y = -p.height / 2 - 10;
+ powerups.push(p);
+ game.addChild(p);
+}
+// Main update loop
+game.update = function () {
+ // Player update
+ player.update();
+ // Player auto-fire
+ if (LK.ticks % 2 === 0) {
+ firePlayerBullet();
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var b = playerBullets[i];
+ b.update();
+ // Remove if off screen
+ if (b.y < -80) {
+ b.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var e = enemies[j];
+ if (b.intersects(e)) {
+ e.hp--;
+ if (e.hp <= 0) {
+ // Explosion effect
+ LK.effects.flashObject(e, 0xffffff, 200);
+ LK.getSound('explosion').play();
+ LK.setScore(LK.getScore() + 10);
+ scoreTxt.setText(LK.getScore());
+ e.destroy();
+ enemies.splice(j, 1);
+ }
+ b.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var e = enemies[i];
+ e.update();
+ // Remove if off screen
+ if (e.y > 2732 + e.height) {
+ e.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Enemy shooting
+ if (e.shootTimer === 0) {
+ var eb = new EnemyBullet();
+ eb.x = e.x;
+ eb.y = e.y + e.height / 2 + 10;
+ enemyBullets.push(eb);
+ game.addChild(eb);
+ LK.getSound('enemyShoot').play();
+ e.shootTimer = e.shootCooldown;
+ }
+ // Check collision with player
+ if (e.intersects(player)) {
+ if (!lastPlayerHit) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.getSound('explosion').play();
+ LK.showGameOver();
+ lastPlayerHit = true;
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var eb = enemyBullets[i];
+ eb.update();
+ if (eb.y > 2732 + 60) {
+ eb.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (eb.intersects(player)) {
+ if (!lastPlayerHit) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.getSound('explosion').play();
+ LK.showGameOver();
+ lastPlayerHit = true;
+ }
+ }
+ }
+ // Update powerups
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var p = powerups[i];
+ p.update();
+ if (p.y > 2732 + 60) {
+ p.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (p.intersects(player)) {
+ player.setPowerup(360); // 6 seconds at 60fps
+ LK.getSound('powerup').play();
+ p.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ // Enemy spawn logic
+ spawnTimer--;
+ if (spawnTimer <= 0) {
+ spawnEnemy();
+ spawnTimer = 36 + Math.floor(Math.random() * 24); // spawn every 1s approx
+ }
+ // Powerup spawn logic
+ powerupSpawnTimer--;
+ if (powerupSpawnTimer <= 0) {
+ if (Math.random() < 0.18) {
+ spawnPowerup();
+ }
+ powerupSpawnTimer = 360 + Math.floor(Math.random() * 240); // every 6-10s
+ }
+ // Reset lastPlayerHit if player is alive
+ if (!player.destroyed) {
+ lastPlayerHit = false;
+ }
+};
+// Reset game state on game over
+LK.on('gameover', function () {
+ // Clean up all objects
+ for (var i = 0; i < playerBullets.length; i++) playerBullets[i].destroy();
+ for (var i = 0; i < enemies.length; i++) enemies[i].destroy();
+ for (var i = 0; i < enemyBullets.length; i++) enemyBullets[i].destroy();
+ for (var i = 0; i < powerups.length; i++) powerups[i].destroy();
+ playerBullets = [];
+ enemies = [];
+ enemyBullets = [];
+ powerups = [];
+ lastPlayerHit = false;
+ // Music will be handled by LK
+});
+// Reset game state on win (not used in MVP, but for future)
+LK.on('youwin', function () {
+ for (var i = 0; i < playerBullets.length; i++) playerBullets[i].destroy();
+ for (var i = 0; i < enemies.length; i++) enemies[i].destroy();
+ for (var i = 0; i < enemyBullets.length; i++) enemyBullets[i].destroy();
+ for (var i = 0; i < powerups.length; i++) powerups[i].destroy();
+ playerBullets = [];
+ enemies = [];
+ enemyBullets = [];
+ powerups = [];
+ lastPlayerHit = false;
});
\ No newline at end of file
spaceship seen from above. In-Game asset. 2d. High contrast. No shadows
spaceship seen from up going down. In-Game asset. 2d. High contrast. No shadows
color blue
red laser beam. In-Game asset. 2d. High contrast. No shadows
color green
explosion. In-Game asset. 2d. High contrast. No shadows
starfield banner
make box yellow