User prompt
increase the enemy acceleration
Code edit (7 edits merged)
Please save this source code
User prompt
optimize the code for the ammo UI stacking so it's values are only mentioned once, then called from that place, instead of using multiiple values for the same thing
Code edit (2 edits merged)
Please save this source code
User prompt
increase the gap between the ammo bullets in the UI
User prompt
remove all civilians code from the code
Code edit (1 edits merged)
Please save this source code
User prompt
reduce the spawner's starting time from 90 to 70
Code edit (3 edits merged)
Please save this source code
User prompt
instead of havving just 1 ammo spawned on the screen, always have 3 at all times. the players continues to move to the closest one. whenever one is collected generate another one, so there's at all times 3 ammo items on the screen
Code edit (1 edits merged)
Please save this source code
User prompt
the score affects how fast the enemies are spawned, but each score increment should affect this spawn rate by a lower amount
User prompt
add a flag to the enemy death to check if it already increased the score. one enemy can only increase the score by 1
Code edit (2 edits merged)
Please save this source code
User prompt
when an enemy is destroyed, add 1 point to the score. add this event inside the enemy class, not the bullet collision, since the enemy can be killed from multiple parts
User prompt
when an enemy is destroyed, add 1 point to the score
User prompt
consolidate the enemy behavior in a single class
User prompt
when an enemy is destroyed, add 1 point to the score.
User prompt
the check that adds points to the score should be removed from the bullet collision.
User prompt
enemies dont add points to the score when killed. when they are destroyed, add 1 point
User prompt
when an enemy dies, add 1 point to the score
User prompt
the check that adds points to the score should be removed from the bullet. instead, add it to the enemy death. when an enemy is destroyed, add 1 point to the score. thsi should be the only way to add points to the score, remove any other parts of the code that related to adding points, that are not related to the enemy death
User prompt
1 enemy death should equal 1 point added. right now an enemy death awards no points
User prompt
the score increases by 2 per killed enemy, which tells me there's either a duplicate code or it's implemented wrong. 1 enemy death should equal 1 point added
User prompt
enemy death is not increasing the score by 1 which is a bug. when an enemy is destroyed, a point should be added to the score
/**** * Classes ****/ // Ammo class var Ammo = Container.expand(function () { var self = Container.call(this); var ammoGraphics = self.attachAsset('ammo', { anchorX: 0.5, anchorY: 0.5 }); }); // AmmoUI class var AmmoUI = Container.expand(function () { var self = Container.call(this); self.ammoCount = 10; self.ammoDisplay = []; self.init = function () { for (var i = 0; i < self.ammoCount; i++) { var ammo = new Ammo(); ammo.x = 60; // Position to the left ammo.y = 2732 - 50 - i * 60; // Stack vertically from bottom to top self.ammoDisplay.push(ammo); self.addChild(ammo); } }; self.decreaseAmmo = function () { if (self.ammoCount > 0) { self.ammoCount--; var ammoToRemove = self.ammoDisplay.pop(); ammoToRemove.destroy(); } }; self.increaseAmmo = function () { if (self.ammoCount < 10) { self.ammoCount++; var newAmmoDisplay = new Ammo(); newAmmoDisplay.x = 60; // Position to the left newAmmoDisplay.y = 2732 - 50 - (self.ammoCount - 1) * 60; // Stack vertically from bottom to top self.ammoDisplay.push(newAmmoDisplay); self.addChild(newAmmoDisplay); } }; self.init(); }); // BackgroundContainer class var BackgroundContainer = Container.expand(function () { var self = Container.call(this); }); //<Assets used in the game will automatically appear here> // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.direction = { x: 0, y: -1 }; // Default direction self.targetedEnemy = null; // Add a flag to store the targeted enemy self.update = function () { self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; }; }); // Civilian class var Civilian = Container.expand(function () { var self = Container.call(this); var civilianGraphics = self.attachAsset('civilian', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.direction = { x: Math.random() * 2 - 1, y: Math.random() * 2 - 1 }; self.update = function () { // Check for collision with enemies for (var i = 0; i < enemySpawners.length; i++) { if (self.intersects(enemySpawners[i])) { // Move civilian away from the enemy var dx = self.x - enemySpawners[i].x; var dy = self.y - enemySpawners[i].y; var magnitude = Math.sqrt(dx * dx + dy * dy); self.direction.x = dx / magnitude; self.direction.y = dy / magnitude; self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; } } // Move civilian self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; // Follow enemies within a radius of 500 pixels var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemySpawners.length; i++) { var distance = Math.sqrt(Math.pow(enemySpawners[i].x - self.x, 2) + Math.pow(enemySpawners[i].y - self.y, 2)); if (distance < closestDistance) { closestEnemy = enemySpawners[i]; closestDistance = distance; } } if (closestEnemy !== null && closestDistance <= 500) { self.direction.x = closestEnemy.x - self.x; self.direction.y = closestEnemy.y - self.y; var magnitude = Math.sqrt(self.direction.x * self.direction.x + self.direction.y * self.direction.y); self.direction.x /= magnitude; self.direction.y /= magnitude; } // Avoid edges of the screen if (self.x < 100) { self.direction.x = Math.abs(self.direction.x); } if (self.x > 1948) { self.direction.x = -Math.abs(self.direction.x); } if (self.y < 100) { self.direction.y = Math.abs(self.direction.y); } if (self.y > 2632) { self.direction.y = -Math.abs(self.direction.y); } }; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.acceleration = 0.005; // Decrease acceleration property self.scoreIncreased = false; // Add a flag to check if the score has been increased self.update = function () { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.speed) { self.speed += self.acceleration; // Increase speed by acceleration self.x += dx * self.speed / distance; self.y += dy * self.speed / distance; } }; }); // Explosion class var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.01, scaleY: 0.01 }); self.expandTime = 150; // 150 milliseconds self.startTime = Date.now(); self.hitboxIntersects = function (target) { var selfBounds = self.getBounds(); var targetBounds = target.getBounds(); return selfBounds.x < targetBounds.x + targetBounds.width && selfBounds.x + selfBounds.width > targetBounds.x && selfBounds.y < targetBounds.y + targetBounds.height && selfBounds.y + selfBounds.height > targetBounds.y; }; self.update = function () { var elapsedTime = Date.now() - self.startTime; var scale = Math.min(1, elapsedTime / self.expandTime); explosionGraphics.scale.set(scale, scale); if (scale >= 1) { // Check for collisions with enemies for (var i = enemySpawners.length - 1; i >= 0; i--) { if (self.hitboxIntersects(enemySpawners[i])) { var newExplosion = new Explosion(); newExplosion.x = enemySpawners[i].x; newExplosion.y = enemySpawners[i].y; midgroundContainer.addChild(newExplosion); if (!enemySpawners[i].scoreIncreased) { LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); enemySpawners[i].scoreIncreased = true; } enemySpawners[i].destroy(); enemySpawners.splice(i, 1); } } // Check for collisions with civilians for (var c = civilians.length - 1; c >= 0; c--) { if (self.hitboxIntersects(civilians[c])) { var newExplosion = new Explosion(); newExplosion.x = civilians[c].x; newExplosion.y = civilians[c].y; midgroundContainer.addChild(newExplosion); civilians[c].destroy(); civilians.splice(c, 1); } } LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); self.destroy(); } }; }); // ForegroundContainer class var ForegroundContainer = Container.expand(function () { var self = Container.call(this); }); // MidgroundContainer class var MidgroundContainer = Container.expand(function () { var self = Container.call(this); }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; }; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.shoot = function () { var newBullet = new Bullet(); newBullet.x = self.x; newBullet.y = self.y; // Find the closest enemy that hasn't been targeted var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemySpawners.length; i++) { var alreadyTargeted = bullets.some(function (bullet) { return bullet.targetedEnemy === enemySpawners[i]; }); if (alreadyTargeted) { continue; // Skip already targeted enemies } var distance = Math.sqrt(Math.pow(enemySpawners[i].x - self.x, 2) + Math.pow(enemySpawners[i].y - self.y, 2)); if (distance < closestDistance) { closestEnemy = enemySpawners[i]; closestDistance = distance; } } if (closestEnemy === null) { return; // No enemies to target } if (ammoUI.ammoCount <= 0) { console.log("Out of ammo!"); return; // Out of ammo } ammoUI.decreaseAmmo(); // Set the bullet's direction towards the closest enemy var dx = closestEnemy.x - self.x; var dy = closestEnemy.y - self.y; var magnitude = Math.sqrt(dx * dx + dy * dy); newBullet.direction = { x: dx / magnitude, y: dy / magnitude }; newBullet.targetedEnemy = closestEnemy; // Mark the enemy as targeted bullets.push(newBullet); midgroundContainer.addChild(newBullet); }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 //Init game with black background }); /**** * Game Code ****/ // Initialize arrays and variables var bullets = []; var obstacles = []; var enemySpawners = []; var ammos = []; var backgroundContainer = game.addChild(new BackgroundContainer()); var civilians = []; var foregroundContainer = game.addChild(new ForegroundContainer()); var ammoUI = foregroundContainer.addChild(new AmmoUI()); var midgroundContainer = game.addChild(new MidgroundContainer()); var player = midgroundContainer.addChild(new Player()); player.x = 2048 / 2; player.y = 2732 - 200; for (var i = 0; i < bullets.length; i++) { midgroundContainer.addChild(bullets[i]); } for (var i = 0; i < enemySpawners.length; i++) { midgroundContainer.addChild(enemySpawners[i]); } for (var i = 0; i < civilians.length; i++) { midgroundContainer.addChild(civilians[i]); } var scoreTxt = new Text2('0', { size: 150, fill: "#ffffff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Handle touch down event game.down = function (x, y, obj) { player.shoot(); }; // Update game state game.update = function () { // Player moves towards the Ammo if (ammos.length > 0) { var dx = ammos[0].x - player.x; var dy = ammos[0].y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); var speed = 10; if (distance > speed) { player.x += dx * speed / distance; player.y += dy * speed / distance; } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { bullets[i].update(); if (bullets[i].y < -50) { bullets[i].destroy(); bullets.splice(i, 1); } } // Update obstacles for (var j = obstacles.length - 1; j >= 0; j--) { obstacles[j].update(); if (obstacles[j].y > 2732 + 50) { obstacles[j].destroy(); obstacles.splice(j, 1); } } // Update explosions for (var e = midgroundContainer.children.length - 1; e >= 0; e--) { if (midgroundContainer.children[e] instanceof Explosion) { midgroundContainer.children[e].update(); // Check for collisions with civilians for (var c = civilians.length - 1; c >= 0; c--) { if (typeof civilians[c].hitboxIntersects === 'function' && midgroundContainer.children[e].hitboxIntersects(civilians[c])) { var newExplosion = new Explosion(); newExplosion.x = civilians[c].x; newExplosion.y = civilians[c].y; midgroundContainer.addChild(newExplosion); civilians[c].destroy(); civilians.splice(c, 1); } } } } // Check for collisions for (var k = bullets.length - 1; k >= 0; k--) { for (var l = enemySpawners.length - 1; l >= 0; l--) { if (bullets[k].intersects(enemySpawners[l])) { bullets[k].destroy(); var explosion = new Explosion(); explosion.x = enemySpawners[l].x; explosion.y = enemySpawners[l].y; midgroundContainer.addChild(explosion); enemySpawners[l].destroy(); bullets.splice(k, 1); enemySpawners.splice(l, 1); // Score update removed from bullet collision break; } } } // Spawn new enemy spawners if (LK.ticks % Math.max(10, 90 - Math.floor(LK.getScore() * 0.2)) == 0) { var newEnemy = new Enemy(); var edge = Math.floor(Math.random() * 4); switch (edge) { case 0: // Top edge newEnemy.x = Math.random() * 2048; newEnemy.y = -50; break; case 1: // Right edge newEnemy.x = 2048 + 50; newEnemy.y = Math.random() * 2732; break; case 2: // Bottom edge newEnemy.x = Math.random() * 2048; newEnemy.y = 2732 + 50; break; case 3: // Left edge newEnemy.x = -50; newEnemy.y = Math.random() * 2732; break; } enemySpawners.push(newEnemy); midgroundContainer.addChild(newEnemy); } // Spawn new civilians if (LK.ticks % 120 == 0 && civilians.length < 5) { var newCivilian = new Civilian(); newCivilian.x = Math.random() * 2048; newCivilian.y = Math.random() * 2732; civilians.push(newCivilian); midgroundContainer.addChild(newCivilian); } // Update civilians for (var c = civilians.length - 1; c >= 0; c--) { civilians[c].update(); } // Spawn new Ammo only when there is no existing Ammo on the screen if (ammos.length == 0) { var newAmmo = new Ammo(); newAmmo.x = 200 + Math.random() * (2048 - 400); newAmmo.y = 200 + Math.random() * (2732 - 400); ammos.push(newAmmo); midgroundContainer.addChild(newAmmo); } // Check for game over for (var m = obstacles.length - 1; m >= 0; m--) { if (obstacles[m].intersects(player)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } for (var n = enemySpawners.length - 1; n >= 0; n--) { if (enemySpawners[n].intersects(player)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } // Check for Ammo collection for (var n = ammos.length - 1; n >= 0; n--) { if (ammos[n].intersects(player)) { ammos[n].destroy(); ammos.splice(n, 1); ammoUI.increaseAmmo(); } } };
===================================================================
--- original.js
+++ change.js
@@ -376,9 +376,9 @@
}
}
}
// Spawn new enemy spawners
- if (LK.ticks % Math.max(10, 90 - Math.floor(LK.getScore() / 2)) == 0) {
+ if (LK.ticks % Math.max(10, 90 - Math.floor(LK.getScore() * 0.2)) == 0) {
var newEnemy = new Enemy();
var edge = Math.floor(Math.random() * 4);
switch (edge) {
case 0:
8-bit pixelated isometric cute watermelon with a rotor above. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit pixelated radial watermelon red juice explosion splash. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit pixelated isometric blueberry-shaped UFO with a cute fruit inside. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit pixelated isometric blueberry projectile. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8-bit pixelated isometric blueberry projectile icon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a minimal and stylized 8-bit pixelated background of an alien village made of pineapple-shaped huts, viewed from a distance so the buildings appear small and occupy a small lower part of the background. The sky should be light blue and occupy the majority of the image, with the huts constructed from various fruits and having primitive shapes. Use a softer color palette to ensure the background does not distract from the main game elements, capturing the essence of classic 8-bit era video games. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.