User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 470
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 470
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 470
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 470
User prompt
Now it is way too slow. Make it speed up when far away from the mouse, and slow down when near the mouse. It should be fast enough for the player to make quick escapes. The fatrther the mouse, the more the ship speed.
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 458 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 458
User prompt
No make it still move slowly while dragging but slower than before, but keep the delay instantaneous for the ship.
User prompt
The takes time to start moving, make that instantaneous.
User prompt
Make it even slower, and also if the ship is not where the mouse is at any time and the mouse is down, the ship immediately tries to stay on top of the mouse always.
User prompt
It still moves very fast, make it move much slower.
User prompt
Make it so that when the mouse is clicked/screen is touched in a specific spot, the Player's Ship moves towards the mouse instead of teleporting to it. This movement should have realistic physics. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Cosmic Defender: Space Assault
Initial prompt
Lets make a 2d Top down shooter game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Enemy properties
self.health = 1;
self.speed = 2;
self.scoreValue = 100;
self.fireRate = 120; // Ticks between shots
self.lastShot = Math.floor(Math.random() * 60); // Randomize initial shot timer
self.movementPattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: circular
self.movementCounter = 0;
self.update = function () {
// Basic downward movement
self.y += self.speed;
// Apply movement pattern
if (self.movementPattern === 1) {
// Zigzag
self.x += Math.sin(self.movementCounter * 0.05) * 3;
self.movementCounter++;
} else if (self.movementPattern === 2) {
// Circular
self.x += Math.sin(self.movementCounter * 0.03) * 4;
self.movementCounter++;
}
};
// Take damage and check if destroyed
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
return true; // Enemy is destroyed
}
return false;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 7; // Moving downward
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 = -15; // Moving upward
self.power = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
// Visual representation
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
// Shield visual (initially invisible)
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Player properties
self.speed = 10;
self.fireRate = 20; // Ticks between shots
self.lastShot = 0;
self.shieldActive = false;
self.powerUpActive = false;
// Shield activation
self.activateShield = function () {
self.shieldActive = true;
shieldGraphics.alpha = 0.5;
// Shield times out after 5 seconds
LK.setTimeout(function () {
self.shieldActive = false;
shieldGraphics.alpha = 0;
}, 5000);
};
// Power-up activation
self.activatePowerUp = function () {
self.powerUpActive = true;
shipGraphics.tint = 0xf1c40f; // Yellow tint for power-up
self.fireRate = 10; // Faster firing
// Power-up times out after 7 seconds
LK.setTimeout(function () {
self.powerUpActive = false;
shipGraphics.tint = 0xFFFFFF;
self.fireRate = 20;
}, 7000);
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.type = Math.random() > 0.5 ? 'shield' : 'weapon'; // Randomly choose power-up type
// Set color based on type
if (self.type === 'shield') {
powerUpGraphics.tint = 0x3498db; // Blue for shield
} else {
powerUpGraphics.tint = 0xf1c40f; // Yellow for weapon
}
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var SPAWN_ENEMY_INTERVAL = 60; // Spawn enemy every 60 ticks initially
var SPAWN_POWERUP_INTERVAL = 600; // Spawn power-up every 600 ticks
var MIN_SPAWN_INTERVAL = 20; // Minimum spawn rate as difficulty increases
// Game state variables
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var gameLevel = 1;
var spawnCounter = 0;
var powerUpCounter = 0;
var isGameActive = true;
var score = 0;
// Initialize score display
var scoreTxt = new Text2('SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 30;
// Initialize level display
var levelTxt = new Text2('LEVEL: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
levelTxt.y = 100;
// Create player ship
function initializeGame() {
player = new PlayerShip();
player.x = GAME_WIDTH / 2;
player.y = GAME_HEIGHT - 200;
game.addChild(player);
// Reset arrays
playerBullets = [];
enemies = [];
enemyBullets = [];
powerUps = [];
// Reset game state
gameLevel = 1;
spawnCounter = 0;
powerUpCounter = 0;
isGameActive = true;
// Reset score and update display
LK.setScore(0);
score = 0;
updateScoreDisplay();
updateLevelDisplay();
// Play background music
LK.playMusic('gameMusic');
}
// Initialize the game
initializeGame();
// Update score display
function updateScoreDisplay() {
scoreTxt.setText('SCORE: ' + score);
}
// Update level display
function updateLevelDisplay() {
levelTxt.setText('LEVEL: ' + gameLevel);
}
// Player shooting
function playerShoot() {
// Check fire rate cooldown
if (LK.ticks - player.lastShot < player.fireRate) {
return;
}
// Create new bullet
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
game.addChild(bullet);
playerBullets.push(bullet);
// Double bullets if power-up is active
if (player.powerUpActive) {
var bullet2 = new PlayerBullet();
bullet2.x = player.x - 20;
bullet2.y = player.y - 30;
game.addChild(bullet2);
playerBullets.push(bullet2);
var bullet3 = new PlayerBullet();
bullet3.x = player.x + 20;
bullet3.y = player.y - 30;
game.addChild(bullet3);
playerBullets.push(bullet3);
}
// Play sound and reset shot timer
LK.getSound('playerShoot').play();
player.lastShot = LK.ticks;
}
// Enemy shooting
function enemyShoot(enemy) {
if (LK.ticks - enemy.lastShot < enemy.fireRate) {
return;
}
var bullet = new EnemyBullet();
bullet.x = enemy.x;
bullet.y = enemy.y + 40;
game.addChild(bullet);
enemyBullets.push(bullet);
LK.getSound('enemyShoot').play();
enemy.lastShot = LK.ticks;
}
// Spawn new enemy
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * (GAME_WIDTH - 100) + 50;
enemy.y = -50;
// Increase difficulty with levels
if (gameLevel > 1) {
enemy.speed = Math.min(2 + gameLevel * 0.5, 6);
enemy.health = Math.min(1 + Math.floor(gameLevel / 3), 3);
}
if (gameLevel > 5) {
enemy.fireRate = Math.max(120 - gameLevel * 5, 60);
}
game.addChild(enemy);
enemies.push(enemy);
}
// Spawn power-up
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = Math.random() * (GAME_WIDTH - 100) + 50;
powerUp.y = -50;
game.addChild(powerUp);
powerUps.push(powerUp);
}
// Check level progress
function checkLevelProgress() {
// Advance level based on score
var shouldAdvanceLevel = Math.floor(score / 1000) + 1;
if (shouldAdvanceLevel > gameLevel) {
gameLevel = shouldAdvanceLevel;
updateLevelDisplay();
// Flash screen to indicate level up
LK.effects.flashScreen(0x3498db, 500);
}
}
// Handle collisions
function handleCollisions() {
// Check player bullets hitting enemies
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Enemy takes damage
if (enemy.takeDamage(bullet.power)) {
// Enemy destroyed
score += enemy.scoreValue;
LK.setScore(score);
updateScoreDisplay();
LK.getSound('explosion').play();
LK.effects.flashObject(enemy, 0xff0000, 300);
// Remove enemy
enemy.destroy();
enemies.splice(j, 1);
}
// Remove bullet
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
}
// Check enemy bullets hitting player
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.intersects(player) && !player.shieldActive) {
// Player hit
bullet.destroy();
enemyBullets.splice(i, 1);
// Game over
LK.effects.flashScreen(0xff0000, 1000);
isGameActive = false;
LK.showGameOver();
break;
}
}
// Check enemies colliding with player
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.intersects(player)) {
if (!player.shieldActive) {
// Player dies on collision
LK.effects.flashScreen(0xff0000, 1000);
isGameActive = false;
LK.showGameOver();
break;
} else {
// Shield absorbs the hit
enemy.destroy();
enemies.splice(i, 1);
// Shield gets depleted
player.shieldActive = false;
var shield = player.getChildAt(1);
shield.alpha = 0;
score += enemy.scoreValue;
LK.setScore(score);
updateScoreDisplay();
}
}
}
// Check player collecting power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.intersects(player)) {
LK.getSound('powerUp').play();
// Apply power-up effect
if (powerUp.type === 'shield') {
player.activateShield();
} else {
player.activatePowerUp();
}
// Remove power-up
powerUp.destroy();
powerUps.splice(i, 1);
}
}
}
// Clean up off-screen objects
function cleanupOffscreenObjects() {
// Clean up bullets that went off screen
for (var i = playerBullets.length - 1; i >= 0; i--) {
if (playerBullets[i].y < -50) {
playerBullets[i].destroy();
playerBullets.splice(i, 1);
}
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
if (enemyBullets[i].y > GAME_HEIGHT + 50) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
}
// Clean up enemies that went off screen
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i].y > GAME_HEIGHT + 100) {
enemies[i].destroy();
enemies.splice(i, 1);
}
}
// Clean up power-ups that went off screen
for (var i = powerUps.length - 1; i >= 0; i--) {
if (powerUps[i].y > GAME_HEIGHT + 50) {
powerUps[i].destroy();
powerUps.splice(i, 1);
}
}
}
// Player movement
var isDragging = false;
game.down = function (x, y) {
isDragging = true;
player.x = x;
player.y = y;
// Also shoot when player taps
playerShoot();
};
game.move = function (x, y) {
if (isDragging && isGameActive) {
player.x = x;
player.y = y;
// Keep player within game bounds
if (player.x < 50) {
player.x = 50;
}
if (player.x > GAME_WIDTH - 50) {
player.x = GAME_WIDTH - 50;
}
if (player.y < 50) {
player.y = 50;
}
if (player.y > GAME_HEIGHT - 50) {
player.y = GAME_HEIGHT - 50;
}
}
};
game.up = function () {
isDragging = false;
};
// Main game update loop
game.update = function () {
if (!isGameActive) {
return;
}
// Spawn enemies
spawnCounter++;
var currentSpawnRate = Math.max(SPAWN_ENEMY_INTERVAL - gameLevel * 5, MIN_SPAWN_INTERVAL);
if (spawnCounter >= currentSpawnRate) {
spawnEnemy();
spawnCounter = 0;
}
// Spawn power-ups
powerUpCounter++;
if (powerUpCounter >= SPAWN_POWERUP_INTERVAL) {
spawnPowerUp();
powerUpCounter = 0;
}
// Make player shoot if dragging
if (isDragging) {
playerShoot();
}
// Update enemy shooting
for (var i = 0; i < enemies.length; i++) {
enemyShoot(enemies[i]);
}
// Check collisions
handleCollisions();
// Clean up off-screen objects
cleanupOffscreenObjects();
// Check level progression
checkLevelProgress();
// Win condition check
if (score >= 10000) {
LK.showYouWin();
isGameActive = false;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,469 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Enemy properties
+ self.health = 1;
+ self.speed = 2;
+ self.scoreValue = 100;
+ self.fireRate = 120; // Ticks between shots
+ self.lastShot = Math.floor(Math.random() * 60); // Randomize initial shot timer
+ self.movementPattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: circular
+ self.movementCounter = 0;
+ self.update = function () {
+ // Basic downward movement
+ self.y += self.speed;
+ // Apply movement pattern
+ if (self.movementPattern === 1) {
+ // Zigzag
+ self.x += Math.sin(self.movementCounter * 0.05) * 3;
+ self.movementCounter++;
+ } else if (self.movementPattern === 2) {
+ // Circular
+ self.x += Math.sin(self.movementCounter * 0.03) * 4;
+ self.movementCounter++;
+ }
+ };
+ // Take damage and check if destroyed
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ if (self.health <= 0) {
+ return true; // Enemy is destroyed
+ }
+ return false;
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 7; // Moving downward
+ 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 = -15; // Moving upward
+ self.power = 1;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ // Visual representation
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Shield visual (initially invisible)
+ var shieldGraphics = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ // Player properties
+ self.speed = 10;
+ self.fireRate = 20; // Ticks between shots
+ self.lastShot = 0;
+ self.shieldActive = false;
+ self.powerUpActive = false;
+ // Shield activation
+ self.activateShield = function () {
+ self.shieldActive = true;
+ shieldGraphics.alpha = 0.5;
+ // Shield times out after 5 seconds
+ LK.setTimeout(function () {
+ self.shieldActive = false;
+ shieldGraphics.alpha = 0;
+ }, 5000);
+ };
+ // Power-up activation
+ self.activatePowerUp = function () {
+ self.powerUpActive = true;
+ shipGraphics.tint = 0xf1c40f; // Yellow tint for power-up
+ self.fireRate = 10; // Faster firing
+ // Power-up times out after 7 seconds
+ LK.setTimeout(function () {
+ self.powerUpActive = false;
+ shipGraphics.tint = 0xFFFFFF;
+ self.fireRate = 20;
+ }, 7000);
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.type = Math.random() > 0.5 ? 'shield' : 'weapon'; // Randomly choose power-up type
+ // Set color based on type
+ if (self.type === 'shield') {
+ powerUpGraphics.tint = 0x3498db; // Blue for shield
+ } else {
+ powerUpGraphics.tint = 0xf1c40f; // Yellow for weapon
+ }
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Game constants
+var GAME_WIDTH = 2048;
+var GAME_HEIGHT = 2732;
+var SPAWN_ENEMY_INTERVAL = 60; // Spawn enemy every 60 ticks initially
+var SPAWN_POWERUP_INTERVAL = 600; // Spawn power-up every 600 ticks
+var MIN_SPAWN_INTERVAL = 20; // Minimum spawn rate as difficulty increases
+// Game state variables
+var player;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerUps = [];
+var gameLevel = 1;
+var spawnCounter = 0;
+var powerUpCounter = 0;
+var isGameActive = true;
+var score = 0;
+// Initialize score display
+var scoreTxt = new Text2('SCORE: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+scoreTxt.y = 30;
+// Initialize level display
+var levelTxt = new Text2('LEVEL: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelTxt);
+levelTxt.y = 100;
+// Create player ship
+function initializeGame() {
+ player = new PlayerShip();
+ player.x = GAME_WIDTH / 2;
+ player.y = GAME_HEIGHT - 200;
+ game.addChild(player);
+ // Reset arrays
+ playerBullets = [];
+ enemies = [];
+ enemyBullets = [];
+ powerUps = [];
+ // Reset game state
+ gameLevel = 1;
+ spawnCounter = 0;
+ powerUpCounter = 0;
+ isGameActive = true;
+ // Reset score and update display
+ LK.setScore(0);
+ score = 0;
+ updateScoreDisplay();
+ updateLevelDisplay();
+ // Play background music
+ LK.playMusic('gameMusic');
+}
+// Initialize the game
+initializeGame();
+// Update score display
+function updateScoreDisplay() {
+ scoreTxt.setText('SCORE: ' + score);
+}
+// Update level display
+function updateLevelDisplay() {
+ levelTxt.setText('LEVEL: ' + gameLevel);
+}
+// Player shooting
+function playerShoot() {
+ // Check fire rate cooldown
+ if (LK.ticks - player.lastShot < player.fireRate) {
+ return;
+ }
+ // Create new bullet
+ var bullet = new PlayerBullet();
+ bullet.x = player.x;
+ bullet.y = player.y - 40;
+ game.addChild(bullet);
+ playerBullets.push(bullet);
+ // Double bullets if power-up is active
+ if (player.powerUpActive) {
+ var bullet2 = new PlayerBullet();
+ bullet2.x = player.x - 20;
+ bullet2.y = player.y - 30;
+ game.addChild(bullet2);
+ playerBullets.push(bullet2);
+ var bullet3 = new PlayerBullet();
+ bullet3.x = player.x + 20;
+ bullet3.y = player.y - 30;
+ game.addChild(bullet3);
+ playerBullets.push(bullet3);
+ }
+ // Play sound and reset shot timer
+ LK.getSound('playerShoot').play();
+ player.lastShot = LK.ticks;
+}
+// Enemy shooting
+function enemyShoot(enemy) {
+ if (LK.ticks - enemy.lastShot < enemy.fireRate) {
+ return;
+ }
+ var bullet = new EnemyBullet();
+ bullet.x = enemy.x;
+ bullet.y = enemy.y + 40;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ LK.getSound('enemyShoot').play();
+ enemy.lastShot = LK.ticks;
+}
+// Spawn new enemy
+function spawnEnemy() {
+ var enemy = new Enemy();
+ enemy.x = Math.random() * (GAME_WIDTH - 100) + 50;
+ enemy.y = -50;
+ // Increase difficulty with levels
+ if (gameLevel > 1) {
+ enemy.speed = Math.min(2 + gameLevel * 0.5, 6);
+ enemy.health = Math.min(1 + Math.floor(gameLevel / 3), 3);
+ }
+ if (gameLevel > 5) {
+ enemy.fireRate = Math.max(120 - gameLevel * 5, 60);
+ }
+ game.addChild(enemy);
+ enemies.push(enemy);
+}
+// Spawn power-up
+function spawnPowerUp() {
+ var powerUp = new PowerUp();
+ powerUp.x = Math.random() * (GAME_WIDTH - 100) + 50;
+ powerUp.y = -50;
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+}
+// Check level progress
+function checkLevelProgress() {
+ // Advance level based on score
+ var shouldAdvanceLevel = Math.floor(score / 1000) + 1;
+ if (shouldAdvanceLevel > gameLevel) {
+ gameLevel = shouldAdvanceLevel;
+ updateLevelDisplay();
+ // Flash screen to indicate level up
+ LK.effects.flashScreen(0x3498db, 500);
+ }
+}
+// Handle collisions
+function handleCollisions() {
+ // Check player bullets hitting enemies
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ // Enemy takes damage
+ if (enemy.takeDamage(bullet.power)) {
+ // Enemy destroyed
+ score += enemy.scoreValue;
+ LK.setScore(score);
+ updateScoreDisplay();
+ LK.getSound('explosion').play();
+ LK.effects.flashObject(enemy, 0xff0000, 300);
+ // Remove enemy
+ enemy.destroy();
+ enemies.splice(j, 1);
+ }
+ // Remove bullet
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Check enemy bullets hitting player
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ if (bullet.intersects(player) && !player.shieldActive) {
+ // Player hit
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ // Game over
+ LK.effects.flashScreen(0xff0000, 1000);
+ isGameActive = false;
+ LK.showGameOver();
+ break;
+ }
+ }
+ // Check enemies colliding with player
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.intersects(player)) {
+ if (!player.shieldActive) {
+ // Player dies on collision
+ LK.effects.flashScreen(0xff0000, 1000);
+ isGameActive = false;
+ LK.showGameOver();
+ break;
+ } else {
+ // Shield absorbs the hit
+ enemy.destroy();
+ enemies.splice(i, 1);
+ // Shield gets depleted
+ player.shieldActive = false;
+ var shield = player.getChildAt(1);
+ shield.alpha = 0;
+ score += enemy.scoreValue;
+ LK.setScore(score);
+ updateScoreDisplay();
+ }
+ }
+ }
+ // Check player collecting power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ if (powerUp.intersects(player)) {
+ LK.getSound('powerUp').play();
+ // Apply power-up effect
+ if (powerUp.type === 'shield') {
+ player.activateShield();
+ } else {
+ player.activatePowerUp();
+ }
+ // Remove power-up
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+}
+// Clean up off-screen objects
+function cleanupOffscreenObjects() {
+ // Clean up bullets that went off screen
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ if (playerBullets[i].y < -50) {
+ playerBullets[i].destroy();
+ playerBullets.splice(i, 1);
+ }
+ }
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ if (enemyBullets[i].y > GAME_HEIGHT + 50) {
+ enemyBullets[i].destroy();
+ enemyBullets.splice(i, 1);
+ }
+ }
+ // Clean up enemies that went off screen
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i].y > GAME_HEIGHT + 100) {
+ enemies[i].destroy();
+ enemies.splice(i, 1);
+ }
+ }
+ // Clean up power-ups that went off screen
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ if (powerUps[i].y > GAME_HEIGHT + 50) {
+ powerUps[i].destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+}
+// Player movement
+var isDragging = false;
+game.down = function (x, y) {
+ isDragging = true;
+ player.x = x;
+ player.y = y;
+ // Also shoot when player taps
+ playerShoot();
+};
+game.move = function (x, y) {
+ if (isDragging && isGameActive) {
+ player.x = x;
+ player.y = y;
+ // Keep player within game bounds
+ if (player.x < 50) {
+ player.x = 50;
+ }
+ if (player.x > GAME_WIDTH - 50) {
+ player.x = GAME_WIDTH - 50;
+ }
+ if (player.y < 50) {
+ player.y = 50;
+ }
+ if (player.y > GAME_HEIGHT - 50) {
+ player.y = GAME_HEIGHT - 50;
+ }
+ }
+};
+game.up = function () {
+ isDragging = false;
+};
+// Main game update loop
+game.update = function () {
+ if (!isGameActive) {
+ return;
+ }
+ // Spawn enemies
+ spawnCounter++;
+ var currentSpawnRate = Math.max(SPAWN_ENEMY_INTERVAL - gameLevel * 5, MIN_SPAWN_INTERVAL);
+ if (spawnCounter >= currentSpawnRate) {
+ spawnEnemy();
+ spawnCounter = 0;
+ }
+ // Spawn power-ups
+ powerUpCounter++;
+ if (powerUpCounter >= SPAWN_POWERUP_INTERVAL) {
+ spawnPowerUp();
+ powerUpCounter = 0;
+ }
+ // Make player shoot if dragging
+ if (isDragging) {
+ playerShoot();
+ }
+ // Update enemy shooting
+ for (var i = 0; i < enemies.length; i++) {
+ enemyShoot(enemies[i]);
+ }
+ // Check collisions
+ handleCollisions();
+ // Clean up off-screen objects
+ cleanupOffscreenObjects();
+ // Check level progression
+ checkLevelProgress();
+ // Win condition check
+ if (score >= 10000) {
+ LK.showYouWin();
+ isGameActive = false;
+ }
+};
\ No newline at end of file
An enemy spaceship in a topdown shooter. In-Game asset. 2d. High contrast. No shadows
A player's spaceship in a topdown shooter (mainly blue in colour). In-Game asset. 2d. High contrast. No shadows
A powerup in a top-down shooter (icon of powerup no text). In-Game asset. 2d. High contrast. No shadows
Health Powerup in 2d space shooter (top down). In-Game asset. 2d. High contrast. No shadows
An explosion which contains debris of a spaceship. In-Game asset. 2d. High contrast. No shadows
pool of fire with top down view. In-Game asset. 2d. High contrast. No shadows
Make a small circle that looks like a laser (red colour). In-Game asset. 2d. High contrast. No shadows
Make a very small circle that looks like a laser (blue colour). In-Game asset. 2d. High contrast. No shadows. In-Game asset. 2d. High contrast. No shadows
A missile. In-Game asset. 2d. High contrast. No shadows