User prompt
add view leaderboard a leaderboard and name creation ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
different warriors with different stats and different ship types neither of those have a change for what anything looks like there is a warrior selection battle and ship type selection menu ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
gun type selection menu back button
User prompt
tutorial gun types not seen but effects speed and damage and finally enemies can have varied health numbers and guns ↪💡 Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var clickPos = self.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 182
User prompt
levels, home screen , and story mode ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Space Defender
Initial prompt
shooting game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.hp = 10;
self.shootTimer = 0;
self.shootInterval = 30;
self.moveDirection = 1;
self.update = function () {
self.y += self.speed;
self.x += self.moveDirection * 2;
if (self.x <= 100 || self.x >= 1948) {
self.moveDirection *= -1;
}
self.shootTimer++;
if (self.shootTimer >= self.shootInterval) {
self.shootTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 60;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.hp = 1;
self.shootTimer = 0;
self.shootInterval = 120;
self.update = function () {
self.y += self.speed;
self.shootTimer++;
if (self.shootTimer >= self.shootInterval && Math.random() < 0.01) {
self.shootTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 3;
self.shootTimer = 0;
self.shootInterval = 15;
self.powerUpTimer = 0;
self.rapidFire = false;
self.update = function () {
self.shootTimer++;
var currentShootInterval = self.rapidFire ? 5 : self.shootInterval;
if (self.shootTimer >= currentShootInterval) {
self.shootTimer = 0;
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 40;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
if (self.rapidFire) {
self.powerUpTimer--;
if (self.powerUpTimer <= 0) {
self.rapidFire = false;
}
}
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.type = 'rapidFire'; // rapidFire, shield
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
// Game variables
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var bosses = [];
var enemySpawnTimer = 0;
var enemySpawnInterval = 60;
var powerUpSpawnTimer = 0;
var bossSpawnScore = 500;
var nextBossScore = bossSpawnScore;
var dragNode = null;
var waveLevel = 1;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 120;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var hpTxt = new Text2('HP: 3', {
size: 60,
fill: 0xFF0000
});
hpTxt.anchor.set(1, 0);
hpTxt.x = -50;
hpTxt.y = 50;
LK.gui.topRight.addChild(hpTxt);
// Initialize player
player = new Player();
player.x = 1024;
player.y = 2400;
game.addChild(player);
// Event handlers
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(100, Math.min(2632, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
// Update score display
scoreTxt.setText('Score: ' + LK.getScore());
hpTxt.setText('HP: ' + player.hp);
// Spawn enemies
enemySpawnTimer++;
var currentSpawnInterval = Math.max(20, enemySpawnInterval - Math.floor(LK.getScore() / 100) * 5);
if (enemySpawnTimer >= currentSpawnInterval) {
enemySpawnTimer = 0;
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemy.speed = 2 + Math.floor(LK.getScore() / 200);
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn power-ups occasionally
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 900 && Math.random() < 0.02) {
powerUpSpawnTimer = 0;
var powerUp = new PowerUp();
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -50;
powerUps.push(powerUp);
game.addChild(powerUp);
}
// Spawn boss at score milestones
if (LK.getScore() >= nextBossScore && bosses.length === 0) {
var boss = new Boss();
boss.x = 1024;
boss.y = -100;
bosses.push(boss);
game.addChild(boss);
nextBossScore += bossSpawnScore;
}
// Handle 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])) {
enemies[j].hp--;
if (enemies[j].hp <= 0) {
LK.setScore(LK.getScore() + 10);
LK.getSound('enemyHit').play();
enemies[j].destroy();
enemies.splice(j, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (hitEnemy) continue;
// Check collision with bosses
for (var k = bosses.length - 1; k >= 0; k--) {
if (bullet.intersects(bosses[k])) {
bosses[k].hp--;
if (bosses[k].hp <= 0) {
LK.setScore(LK.getScore() + 100);
LK.getSound('enemyHit').play();
bosses[k].destroy();
bosses.splice(k, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
bullet.lastY = bullet.y;
}
// Handle 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)) {
player.hp--;
LK.getSound('playerHit').play();
LK.effects.flashObject(player, 0xff0000, 500);
if (player.hp <= 0) {
LK.showGameOver();
return;
}
bullet.destroy();
enemyBullets.splice(i, 1);
}
bullet.lastY = bullet.y;
}
// Handle enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
// Remove enemies that go off screen
if (enemy.lastY <= 2782 && enemy.y > 2782) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
player.hp--;
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 1000);
if (player.hp <= 0) {
LK.showGameOver();
return;
}
enemy.destroy();
enemies.splice(i, 1);
}
enemy.lastY = enemy.y;
}
// Handle bosses
for (var i = bosses.length - 1; i >= 0; i--) {
var boss = bosses[i];
if (boss.lastY === undefined) boss.lastY = boss.y;
// Remove bosses that go off screen
if (boss.lastY <= 2782 && boss.y > 2782) {
boss.destroy();
bosses.splice(i, 1);
continue;
}
// Check collision with player
if (boss.intersects(player)) {
player.hp--;
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 1000);
if (player.hp <= 0) {
LK.showGameOver();
return;
}
}
boss.lastY = boss.y;
}
// Handle power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
// Remove power-ups that go off screen
if (powerUp.lastY <= 2782 && powerUp.y > 2782) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check collision with player
if (powerUp.intersects(player)) {
LK.getSound('powerUpSound').play();
if (powerUp.type === 'rapidFire') {
player.rapidFire = true;
player.powerUpTimer = 600; // 10 seconds at 60fps
}
powerUp.destroy();
powerUps.splice(i, 1);
}
powerUp.lastY = powerUp.y;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,367 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Boss = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 1;
+ self.hp = 10;
+ self.shootTimer = 0;
+ self.shootInterval = 30;
+ self.moveDirection = 1;
+ self.update = function () {
+ self.y += self.speed;
+ self.x += self.moveDirection * 2;
+ if (self.x <= 100 || self.x >= 1948) {
+ self.moveDirection *= -1;
+ }
+ self.shootTimer++;
+ if (self.shootTimer >= self.shootInterval) {
+ self.shootTimer = 0;
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 60;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.hp = 1;
+ self.shootTimer = 0;
+ self.shootInterval = 120;
+ self.update = function () {
+ self.y += self.speed;
+ self.shootTimer++;
+ if (self.shootTimer >= self.shootInterval && Math.random() < 0.01) {
+ self.shootTimer = 0;
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 30;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.hp = 3;
+ self.shootTimer = 0;
+ self.shootInterval = 15;
+ self.powerUpTimer = 0;
+ self.rapidFire = false;
+ self.update = function () {
+ self.shootTimer++;
+ var currentShootInterval = self.rapidFire ? 5 : self.shootInterval;
+ if (self.shootTimer >= currentShootInterval) {
+ self.shootTimer = 0;
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 40;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ }
+ if (self.rapidFire) {
+ self.powerUpTimer--;
+ if (self.powerUpTimer <= 0) {
+ self.rapidFire = false;
+ }
+ }
+ };
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -12;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.type = 'rapidFire'; // rapidFire, shield
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.1;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000033
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerUps = [];
+var bosses = [];
+var enemySpawnTimer = 0;
+var enemySpawnInterval = 60;
+var powerUpSpawnTimer = 0;
+var bossSpawnScore = 500;
+var nextBossScore = bossSpawnScore;
+var dragNode = null;
+var waveLevel = 1;
+// UI Elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+scoreTxt.x = 120;
+scoreTxt.y = 50;
+LK.gui.topLeft.addChild(scoreTxt);
+var hpTxt = new Text2('HP: 3', {
+ size: 60,
+ fill: 0xFF0000
+});
+hpTxt.anchor.set(1, 0);
+hpTxt.x = -50;
+hpTxt.y = 50;
+LK.gui.topRight.addChild(hpTxt);
+// Initialize player
+player = new Player();
+player.x = 1024;
+player.y = 2400;
+game.addChild(player);
+// Event handlers
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = Math.max(40, Math.min(2008, x));
+ dragNode.y = Math.max(100, Math.min(2632, y));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = player;
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main game loop
+game.update = function () {
+ // Update score display
+ scoreTxt.setText('Score: ' + LK.getScore());
+ hpTxt.setText('HP: ' + player.hp);
+ // Spawn enemies
+ enemySpawnTimer++;
+ var currentSpawnInterval = Math.max(20, enemySpawnInterval - Math.floor(LK.getScore() / 100) * 5);
+ if (enemySpawnTimer >= currentSpawnInterval) {
+ enemySpawnTimer = 0;
+ var enemy = new Enemy();
+ enemy.x = Math.random() * 1800 + 124;
+ enemy.y = -50;
+ enemy.speed = 2 + Math.floor(LK.getScore() / 200);
+ enemies.push(enemy);
+ game.addChild(enemy);
+ }
+ // Spawn power-ups occasionally
+ powerUpSpawnTimer++;
+ if (powerUpSpawnTimer >= 900 && Math.random() < 0.02) {
+ powerUpSpawnTimer = 0;
+ var powerUp = new PowerUp();
+ powerUp.x = Math.random() * 1800 + 124;
+ powerUp.y = -50;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+ }
+ // Spawn boss at score milestones
+ if (LK.getScore() >= nextBossScore && bosses.length === 0) {
+ var boss = new Boss();
+ boss.x = 1024;
+ boss.y = -100;
+ bosses.push(boss);
+ game.addChild(boss);
+ nextBossScore += bossSpawnScore;
+ }
+ // Handle 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])) {
+ enemies[j].hp--;
+ if (enemies[j].hp <= 0) {
+ LK.setScore(LK.getScore() + 10);
+ LK.getSound('enemyHit').play();
+ enemies[j].destroy();
+ enemies.splice(j, 1);
+ }
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ hitEnemy = true;
+ break;
+ }
+ }
+ if (hitEnemy) continue;
+ // Check collision with bosses
+ for (var k = bosses.length - 1; k >= 0; k--) {
+ if (bullet.intersects(bosses[k])) {
+ bosses[k].hp--;
+ if (bosses[k].hp <= 0) {
+ LK.setScore(LK.getScore() + 100);
+ LK.getSound('enemyHit').play();
+ bosses[k].destroy();
+ bosses.splice(k, 1);
+ }
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ bullet.lastY = bullet.y;
+ }
+ // Handle 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)) {
+ player.hp--;
+ LK.getSound('playerHit').play();
+ LK.effects.flashObject(player, 0xff0000, 500);
+ if (player.hp <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ }
+ bullet.lastY = bullet.y;
+ }
+ // Handle enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.lastY === undefined) enemy.lastY = enemy.y;
+ // Remove enemies that go off screen
+ if (enemy.lastY <= 2782 && enemy.y > 2782) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (enemy.intersects(player)) {
+ player.hp--;
+ LK.getSound('playerHit').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ if (player.hp <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ enemy.lastY = enemy.y;
+ }
+ // Handle bosses
+ for (var i = bosses.length - 1; i >= 0; i--) {
+ var boss = bosses[i];
+ if (boss.lastY === undefined) boss.lastY = boss.y;
+ // Remove bosses that go off screen
+ if (boss.lastY <= 2782 && boss.y > 2782) {
+ boss.destroy();
+ bosses.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (boss.intersects(player)) {
+ player.hp--;
+ LK.getSound('playerHit').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ if (player.hp <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ }
+ boss.lastY = boss.y;
+ }
+ // Handle power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
+ // Remove power-ups that go off screen
+ if (powerUp.lastY <= 2782 && powerUp.y > 2782) {
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (powerUp.intersects(player)) {
+ LK.getSound('powerUpSound').play();
+ if (powerUp.type === 'rapidFire') {
+ player.rapidFire = true;
+ player.powerUpTimer = 600; // 10 seconds at 60fps
+ }
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ }
+ powerUp.lastY = powerUp.y;
+ }
+};
\ No newline at end of file