User prompt
There should be a red line at the at the bottom of the game, and if a zombie touches it, it should indicate that the game is over.
User prompt
There should be a red line at the top of the game and if a zombie touches it, it should say game over.
User prompt
there is a problem when the zombies arrive and all of them are down then the next wave comes
User prompt
there is a problem when the zombies arrive and all of them are down then the next wave comes
Code edit (1 edits merged)
Please save this source code
User prompt
Pixel Zombie Outbreak
Initial prompt
Make a game that has zombies and the player has to shoot them, and make the game pixelated.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.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.xSpeed = 0; // Horizontal speed component for spread shots
self.damage = 1;
self.update = function () {
self.y -= self.speed;
self.x += self.xSpeed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.fireRate = 20; // Frames between shots
self.nextFireTime = 0;
self.weaponPower = 1;
self.update = function () {
// Player update logic will be handled in the game's update function
};
self.takeDamage = function (amount) {
self.health -= amount;
LK.getSound('playerHit').play();
LK.effects.flashObject(self, 0xff0000, 300);
if (self.health <= 0) {
return true; // Return true if player died
}
return false;
};
self.shoot = function () {
if (LK.ticks < self.nextFireTime) {
return;
}
self.nextFireTime = LK.ticks + self.fireRate;
LK.getSound('shoot').play();
if (self.weaponPower === 1) {
// Single bullet
return [createBullet(self.x, self.y - 40)];
} else if (self.weaponPower === 2) {
// Double bullet
return [createBullet(self.x - 20, self.y - 40), createBullet(self.x + 20, self.y - 40)];
} else {
// Triple bullet (spread)
return [createBullet(self.x, self.y - 40), createBullet(self.x - 25, self.y - 35, -0.3), createBullet(self.x + 25, self.y - 35, 0.3)];
}
function createBullet(x, y) {
var xSpeed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var bullet = new Bullet();
bullet.x = x;
bullet.y = y;
bullet.xSpeed = xSpeed;
return bullet;
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = Math.floor(Math.random() * 3); // 0: weapon, 1: fire rate, 2: health
// Set color based on type
if (self.type === 0) {
powerupGraphics.tint = 0xff5733; // Weapon upgrade (orange)
} else if (self.type === 1) {
powerupGraphics.tint = 0x33ff57; // Fire rate (green)
} else {
powerupGraphics.tint = 0x3357ff; // Health (blue)
}
self.speed = 3;
self.update = function () {
self.y += self.speed;
};
self.applyEffect = function (player) {
LK.getSound('powerupCollect').play();
if (self.type === 0) {
// Weapon upgrade
player.weaponPower = Math.min(player.weaponPower + 1, 3);
} else if (self.type === 1) {
// Fire rate increase
player.fireRate = Math.max(player.fireRate - 5, 5);
} else {
// Health
player.health = Math.min(player.health + 25, 100);
}
};
return self;
});
var RedLine = Container.expand(function () {
var self = Container.call(this);
// Create a red line that spans the width of the game
var graphics = self.attachAsset('redLine', {
anchorX: 0,
anchorY: 0
});
return self;
});
var Zombie = Container.expand(function () {
var self = Container.call(this);
var zombieGraphics = self.attachAsset('zombie', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.health = 2;
self.value = 10; // Score value
self.update = function () {
self.y += self.speed;
};
self.takeDamage = function (amount) {
self.health -= amount;
LK.getSound('zombieHit').play();
LK.effects.flashObject(self, 0xffff00, 100);
if (self.health <= 0) {
return true; // Return true if zombie died
}
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game state variables
var player;
var bullets = [];
var zombies = [];
var powerups = [];
var wave = 1;
var waveZombiesRemaining = 0;
var nextWaveTimeout = null;
var spawnCooldown = 0;
var score = 0;
var gameActive = true;
// UI elements
var scoreTxt;
var healthTxt;
var waveTxt;
function initGame() {
// Reset game state
bullets = [];
zombies = [];
powerups = [];
wave = 1;
waveZombiesRemaining = 5;
spawnCooldown = 0;
score = 0;
gameActive = true;
// Set score
LK.setScore(0);
// Create player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 200;
game.addChild(player);
// Setup UI
setupUI();
// Start background music
LK.playMusic('bgMusic');
// Create red line at the bottom of the screen
var redLine = new RedLine();
redLine.x = 0;
redLine.y = 2732 - 100; // Position slightly above the bottom
game.addChild(redLine);
}
function setupUI() {
// Score Text
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
// Health Text
healthTxt = new Text2('Health: 100', {
size: 80,
fill: 0xFFFFFF
});
healthTxt.anchor.set(0, 0);
LK.gui.top.addChild(healthTxt);
// Wave Text
waveTxt = new Text2('Wave: 1', {
size: 80,
fill: 0xFFFFFF
});
waveTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(waveTxt);
// Reposition for better visibility
scoreTxt.x = -20;
scoreTxt.y = 20;
healthTxt.y = 20;
waveTxt.x = 120; // Avoid the top-left menu icon area
waveTxt.y = 20;
}
function updateUI() {
scoreTxt.setText('Score: ' + score);
healthTxt.setText('Health: ' + player.health);
waveTxt.setText('Wave: ' + wave);
}
function spawnZombie() {
var zombie = new Zombie();
// Randomize zombie properties based on wave
zombie.x = Math.random() * (2048 - 200) + 100;
zombie.y = -100;
zombie.speed = 2 + Math.random() * (wave * 0.5);
zombie.health = 1 + Math.floor(wave / 3);
zombie.value = 10 + wave * 2;
// Scale difficulty
if (wave > 5) {
zombie.speed *= 1.2;
}
zombies.push(zombie);
game.addChild(zombie);
waveZombiesRemaining--;
}
function spawnPowerUp() {
if (Math.random() < 0.3) {
var powerup = new PowerUp();
powerup.x = Math.random() * (2048 - 200) + 100;
powerup.y = -100;
powerups.push(powerup);
game.addChild(powerup);
}
}
function startNextWave() {
wave++;
waveZombiesRemaining = 5 + wave * 2;
LK.effects.flashScreen(0x0000ff, 500);
}
function handlePlayerMovement(x, y) {
if (!gameActive) {
return;
}
player.x = Math.max(50, Math.min(x, 2048 - 50));
player.y = Math.max(50, Math.min(y, 2732 - 50));
}
function handleCollisions() {
// Bullet-Zombie collisions
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
for (var j = zombies.length - 1; j >= 0; j--) {
var zombie = zombies[j];
if (bullet.intersects(zombie)) {
if (zombie.takeDamage(bullet.damage)) {
// Zombie killed
score += zombie.value;
LK.setScore(score);
// Chance to spawn powerup
if (Math.random() < 0.1) {
spawnPowerUp();
}
zombies.splice(j, 1);
zombie.destroy();
}
bullets.splice(i, 1);
bullet.destroy();
break;
}
}
}
// Player-Zombie collisions
for (var j = zombies.length - 1; j >= 0; j--) {
var zombie = zombies[j];
if (player.intersects(zombie)) {
if (player.takeDamage(10)) {
// Player died
gameActive = false;
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
zombies.splice(j, 1);
zombie.destroy();
}
}
// Player-PowerUp collisions
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
if (player.intersects(powerup)) {
powerup.applyEffect(player);
powerups.splice(k, 1);
powerup.destroy();
}
}
}
function cleanupOffscreenObjects() {
// Remove bullets that are off-screen
for (var i = bullets.length - 1; i >= 0; i--) {
if (bullets[i].y < -50) {
bullets[i].destroy();
bullets.splice(i, 1);
}
}
// Remove zombies that are off-screen at the bottom or touching the red line
for (var j = zombies.length - 1; j >= 0; j--) {
var zombie = zombies[j];
if (zombie.y > 2732 + 50) {
zombie.destroy();
zombies.splice(j, 1);
// Penalty for letting zombies through
score = Math.max(0, score - 5);
LK.setScore(score);
} else if (zombie.y >= 2732 - 110 && zombie.y <= 2732 - 90) {
// Zombie has touched the red line at the bottom
gameActive = false;
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
}
// Remove powerups that are off-screen
for (var k = powerups.length - 1; k >= 0; k--) {
if (powerups[k].y > 2732 + 50) {
powerups[k].destroy();
powerups.splice(k, 1);
}
}
}
// Event handlers
game.down = function (x, y, obj) {
handlePlayerMovement(x, y);
// Shoot when touching
if (gameActive) {
var newBullets = player.shoot();
if (newBullets) {
bullets = bullets.concat(newBullets);
newBullets.forEach(function (bullet) {
game.addChild(bullet);
});
}
}
};
game.move = function (x, y, obj) {
handlePlayerMovement(x, y);
};
game.up = function (x, y, obj) {
// Nothing specific needed for up event
};
// Game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Spawn zombies
if (waveZombiesRemaining > 0) {
spawnCooldown--;
if (spawnCooldown <= 0) {
spawnZombie();
spawnCooldown = Math.max(10, 60 - wave * 5); // Spawn faster as waves progress
}
} else if (zombies.length === 0 && waveZombiesRemaining <= 0 && !nextWaveTimeout) {
// Start next wave if all zombies are cleared and none remaining to spawn
// Use timeout to prevent multiple wave starts
nextWaveTimeout = LK.setTimeout(function () {
startNextWave();
nextWaveTimeout = null;
}, 1000); // 1 second delay between waves
}
// Auto-fire
if (LK.ticks % 5 === 0) {
var newBullets = player.shoot();
if (newBullets) {
bullets = bullets.concat(newBullets);
newBullets.forEach(function (bullet) {
game.addChild(bullet);
});
}
}
// Update game objects
for (var i = 0; i < bullets.length; i++) {
bullets[i].update();
}
for (var j = 0; j < zombies.length; j++) {
zombies[j].update();
}
for (var k = 0; k < powerups.length; k++) {
powerups[k].update();
}
// Handle collisions
handleCollisions();
// Cleanup off-screen objects
cleanupOffscreenObjects();
// Update UI
updateUI();
};
// Initialize the game
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -183,12 +183,12 @@
// Setup UI
setupUI();
// Start background music
LK.playMusic('bgMusic');
- // Create red line at the top of the screen
+ // Create red line at the bottom of the screen
var redLine = new RedLine();
redLine.x = 0;
- redLine.y = 100; // Position slightly below the top to make it visible
+ redLine.y = 2732 - 100; // Position slightly above the bottom
game.addChild(redLine);
}
function setupUI() {
// Score Text
@@ -327,10 +327,10 @@
zombies.splice(j, 1);
// Penalty for letting zombies through
score = Math.max(0, score - 5);
LK.setScore(score);
- } else if (zombie.y >= 100 && zombie.y <= 110) {
- // Zombie has touched the red line
+ } else if (zombie.y >= 2732 - 110 && zombie.y <= 2732 - 90) {
+ // Zombie has touched the red line at the bottom
gameActive = false;
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();