Code edit (1 edits merged)
Please save this source code
User prompt
Space Defender
Initial prompt
Build a simple retro-style space shooter called 'Space Defender'. The player controls a spaceship at the bottom of the screen and shoots upwards. Enemy ships appear from the top and move down. Each destroyed enemy gives points. If an enemy touches the player, the game is over.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
};
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
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create player ship
var player = game.addChild(new PlayerShip());
player.x = 2048 / 2;
player.y = 2732 - 150;
// Game arrays
var bullets = [];
var enemies = [];
// Game variables
var lastShootTime = 0;
var shootInterval = 10; // Shoot every 10 ticks (6 times per second)
var enemySpawnTimer = 0;
var enemySpawnInterval = 60; // Spawn enemy every 60 ticks (1 per second)
// Touch/drag handling
var isDragging = false;
game.down = function (x, y, obj) {
isDragging = true;
player.x = Math.max(40, Math.min(2048 - 40, x));
};
game.move = function (x, y, obj) {
if (isDragging) {
player.x = Math.max(40, Math.min(2048 - 40, x));
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Main game update loop
game.update = function () {
// Auto-shoot bullets
if (LK.ticks - lastShootTime >= shootInterval) {
var newBullet = new PlayerBullet();
newBullet.x = player.x;
newBullet.y = player.y - 50;
newBullet.lastY = newBullet.y;
bullets.push(newBullet);
game.addChild(newBullet);
lastShootTime = LK.ticks;
LK.getSound('shoot').play();
}
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnInterval) {
var newEnemy = new EnemyShip();
newEnemy.x = Math.random() * (2048 - 100) + 50;
newEnemy.y = -30;
newEnemy.lastY = newEnemy.y;
newEnemy.lastPlayerIntersecting = false;
enemies.push(newEnemy);
game.addChild(newEnemy);
enemySpawnTimer = 0;
}
// Update and check bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
// Remove bullets that go off screen
if (bullet.lastY >= -25 && bullet.y < -25) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
// Check bullet-enemy collisions
var bulletHitEnemy = false;
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (bullet.intersects(enemy)) {
// Enemy destroyed
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Create explosion effect
tween(enemy, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
// Enemy cleanup is handled below
}
});
LK.getSound('enemyDestroyed').play();
// Remove enemy
enemy.destroy();
enemies.splice(e, 1);
// Remove bullet
bullet.destroy();
bullets.splice(b, 1);
bulletHitEnemy = true;
break;
}
}
if (!bulletHitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
// Remove enemies that go off screen
if (enemy.lastY <= 2732 + 50 && enemy.y > 2732 + 50) {
enemy.destroy();
enemies.splice(e, 1);
continue;
}
// Check enemy-player collision
var currentPlayerIntersecting = enemy.intersects(player);
if (!enemy.lastPlayerIntersecting && currentPlayerIntersecting) {
// Game Over
LK.getSound('gameOver').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
enemy.lastY = enemy.y;
enemy.lastPlayerIntersecting = currentPlayerIntersecting;
}
// Increase difficulty over time
if (LK.getScore() > 0 && LK.getScore() % 100 === 0 && enemySpawnInterval > 20) {
enemySpawnInterval = Math.max(20, enemySpawnInterval - 1);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,178 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var EnemyShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ 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
+ });
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000033
+});
+
+/****
+* Game Code
+****/
+// Create score display
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Create player ship
+var player = game.addChild(new PlayerShip());
+player.x = 2048 / 2;
+player.y = 2732 - 150;
+// Game arrays
+var bullets = [];
+var enemies = [];
+// Game variables
+var lastShootTime = 0;
+var shootInterval = 10; // Shoot every 10 ticks (6 times per second)
+var enemySpawnTimer = 0;
+var enemySpawnInterval = 60; // Spawn enemy every 60 ticks (1 per second)
+// Touch/drag handling
+var isDragging = false;
+game.down = function (x, y, obj) {
+ isDragging = true;
+ player.x = Math.max(40, Math.min(2048 - 40, x));
+};
+game.move = function (x, y, obj) {
+ if (isDragging) {
+ player.x = Math.max(40, Math.min(2048 - 40, x));
+ }
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Main game update loop
+game.update = function () {
+ // Auto-shoot bullets
+ if (LK.ticks - lastShootTime >= shootInterval) {
+ var newBullet = new PlayerBullet();
+ newBullet.x = player.x;
+ newBullet.y = player.y - 50;
+ newBullet.lastY = newBullet.y;
+ bullets.push(newBullet);
+ game.addChild(newBullet);
+ lastShootTime = LK.ticks;
+ LK.getSound('shoot').play();
+ }
+ // Spawn enemies
+ enemySpawnTimer++;
+ if (enemySpawnTimer >= enemySpawnInterval) {
+ var newEnemy = new EnemyShip();
+ newEnemy.x = Math.random() * (2048 - 100) + 50;
+ newEnemy.y = -30;
+ newEnemy.lastY = newEnemy.y;
+ newEnemy.lastPlayerIntersecting = false;
+ enemies.push(newEnemy);
+ game.addChild(newEnemy);
+ enemySpawnTimer = 0;
+ }
+ // Update and check bullets
+ for (var b = bullets.length - 1; b >= 0; b--) {
+ var bullet = bullets[b];
+ // Remove bullets that go off screen
+ if (bullet.lastY >= -25 && bullet.y < -25) {
+ bullet.destroy();
+ bullets.splice(b, 1);
+ continue;
+ }
+ // Check bullet-enemy collisions
+ var bulletHitEnemy = false;
+ for (var e = enemies.length - 1; e >= 0; e--) {
+ var enemy = enemies[e];
+ if (bullet.intersects(enemy)) {
+ // Enemy destroyed
+ LK.setScore(LK.getScore() + 10);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Create explosion effect
+ tween(enemy, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ // Enemy cleanup is handled below
+ }
+ });
+ LK.getSound('enemyDestroyed').play();
+ // Remove enemy
+ enemy.destroy();
+ enemies.splice(e, 1);
+ // Remove bullet
+ bullet.destroy();
+ bullets.splice(b, 1);
+ bulletHitEnemy = true;
+ break;
+ }
+ }
+ if (!bulletHitEnemy) {
+ bullet.lastY = bullet.y;
+ }
+ }
+ // Update and check enemies
+ for (var e = enemies.length - 1; e >= 0; e--) {
+ var enemy = enemies[e];
+ // Remove enemies that go off screen
+ if (enemy.lastY <= 2732 + 50 && enemy.y > 2732 + 50) {
+ enemy.destroy();
+ enemies.splice(e, 1);
+ continue;
+ }
+ // Check enemy-player collision
+ var currentPlayerIntersecting = enemy.intersects(player);
+ if (!enemy.lastPlayerIntersecting && currentPlayerIntersecting) {
+ // Game Over
+ LK.getSound('gameOver').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ enemy.lastY = enemy.y;
+ enemy.lastPlayerIntersecting = currentPlayerIntersecting;
+ }
+ // Increase difficulty over time
+ if (LK.getScore() > 0 && LK.getScore() % 100 === 0 && enemySpawnInterval > 20) {
+ enemySpawnInterval = Math.max(20, enemySpawnInterval - 1);
+ }
+};
\ No newline at end of file