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