User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'getElementById')' in or related to this line: 'var cnv = document.getElementById('gameCanvas'),' Line Number: 11
Code edit (1 edits merged)
Please save this source code
User prompt
restore the game to its previous state
User prompt
Please fix the bug: 'ReferenceError: appleWidth is not defined' in or related to this line: 'return Math.sqrt(dx * dx + dy * dy);' Line Number: 40
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'getElementById')' in or related to this line: 'var cnv = document.getElementById('gameCanvas'),' Line Number: 11
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'getElementById')' in or related to this line: 'var cnv = document.getElementById('gameCanvas'),' Line Number: 11
Code edit (2 edits merged)
Please save this source code
User prompt
The snake's head is not visible
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'getElementById')' in or related to this line: 'var cnv = document.getElementById('gameCanvas'),' Line Number: 11
Code edit (1 edits merged)
Please save this source code
User prompt
Cosmic Frontier
Initial prompt
make a game like darkorbit
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.damage = 10; self.update = function () { self.y -= self.speed; }; return self; }); var Enemy = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'scout'; self.shootTimer = 0; self.shootDelay = 60; self.speed = 2; self.health = 20; self.maxHealth = 20; var enemyGraphics; if (self.type === 'scout') { enemyGraphics = self.attachAsset('enemy_scout', { anchorX: 0.5, anchorY: 0.5 }); self.health = 20; self.maxHealth = 20; self.speed = 3; self.shootDelay = 90; } else if (self.type === 'fighter') { enemyGraphics = self.attachAsset('enemy_fighter', { anchorX: 0.5, anchorY: 0.5 }); self.health = 40; self.maxHealth = 40; self.speed = 2; self.shootDelay = 60; } else if (self.type === 'boss') { enemyGraphics = self.attachAsset('enemy_boss', { anchorX: 0.5, anchorY: 0.5 }); self.health = 150; self.maxHealth = 150; self.speed = 1; self.shootDelay = 30; } self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFF0000, 200); LK.getSound('enemy_hit').play(); if (self.health <= 0) { self.destroyed = true; // Drop resources for (var i = 0; i < Math.random() * 3 + 1; i++) { var resourceType = ['crystal', 'metal', 'energy'][Math.floor(Math.random() * 3)]; var resource = new Resource(resourceType); resource.x = self.x + (Math.random() - 0.5) * 50; resource.y = self.y + (Math.random() - 0.5) * 50; resources.push(resource); game.addChild(resource); } } }; self.update = function () { if (self.destroyed) return; self.y += self.speed; // Simple AI movement if (spaceship) { var dx = spaceship.x - self.x; self.x += dx * 0.005; } // Shooting self.shootTimer++; if (self.shootTimer >= self.shootDelay) { self.shootTimer = 0; var enemyBullet = new EnemyBullet(); enemyBullet.x = self.x; enemyBullet.y = self.y + 20; enemyBullets.push(enemyBullet); game.addChild(enemyBullet); } }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); bulletGraphics.tint = 0xFF4444; self.speed = 8; self.damage = 15; self.update = function () { self.y += self.speed; }; return self; }); var Resource = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'crystal'; self.value = 1; var resourceGraphics; if (self.type === 'crystal') { resourceGraphics = self.attachAsset('crystal', { anchorX: 0.5, anchorY: 0.5 }); self.value = 5; } else if (self.type === 'metal') { resourceGraphics = self.attachAsset('metal', { anchorX: 0.5, anchorY: 0.5 }); self.value = 3; } else if (self.type === 'energy') { resourceGraphics = self.attachAsset('energy', { anchorX: 0.5, anchorY: 0.5 }); self.value = 2; } self.floatSpeed = Math.random() * 2 + 1; self.floatDirection = Math.random() * Math.PI * 2; self.update = function () { self.y += self.floatSpeed; self.x += Math.sin(self.floatDirection + LK.ticks * 0.02) * 0.5; }; return self; }); var Spaceship = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('spaceship', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.shootTimer = 0; self.shootDelay = 15; self.weaponLevel = 1; self.shieldLevel = 1; self.speedLevel = 1; self.takeDamage = function (damage) { var actualDamage = Math.max(1, damage - self.shieldLevel); self.health -= actualDamage; LK.effects.flashObject(self, 0xFF0000, 300); LK.getSound('player_hit').play(); if (self.health <= 0) { LK.showGameOver(); } }; self.shoot = function () { if (self.shootTimer <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y - 50; bullet.damage = 10 + (self.weaponLevel - 1) * 5; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); self.shootTimer = Math.max(5, self.shootDelay - (self.weaponLevel - 1) * 3); } }; self.update = function () { if (self.shootTimer > 0) { self.shootTimer--; } // Auto-shoot when enemies are nearby for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (!enemy.destroyed) { var distance = Math.sqrt(Math.pow(enemy.x - self.x, 2) + Math.pow(enemy.y - self.y, 2)); if (distance < 400) { self.shoot(); break; } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000011 }); /**** * Game Code ****/ // Game variables var spaceship; var bullets = []; var enemyBullets = []; var enemies = []; var resources = []; var waveTimer = 0; var waveNumber = 1; var resourceSpawnTimer = 0; var playerResources = { crystal: 0, metal: 0, energy: 0 }; var dragNode = null; // UI Elements var scoreText = new Text2('Score: 0', { size: 40, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 120; scoreText.y = 20; LK.gui.topLeft.addChild(scoreText); var healthText = new Text2('Health: 100', { size: 40, fill: 0xFF4444 }); healthText.anchor.set(0.5, 0); LK.gui.top.addChild(healthText); var waveText = new Text2('Wave: 1', { size: 40, fill: 0x44FF44 }); waveText.anchor.set(1, 0); waveText.x = -20; waveText.y = 20; LK.gui.topRight.addChild(waveText); var resourceText = new Text2('Crystals: 0 | Metal: 0 | Energy: 0', { size: 35, fill: 0xFFFF44 }); resourceText.anchor.set(0.5, 1); resourceText.y = -20; LK.gui.bottom.addChild(resourceText); // Initialize spaceship spaceship = game.addChild(new Spaceship()); spaceship.x = 1024; spaceship.y = 2200; function spawnWave() { var enemyCount = Math.min(3 + waveNumber, 8); var bossChance = waveNumber % 5 === 0; for (var i = 0; i < enemyCount; i++) { var enemy; if (bossChance && i === 0) { enemy = new Enemy('boss'); } else if (waveNumber > 3 && Math.random() < 0.3) { enemy = new Enemy('fighter'); } else { enemy = new Enemy('scout'); } enemy.x = Math.random() * 1800 + 124; enemy.y = -100 - i * 80; enemies.push(enemy); game.addChild(enemy); } waveNumber++; waveText.setText('Wave: ' + waveNumber); } function spawnResource() { if (Math.random() < 0.7) { var resourceType = ['crystal', 'metal', 'energy'][Math.floor(Math.random() * 3)]; var resource = new Resource(resourceType); resource.x = Math.random() * 1800 + 124; resource.y = -50; resources.push(resource); game.addChild(resource); } } function updateUI() { scoreText.setText('Score: ' + LK.getScore()); healthText.setText('Health: ' + spaceship.health); resourceText.setText('Crystals: ' + playerResources.crystal + ' | Metal: ' + playerResources.metal + ' | Energy: ' + playerResources.energy); } function handleMove(x, y, obj) { if (dragNode) { dragNode.x = Math.max(40, Math.min(2008, x)); dragNode.y = Math.max(50, Math.min(2682, y)); } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = spaceship; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; // Main game loop game.update = function () { // Spawn waves waveTimer++; if (waveTimer >= 300) { // 5 seconds at 60fps spawnWave(); waveTimer = 0; } // Spawn resources resourceSpawnTimer++; if (resourceSpawnTimer >= 120) { // 2 seconds spawnResource(); resourceSpawnTimer = 0; } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.lastY === undefined) bullet.lastY = bullet.y; // Remove off-screen bullets if (bullet.lastY >= -20 && bullet.y < -20) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet-enemy collisions for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (!enemy.destroyed && bullet.intersects(enemy)) { enemy.takeDamage(bullet.damage); bullet.destroy(); bullets.splice(i, 1); if (enemy.destroyed) { LK.setScore(LK.getScore() + (enemy.type === 'boss' ? 100 : enemy.type === 'fighter' ? 50 : 25)); enemy.destroy(); enemies.splice(j, 1); } break; } } if (i < bullets.length) { bullet.lastY = bullet.y; } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var enemyBullet = enemyBullets[i]; if (enemyBullet.lastY === undefined) enemyBullet.lastY = enemyBullet.y; // Remove off-screen enemy bullets if (enemyBullet.lastY <= 2750 && enemyBullet.y > 2750) { enemyBullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check enemy bullet-player collision if (enemyBullet.intersects(spaceship)) { spaceship.takeDamage(enemyBullet.damage); enemyBullet.destroy(); enemyBullets.splice(i, 1); continue; } enemyBullet.lastY = enemyBullet.y; } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (enemy.lastY === undefined) enemy.lastY = enemy.y; // Remove off-screen enemies if (enemy.lastY <= 2800 && enemy.y > 2800) { if (!enemy.destroyed) { enemy.destroy(); } enemies.splice(i, 1); continue; } // Check enemy-player collision if (!enemy.destroyed && enemy.intersects(spaceship)) { spaceship.takeDamage(30); enemy.takeDamage(enemy.maxHealth); if (enemy.destroyed) { enemy.destroy(); enemies.splice(i, 1); } continue; } enemy.lastY = enemy.y; } // Update resources for (var i = resources.length - 1; i >= 0; i--) { var resource = resources[i]; if (resource.lastY === undefined) resource.lastY = resource.y; // Remove off-screen resources if (resource.lastY <= 2800 && resource.y > 2800) { resource.destroy(); resources.splice(i, 1); continue; } // Check resource collection if (resource.intersects(spaceship)) { playerResources[resource.type] += resource.value; LK.setScore(LK.getScore() + resource.value); LK.getSound('collect').play(); resource.destroy(); resources.splice(i, 1); continue; } resource.lastY = resource.y; } updateUI(); }; // Start the first wave spawnWave();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,416 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 15;
+ self.damage = 10;
+ self.update = function () {
+ self.y -= self.speed;
+ };
+ return self;
+});
+var Enemy = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'scout';
+ self.shootTimer = 0;
+ self.shootDelay = 60;
+ self.speed = 2;
+ self.health = 20;
+ self.maxHealth = 20;
+ var enemyGraphics;
+ if (self.type === 'scout') {
+ enemyGraphics = self.attachAsset('enemy_scout', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 20;
+ self.maxHealth = 20;
+ self.speed = 3;
+ self.shootDelay = 90;
+ } else if (self.type === 'fighter') {
+ enemyGraphics = self.attachAsset('enemy_fighter', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 40;
+ self.maxHealth = 40;
+ self.speed = 2;
+ self.shootDelay = 60;
+ } else if (self.type === 'boss') {
+ enemyGraphics = self.attachAsset('enemy_boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 150;
+ self.maxHealth = 150;
+ self.speed = 1;
+ self.shootDelay = 30;
+ }
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 200);
+ LK.getSound('enemy_hit').play();
+ if (self.health <= 0) {
+ self.destroyed = true;
+ // Drop resources
+ for (var i = 0; i < Math.random() * 3 + 1; i++) {
+ var resourceType = ['crystal', 'metal', 'energy'][Math.floor(Math.random() * 3)];
+ var resource = new Resource(resourceType);
+ resource.x = self.x + (Math.random() - 0.5) * 50;
+ resource.y = self.y + (Math.random() - 0.5) * 50;
+ resources.push(resource);
+ game.addChild(resource);
+ }
+ }
+ };
+ self.update = function () {
+ if (self.destroyed) return;
+ self.y += self.speed;
+ // Simple AI movement
+ if (spaceship) {
+ var dx = spaceship.x - self.x;
+ self.x += dx * 0.005;
+ }
+ // Shooting
+ self.shootTimer++;
+ if (self.shootTimer >= self.shootDelay) {
+ self.shootTimer = 0;
+ var enemyBullet = new EnemyBullet();
+ enemyBullet.x = self.x;
+ enemyBullet.y = self.y + 20;
+ enemyBullets.push(enemyBullet);
+ game.addChild(enemyBullet);
+ }
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ bulletGraphics.tint = 0xFF4444;
+ self.speed = 8;
+ self.damage = 15;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Resource = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'crystal';
+ self.value = 1;
+ var resourceGraphics;
+ if (self.type === 'crystal') {
+ resourceGraphics = self.attachAsset('crystal', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.value = 5;
+ } else if (self.type === 'metal') {
+ resourceGraphics = self.attachAsset('metal', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.value = 3;
+ } else if (self.type === 'energy') {
+ resourceGraphics = self.attachAsset('energy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.value = 2;
+ }
+ self.floatSpeed = Math.random() * 2 + 1;
+ self.floatDirection = Math.random() * Math.PI * 2;
+ self.update = function () {
+ self.y += self.floatSpeed;
+ self.x += Math.sin(self.floatDirection + LK.ticks * 0.02) * 0.5;
+ };
+ return self;
+});
+var Spaceship = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('spaceship', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ self.shootTimer = 0;
+ self.shootDelay = 15;
+ self.weaponLevel = 1;
+ self.shieldLevel = 1;
+ self.speedLevel = 1;
+ self.takeDamage = function (damage) {
+ var actualDamage = Math.max(1, damage - self.shieldLevel);
+ self.health -= actualDamage;
+ LK.effects.flashObject(self, 0xFF0000, 300);
+ LK.getSound('player_hit').play();
+ if (self.health <= 0) {
+ LK.showGameOver();
+ }
+ };
+ self.shoot = function () {
+ if (self.shootTimer <= 0) {
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 50;
+ bullet.damage = 10 + (self.weaponLevel - 1) * 5;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ self.shootTimer = Math.max(5, self.shootDelay - (self.weaponLevel - 1) * 3);
+ }
+ };
+ self.update = function () {
+ if (self.shootTimer > 0) {
+ self.shootTimer--;
+ }
+ // Auto-shoot when enemies are nearby
+ for (var i = 0; i < enemies.length; i++) {
+ var enemy = enemies[i];
+ if (!enemy.destroyed) {
+ var distance = Math.sqrt(Math.pow(enemy.x - self.x, 2) + Math.pow(enemy.y - self.y, 2));
+ if (distance < 400) {
+ self.shoot();
+ break;
+ }
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000011
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var spaceship;
+var bullets = [];
+var enemyBullets = [];
+var enemies = [];
+var resources = [];
+var waveTimer = 0;
+var waveNumber = 1;
+var resourceSpawnTimer = 0;
+var playerResources = {
+ crystal: 0,
+ metal: 0,
+ energy: 0
+};
+var dragNode = null;
+// UI Elements
+var scoreText = new Text2('Score: 0', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+scoreText.x = 120;
+scoreText.y = 20;
+LK.gui.topLeft.addChild(scoreText);
+var healthText = new Text2('Health: 100', {
+ size: 40,
+ fill: 0xFF4444
+});
+healthText.anchor.set(0.5, 0);
+LK.gui.top.addChild(healthText);
+var waveText = new Text2('Wave: 1', {
+ size: 40,
+ fill: 0x44FF44
+});
+waveText.anchor.set(1, 0);
+waveText.x = -20;
+waveText.y = 20;
+LK.gui.topRight.addChild(waveText);
+var resourceText = new Text2('Crystals: 0 | Metal: 0 | Energy: 0', {
+ size: 35,
+ fill: 0xFFFF44
+});
+resourceText.anchor.set(0.5, 1);
+resourceText.y = -20;
+LK.gui.bottom.addChild(resourceText);
+// Initialize spaceship
+spaceship = game.addChild(new Spaceship());
+spaceship.x = 1024;
+spaceship.y = 2200;
+function spawnWave() {
+ var enemyCount = Math.min(3 + waveNumber, 8);
+ var bossChance = waveNumber % 5 === 0;
+ for (var i = 0; i < enemyCount; i++) {
+ var enemy;
+ if (bossChance && i === 0) {
+ enemy = new Enemy('boss');
+ } else if (waveNumber > 3 && Math.random() < 0.3) {
+ enemy = new Enemy('fighter');
+ } else {
+ enemy = new Enemy('scout');
+ }
+ enemy.x = Math.random() * 1800 + 124;
+ enemy.y = -100 - i * 80;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ }
+ waveNumber++;
+ waveText.setText('Wave: ' + waveNumber);
+}
+function spawnResource() {
+ if (Math.random() < 0.7) {
+ var resourceType = ['crystal', 'metal', 'energy'][Math.floor(Math.random() * 3)];
+ var resource = new Resource(resourceType);
+ resource.x = Math.random() * 1800 + 124;
+ resource.y = -50;
+ resources.push(resource);
+ game.addChild(resource);
+ }
+}
+function updateUI() {
+ scoreText.setText('Score: ' + LK.getScore());
+ healthText.setText('Health: ' + spaceship.health);
+ resourceText.setText('Crystals: ' + playerResources.crystal + ' | Metal: ' + playerResources.metal + ' | Energy: ' + playerResources.energy);
+}
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = Math.max(40, Math.min(2008, x));
+ dragNode.y = Math.max(50, Math.min(2682, y));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = spaceship;
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main game loop
+game.update = function () {
+ // Spawn waves
+ waveTimer++;
+ if (waveTimer >= 300) {
+ // 5 seconds at 60fps
+ spawnWave();
+ waveTimer = 0;
+ }
+ // Spawn resources
+ resourceSpawnTimer++;
+ if (resourceSpawnTimer >= 120) {
+ // 2 seconds
+ spawnResource();
+ resourceSpawnTimer = 0;
+ }
+ // Update bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ if (bullet.lastY === undefined) bullet.lastY = bullet.y;
+ // Remove off-screen bullets
+ if (bullet.lastY >= -20 && bullet.y < -20) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check bullet-enemy collisions
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (!enemy.destroyed && bullet.intersects(enemy)) {
+ enemy.takeDamage(bullet.damage);
+ bullet.destroy();
+ bullets.splice(i, 1);
+ if (enemy.destroyed) {
+ LK.setScore(LK.getScore() + (enemy.type === 'boss' ? 100 : enemy.type === 'fighter' ? 50 : 25));
+ enemy.destroy();
+ enemies.splice(j, 1);
+ }
+ break;
+ }
+ }
+ if (i < bullets.length) {
+ bullet.lastY = bullet.y;
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var enemyBullet = enemyBullets[i];
+ if (enemyBullet.lastY === undefined) enemyBullet.lastY = enemyBullet.y;
+ // Remove off-screen enemy bullets
+ if (enemyBullet.lastY <= 2750 && enemyBullet.y > 2750) {
+ enemyBullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check enemy bullet-player collision
+ if (enemyBullet.intersects(spaceship)) {
+ spaceship.takeDamage(enemyBullet.damage);
+ enemyBullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ enemyBullet.lastY = enemyBullet.y;
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.lastY === undefined) enemy.lastY = enemy.y;
+ // Remove off-screen enemies
+ if (enemy.lastY <= 2800 && enemy.y > 2800) {
+ if (!enemy.destroyed) {
+ enemy.destroy();
+ }
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check enemy-player collision
+ if (!enemy.destroyed && enemy.intersects(spaceship)) {
+ spaceship.takeDamage(30);
+ enemy.takeDamage(enemy.maxHealth);
+ if (enemy.destroyed) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ continue;
+ }
+ enemy.lastY = enemy.y;
+ }
+ // Update resources
+ for (var i = resources.length - 1; i >= 0; i--) {
+ var resource = resources[i];
+ if (resource.lastY === undefined) resource.lastY = resource.y;
+ // Remove off-screen resources
+ if (resource.lastY <= 2800 && resource.y > 2800) {
+ resource.destroy();
+ resources.splice(i, 1);
+ continue;
+ }
+ // Check resource collection
+ if (resource.intersects(spaceship)) {
+ playerResources[resource.type] += resource.value;
+ LK.setScore(LK.getScore() + resource.value);
+ LK.getSound('collect').play();
+ resource.destroy();
+ resources.splice(i, 1);
+ continue;
+ }
+ resource.lastY = resource.y;
+ }
+ updateUI();
+};
+// Start the first wave
+spawnWave();
\ No newline at end of file