User prompt
when a life is lost reduce the current speed of the aliens by 75% for 2 seconds
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'forEach')' in or related to this line: 'this.particles.forEach(function (particle) {' Line Number: 186
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'forEach')' in or related to this line: 'this.particles.forEach(function (particle) {' Line Number: 186
User prompt
ensure that `ParticlePool` has a `particles` array defined and accessible in the global scope.
Code edit (1 edits merged)
Please save this source code
User prompt
move wave text 100 pixels to the right and 200 down
User prompt
show wave nunmber on the screen an update it when a new wave starts
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var j = ParticlePool.particles.length - 1; j >= 0; j--) {' Line Number: 281
User prompt
Make sure particlespool is destroyed when alien is destroyed in checkcollision
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var j = ParticlePool.particles.length - 1; j >= 0; j--) {' Line Number: 274
User prompt
when checkinng collisions, make sure that if the enemy collides with shield, then destroy particles
User prompt
Make sure particles are destroyed after alien is destroyed by shield in game
User prompt
destroy allien particle when allien is destroyed
User prompt
That did not work. Make sure particles are destroyed also when the alien is destroyed by the shield
User prompt
make sure the particles are also removed when alien is desttoyed
User prompt
Improve preformance when the game has too many aliens on screen
User prompt
remove code that increases the shield speed over time
User prompt
speed of enemies will encrease per wave and not by time
User prompt
Each wave should also have a number of enemies in it
User prompt
Enemies should be spawned in waves each wave will have a different speed
Code edit (1 edits merged)
Please save this source code
User prompt
When a life is lost, reduce the speed of aliens in half for two second and then go back to the speed it had before life was lost
User prompt
When a life is lost, reduce the current speed of aliens in half for 2 seconds and then go back to the speed it had two seconds ago
User prompt
After life is lost reduce game speed for 70% of its speed and after 2 seconds go back to original speed
/**** * Classes ****/ var Alien = Container.expand(function () { var self = Container.call(this); var alienGraphics = self.attachAsset('alien', { anchorX: 0.5, anchorY: 0.5, tint: Math.floor(Math.random() * (0xFFFFFF - 0x808080)) + 0x808080 }); self.baseSpeed = 2; self.speedMultiplier = 1; self._move_migrated = function () { var dy = earth.y - self.y; var dx = earth.x - self.x; var angle = Math.atan2(dy, dx); var speed = self.baseSpeed * self.speedMultiplier; self.x += speed * Math.cos(angle); self.y += speed * Math.sin(angle); // Emit engine particles var particleAngle = angle + Math.PI; // Opposite direction of movement if (Math.random() < 0.5) { var particleSpeed = Math.random() * 2 + 2; var particle = ParticlePool.get(self.children[0].tint, particleSpeed, particleAngle); particle.alienId = self.id; // Set alienId for tracking particle.x = self.x + 50 * Math.cos(particleAngle); particle.y = self.y + 50 * Math.sin(particleAngle); game.addChild(particle); } // Destroy particles when alien is destroyed if (!self.visible) { for (var i = ParticlePool.particles.length - 1; i >= 0; i--) { if (ParticlePool.particles[i].alienId === self.id) { ParticlePool.particles[i].destroy(); ParticlePool.particles.splice(i, 1); } } } }; }); var Explosion = Container.expand(function (colorTint) { var self = Container.call(this); self.particles = []; for (var i = 0; i < 20; i++) { var particle = self.attachAsset('alien', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.2, scaleY: 0.2, alpha: 0.8, tint: colorTint }); particle.vx = (Math.random() - 0.5) * 10; particle.vy = (Math.random() - 0.5) * 10; self.particles.push(particle); } self._update_migrated = function () { for (var i = self.particles.length - 1; i >= 0; i--) { var p = self.particles[i]; p.x += p.vx; p.y += p.vy; p.alpha -= 0.02; if (p.alpha <= 0) { p.destroy(); self.particles.splice(i, 1); } } }; }); var Particle = Container.expand(function (colorTint, speed, angle) { var self = Container.call(this); var particleGraphics = self.attachAsset('alien', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3, alpha: 0.8, tint: colorTint }); self.vx = speed * Math.cos(angle); self.vy = speed * Math.sin(angle); self.lifeSpan = 60; self.alienId = null; // Add alienId for tracking self.reset = function (colorTint, speed, angle) { self.vx = speed * Math.cos(angle); self.vy = speed * Math.sin(angle); self.alpha = 0.8; particleGraphics.tint = colorTint; self.lifeSpan = 60; }; self._update_migrated = function () { self.x += self.vx; self.y += self.vy; self.alpha -= 1 / self.lifeSpan; if (self.alpha <= 0) { self.visible = false; } }; return self; }); // Shield class var Shield = Container.expand(function () { var self = Container.call(this); self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5 }); self.orbitRadius = 200; self.orbitSpeed = 0.04; self.orbitAngle = 0; self._update_migrated = function () { self.orbitAngle += self.orbitSpeed; self.x = earth.x + self.orbitRadius * Math.cos(self.orbitAngle); self.y = earth.y + self.orbitRadius * Math.sin(self.orbitAngle); var angleToEarth = Math.atan2(earth.y - self.y, earth.x - self.x); self.rotation = angleToEarth + Math.PI / 2; }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Init game with black background }); /**** * Game Code ****/ // Game variables var AlienPool = function () { var aliens = []; return { get: function get() { var alien = aliens.find(function (a) { return !a.visible; }); if (!alien) { alien = new Alien(); aliens.push(alien); } alien.visible = true; return alien; }, updateAll: function updateAll() { aliens.forEach(function (alien) { if (alien.visible) { alien._move_migrated(); } }); } }; }(); var lives = 3; var wave = 1; var waveSpeeds = [2, 3, 4, 5, 6]; // Initialize assets used in the game. // Missile class // Alien class // Explosion class // Particle class var ParticlePool = function () { var particles = []; return { get: function get(colorTint, speed, angle) { var particle = particles.find(function (p) { return !p.visible; }); if (!particle) { particle = new Particle(colorTint, speed, angle); particles.push(particle); } else { particle.reset(colorTint, speed, angle); } particle.visible = true; return particle; }, updateAll: function updateAll() { particles.forEach(function (particle) { if (particle.visible) { particle._update_migrated(); } }); } }; }(); var aliens = []; var earth; var scoreTxt; var particles = []; // Array to keep track of particles var spawnAlienInterval = 120; // Frames until a new alien spawns var spawnAlienIntervalDecrement = 0.98; // Multiplier to decrease spawn interval var nextAlienSpawn = spawnAlienInterval; // Initialize Earth function initEarth() { earth = game.addChild(LK.getAsset('earth', { anchorX: 0.5, anchorY: 0.5, x: game.width / 2, y: game.height / 2 })); window.shield = game.addChild(new Shield()); window.shield.x = earth.x; window.shield.y = earth.y - window.shield.orbitRadius; } // Initialize score display function initScore() { scoreTxt = new Text2('', { size: 150, fill: "#ffffff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); livesIcons = []; for (var i = 0; i < lives; i++) { var lifeIcon = LK.getAsset('earth', { anchorX: 1, anchorY: 0, scaleX: 0.5, scaleY: 0.5, x: -i * 60 }); LK.gui.topRight.addChild(lifeIcon); livesIcons.push(lifeIcon); } } // Spawn an alien function spawnAlien() { var alien = AlienPool.get(); alien.baseSpeed = wave; var side = Math.floor(Math.random() * 4); switch (side) { case 0: // top alien.x = Math.random() * game.width; alien.y = -alien.height; break; case 1: // right alien.x = game.width + alien.width; alien.y = Math.random() * game.height; break; case 2: // bottom alien.x = Math.random() * game.width; alien.y = game.height + alien.height; break; case 3: // left alien.x = -alien.width; alien.y = Math.random() * game.height; break; } aliens.push(alien); game.addChild(alien); } // Check for collisions function checkCollisions() { for (var i = 0; i < aliens.length; i++) { if (window.shield.intersects(aliens[i])) { var alienColor = aliens[i].children[0].tint; var explosion = new Explosion(alienColor); explosion.x = aliens[i].x; explosion.y = aliens[i].y; game.addChild(explosion); // Remove particles associated with the alien for (var j = ParticlePool.particles ? ParticlePool.particles.length - 1 : -1; j >= 0; j--) { if (ParticlePool.particles[j].alienId === aliens[i].id) { ParticlePool.particles[j].destroy(); ParticlePool.particles.splice(j, 1); } } aliens[i].destroy(); LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore().toString()); aliens.splice(i, 1); } } } // Game over check function checkGameOver() { for (var i = 0; i < aliens.length; i++) { if (aliens[i].intersects(earth)) { var alienColor = aliens[i].children[0].tint; LK.effects.flashScreen(alienColor, 2000); lives--; livesIcons[lives].destroy(); livesIcons.pop(); if (lives <= 0) { LK.showGameOver(); } else { aliens.forEach(function (alien) { alien.speedMultiplier = 0.5; }); LK.setTimeout(function () { aliens.forEach(function (alien) { alien.speedMultiplier = 1; }); }, 2000); aliens[i].destroy(); aliens.splice(i, 1); } break; } } } // Touch event to move shield game.on('down', function (x, y, obj) { window.shield.orbitSpeed = -window.shield.orbitSpeed; }); // Game tick event LK.on('tick', function () { // Update explosions and particles game.children.forEach(function (child) { if (child instanceof Explosion) { child._update_migrated(); } }); ParticlePool.updateAll(); // Move aliens AlienPool.updateAll(); // Spawn aliens and update spawn interval nextAlienSpawn--; if (nextAlienSpawn <= 0) { if (aliens.length === 0) { wave++; } spawnAlien(); nextAlienSpawn = spawnAlienInterval; spawnAlienInterval *= spawnAlienIntervalDecrement; } // Update shield position window.shield._update_migrated(); // Check for collisions and game over checkCollisions(); checkGameOver(); }); // Initialize game elements initEarth(); initScore();
===================================================================
--- original.js
+++ change.js
@@ -263,9 +263,9 @@
explosion.x = aliens[i].x;
explosion.y = aliens[i].y;
game.addChild(explosion);
// Remove particles associated with the alien
- for (var j = ParticlePool.particles.length - 1; j >= 0; j--) {
+ for (var j = ParticlePool.particles ? ParticlePool.particles.length - 1 : -1; j >= 0; j--) {
if (ParticlePool.particles[j].alienId === aliens[i].id) {
ParticlePool.particles[j].destroy();
ParticlePool.particles.splice(j, 1);
}