/****
* Classes
****/
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletSprite = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
flipY: 1 // flip vertically
});
// Target coordinates for the bullet
self.targetX = null;
self.targetY = null;
self.speed = 48; // pixels per frame, positive value
self.dirX = 0;
self.dirY = -1;
self.setTarget = function (tx, ty) {
// Calculate direction vector
var dx = tx - self.x;
var dy = ty - self.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0) {
self.dirX = dx / len;
self.dirY = dy / len;
} else {
self.dirX = 0;
self.dirY = -1;
}
self.targetX = tx;
self.targetY = ty;
};
self.update = function () {
// Store lastX/lastY for event triggers
if (typeof self.lastX === "undefined") self.lastX = self.x;
if (typeof self.lastY === "undefined") self.lastY = self.y;
// Move in direction
self.x += self.dirX * self.speed;
self.y += self.dirY * self.speed;
// Rotate bullet sprite to face movement direction
if (self.dirX !== 0 || self.dirY !== 0) {
// atan2 returns angle in radians, 0 is to the right, so subtract Math.PI/2 to make 0 point up
bulletSprite.rotation = Math.atan2(self.dirY, self.dirX) - Math.PI / 2;
}
// Update lastX/lastY for next frame
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
// Bulletpowerup class
var Bulletpowerup = Container.expand(function () {
var self = Container.call(this);
var bpSprite = self.attachAsset('Bulletpowerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = bpSprite.width * 0.5;
self.speed = 16 + Math.random() * 6;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemySprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = enemySprite.width * 0.5;
self.speed = 3 + Math.random() * 3; // much slower zombies
self.update = function () {
self.y += self.speed;
// No horizontal movement, no bouncing, no direction change
};
return self;
});
// FastZombie class
var FastZombie = Container.expand(function () {
var self = Container.call(this);
var fastZombieSprite = self.attachAsset('FastZombie', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = fastZombieSprite.width * 0.5;
self.speed = 10 + Math.random() * 4; // much faster than normal zombies
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsSprite = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsSprite.width;
self.height = obsSprite.height;
self.speed = 12 + Math.random() * 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = playerSprite.width * 0.5;
self.lives = 3;
self.invincible = false;
self.invincibleTicks = 0;
self.shootCooldown = 0;
self.update = function () {
if (self.invincible) {
self.invincibleTicks--;
if (self.invincibleTicks <= 0) {
self.invincible = false;
playerSprite.alpha = 1;
} else {
// Flicker effect
playerSprite.alpha = LK.ticks % 10 < 5 ? 0.4 : 1;
}
}
if (self.shootCooldown > 0) self.shootCooldown--;
};
// Called when player is hit
self.hit = function () {
if (self.invincible) return;
self.lives--;
self.invincible = true;
self.invincibleTicks = 90; // 1.5 seconds
playerSprite.alpha = 0.4;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('hit').play();
};
// Called when player picks up a powerup
self.powerup = function () {
self.invincible = true;
self.invincibleTicks = 180; // 3 seconds
playerSprite.alpha = 0.4;
LK.getSound('powerup').play();
};
return self;
});
// Powerup class
var Powerup = Container.expand(function () {
var self = Container.call(this);
var puSprite = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = puSprite.width * 0.5;
self.speed = 10;
// Add hit counter
self.hits = 0;
self.update = function () {
self.y += self.speed;
};
// Called when powerup is hit by bullet
self.hit = function () {
self.hits++;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Game state variables
// Player character: blue box
// Enemy: red ellipse
// Obstacle: orange box
// Bullet: yellow box
// Powerup: green ellipse
// Sound effects
// Music
var player;
var bullets = [];
var enemies = [];
// Removed obstacles array as obstacles are deleted from the game
var powerups = [];
var bulletpowerups = [];
var bulletpowerupActive = false;
var bulletpowerupTimer = 0;
var dragNode = null;
var lastTouch = {
x: 0,
y: 0
};
var scoreTxt, livesTxt;
var spawnTick = 0;
var difficulty = 1;
var gameOver = false;
// Goal object at the bottom
var goalObj = null;
// UI
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
livesTxt = new Text2('♥♥♥', {
size: 90,
fill: 0xFF5252
});
livesTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(livesTxt);
// Start music
LK.playMusic('arcadebg');
// Create player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 350;
game.addChild(player);
// Create goal object at the bottom center
goalObj = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 - 100,
scaleX: 1.2,
scaleY: 1.2
});
game.addChild(goalObj);
// Helper: update lives display
function updateLives() {
var s = '';
for (var i = 0; i < player.lives; i++) s += '♥';
livesTxt.setText(s);
}
// Helper: spawn enemy
function spawnEnemy() {
var e = new Enemy();
e.x = 200 + Math.random() * (2048 - 400);
e.y = -100;
enemies.push(e);
game.addChild(e);
}
// Removed spawnObstacle function as obstacles are deleted from the game
// Powerup spawn helper removed as per requirements
// Touch controls: drag player
game.down = function (x, y, obj) {
// Don't allow drag from top left 100x100
if (x < 100 && y < 100) return;
if (player && !gameOver) {
dragNode = player;
lastTouch.x = x;
lastTouch.y = y;
}
};
game.move = function (x, y, obj) {
if (dragNode && !gameOver) {
// Player movement disabled: do not update player.x or player.y
lastTouch.x = x;
lastTouch.y = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Tap to shoot (anywhere except top left 100x100)
game.on('down', function (x, y, obj) {
if (x < 100 && y < 100) return;
if (player && !gameOver && player.shootCooldown <= 0) {
if (bulletpowerupActive) {
// Shoot five bullets with slight angle spread
var angle = Math.atan2(y - player.y, x - player.x);
var spread = Math.PI / 16; // ~11.25 degrees
for (var i = -2; i <= 2; i++) {
var b = new Bullet();
b.x = player.x;
b.y = player.y - player.radius - 20;
// Calculate new target with spread
var targetAngle = angle + i * spread;
var dist = 1000;
var tx = player.x + Math.cos(targetAngle) * dist;
var ty = player.y + Math.sin(targetAngle) * dist;
b.setTarget(tx, ty);
bullets.push(b);
game.addChild(b);
}
player.shootCooldown = 12; // 0.2s
LK.getSound('shoot').play();
} else {
var b = new Bullet();
b.x = player.x;
b.y = player.y - player.radius - 20;
b.setTarget(x, y); // Set bullet direction toward tap
bullets.push(b);
game.addChild(b);
player.shootCooldown = 12; // 0.2s
LK.getSound('shoot').play();
}
}
});
// Main game loop
game.update = function () {
if (gameOver) return;
// Increase difficulty over time
// Increase zombie spawn rate by 10% for every 50 points scored
var newDifficulty = 1 + Math.floor(LK.getScore() / 50) * 0.1;
if (newDifficulty !== difficulty) {
difficulty = newDifficulty;
}
// Player update
player.update();
// Spawn logic
spawnTick++;
if (spawnTick % 30 === 0) {
// increased spawn rate, higher chance for more zombies
if (Math.random() < 0.85 * difficulty) spawnEnemy();
if (Math.random() < 0.25 * difficulty) spawnEnemy(); // sometimes spawn a second zombie
// FastZombie: 15% base chance, scales with difficulty, only after score >= 25
if (LK.getScore() >= 25 && Math.random() < 0.15 * difficulty) {
var fz = new FastZombie();
fz.x = 200 + Math.random() * (2048 - 400);
fz.y = -100;
enemies.push(fz);
game.addChild(fz);
}
}
// Powerup spawn: 5% chance every spawn tick, but only after score >= 100
if (spawnTick % 40 === 0 && LK.getScore() >= 100) {
if (Math.random() < 0.05) {
var p = new Powerup();
p.x = 200 + Math.random() * (2048 - 400);
p.y = -100;
powerups.push(p);
game.addChild(p);
}
// Bulletpowerup spawn: 1% chance every spawn tick, at any score
if (Math.random() < 0.01) {
var bp = new Bulletpowerup();
bp.x = 200 + Math.random() * (2048 - 400);
bp.y = -100;
bulletpowerups.push(bp);
game.addChild(bp);
}
}
// Bulletpowerup timer logic
// bulletpowerupActive is now permanent once collected; timer logic removed
// Bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var b = bullets[i];
b.update();
if (b.y < -60) {
b.destroy();
bullets.splice(i, 1);
continue;
}
// Bullet hits enemy
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
if (b.intersects(e)) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
LK.getSound('enemyDown').play();
e.destroy();
enemies.splice(j, 1);
b.destroy();
bullets.splice(i, 1);
break;
}
}
// Bullet hits powerup
for (var k = powerups.length - 1; k >= 0; k--) {
var p = powerups[k];
if (b.intersects(p)) {
if (typeof p.hits === "undefined") p.hits = 0;
if (typeof p.hit === "function") p.hit();
// Add 3 points to score when powerup is hit by bullet
LK.setScore(LK.getScore() + 3);
scoreTxt.setText(LK.getScore());
if (p.hits >= 5) {
p.destroy();
powerups.splice(k, 1);
}
b.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
e.update();
// Enemy reaches goal object
if (goalObj && e.intersects(goalObj)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
e.destroy();
enemies.splice(i, 1);
continue;
}
if (e.y > 2732 + 100) {
e.destroy();
enemies.splice(i, 1);
continue;
}
// Enemy hits player
if (e.intersects(player)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
e.destroy();
enemies.splice(i, 1);
}
}
// Obstacles removed from game
// Powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
p.update();
// Remove if off screen
if (p.y > 2732 + 100) {
p.destroy();
powerups.splice(i, 1);
continue;
}
// Powerup hits player: remove life
if (p.intersects(player)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
LK.getSound('powerup').play();
p.destroy();
powerups.splice(i, 1);
continue;
}
// Powerup hits obstacle: remove life
if (p.intersects(goalObj)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
LK.getSound('powerup').play();
p.destroy();
powerups.splice(i, 1);
continue;
}
}
// Bulletpowerups
for (var i = bulletpowerups.length - 1; i >= 0; i--) {
var bp = bulletpowerups[i];
bp.update();
// Remove if off screen
if (bp.y > 2732 + 100) {
bp.destroy();
bulletpowerups.splice(i, 1);
continue;
}
// Handle collision with player
if (bp.intersects(player)) {
bulletpowerupActive = true;
LK.getSound('powerup').play();
bp.destroy();
bulletpowerups.splice(i, 1);
continue;
}
}
};
// Score display
scoreTxt.setText(LK.getScore());
updateLives(); /****
* Classes
****/
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletSprite = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
flipY: 1 // flip vertically
});
// Target coordinates for the bullet
self.targetX = null;
self.targetY = null;
self.speed = 48; // pixels per frame, positive value
self.dirX = 0;
self.dirY = -1;
self.setTarget = function (tx, ty) {
// Calculate direction vector
var dx = tx - self.x;
var dy = ty - self.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0) {
self.dirX = dx / len;
self.dirY = dy / len;
} else {
self.dirX = 0;
self.dirY = -1;
}
self.targetX = tx;
self.targetY = ty;
};
self.update = function () {
// Store lastX/lastY for event triggers
if (typeof self.lastX === "undefined") self.lastX = self.x;
if (typeof self.lastY === "undefined") self.lastY = self.y;
// Move in direction
self.x += self.dirX * self.speed;
self.y += self.dirY * self.speed;
// Rotate bullet sprite to face movement direction
if (self.dirX !== 0 || self.dirY !== 0) {
// atan2 returns angle in radians, 0 is to the right, so subtract Math.PI/2 to make 0 point up
bulletSprite.rotation = Math.atan2(self.dirY, self.dirX) - Math.PI / 2;
}
// Update lastX/lastY for next frame
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
// Bulletpowerup class
var Bulletpowerup = Container.expand(function () {
var self = Container.call(this);
var bpSprite = self.attachAsset('Bulletpowerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = bpSprite.width * 0.5;
self.speed = 16 + Math.random() * 6;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemySprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = enemySprite.width * 0.5;
self.speed = 3 + Math.random() * 3; // much slower zombies
self.update = function () {
self.y += self.speed;
// No horizontal movement, no bouncing, no direction change
};
return self;
});
// FastZombie class
var FastZombie = Container.expand(function () {
var self = Container.call(this);
var fastZombieSprite = self.attachAsset('FastZombie', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = fastZombieSprite.width * 0.5;
self.speed = 10 + Math.random() * 4; // much faster than normal zombies
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsSprite = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsSprite.width;
self.height = obsSprite.height;
self.speed = 12 + Math.random() * 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = playerSprite.width * 0.5;
self.lives = 3;
self.invincible = false;
self.invincibleTicks = 0;
self.shootCooldown = 0;
self.update = function () {
if (self.invincible) {
self.invincibleTicks--;
if (self.invincibleTicks <= 0) {
self.invincible = false;
playerSprite.alpha = 1;
} else {
// Flicker effect
playerSprite.alpha = LK.ticks % 10 < 5 ? 0.4 : 1;
}
}
if (self.shootCooldown > 0) self.shootCooldown--;
};
// Called when player is hit
self.hit = function () {
if (self.invincible) return;
self.lives--;
self.invincible = true;
self.invincibleTicks = 90; // 1.5 seconds
playerSprite.alpha = 0.4;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('hit').play();
};
// Called when player picks up a powerup
self.powerup = function () {
self.invincible = true;
self.invincibleTicks = 180; // 3 seconds
playerSprite.alpha = 0.4;
LK.getSound('powerup').play();
};
return self;
});
// Powerup class
var Powerup = Container.expand(function () {
var self = Container.call(this);
var puSprite = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = puSprite.width * 0.5;
self.speed = 10;
// Add hit counter
self.hits = 0;
self.update = function () {
self.y += self.speed;
};
// Called when powerup is hit by bullet
self.hit = function () {
self.hits++;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Game state variables
// Player character: blue box
// Enemy: red ellipse
// Obstacle: orange box
// Bullet: yellow box
// Powerup: green ellipse
// Sound effects
// Music
var player;
var bullets = [];
var enemies = [];
// Removed obstacles array as obstacles are deleted from the game
var powerups = [];
var bulletpowerups = [];
var bulletpowerupActive = false;
var bulletpowerupTimer = 0;
var dragNode = null;
var lastTouch = {
x: 0,
y: 0
};
var scoreTxt, livesTxt;
var spawnTick = 0;
var difficulty = 1;
var gameOver = false;
// Goal object at the bottom
var goalObj = null;
// UI
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
livesTxt = new Text2('♥♥♥', {
size: 90,
fill: 0xFF5252
});
livesTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(livesTxt);
// Start music
LK.playMusic('arcadebg');
// Create player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 350;
game.addChild(player);
// Create goal object at the bottom center
goalObj = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 - 100,
scaleX: 1.2,
scaleY: 1.2
});
game.addChild(goalObj);
// Helper: update lives display
function updateLives() {
var s = '';
for (var i = 0; i < player.lives; i++) s += '♥';
livesTxt.setText(s);
}
// Helper: spawn enemy
function spawnEnemy() {
var e = new Enemy();
e.x = 200 + Math.random() * (2048 - 400);
e.y = -100;
enemies.push(e);
game.addChild(e);
}
// Removed spawnObstacle function as obstacles are deleted from the game
// Powerup spawn helper removed as per requirements
// Touch controls: drag player
game.down = function (x, y, obj) {
// Don't allow drag from top left 100x100
if (x < 100 && y < 100) return;
if (player && !gameOver) {
dragNode = player;
lastTouch.x = x;
lastTouch.y = y;
}
};
game.move = function (x, y, obj) {
if (dragNode && !gameOver) {
// Player movement disabled: do not update player.x or player.y
lastTouch.x = x;
lastTouch.y = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Tap to shoot (anywhere except top left 100x100)
game.on('down', function (x, y, obj) {
if (x < 100 && y < 100) return;
if (player && !gameOver && player.shootCooldown <= 0) {
if (bulletpowerupActive) {
// Shoot five bullets with slight angle spread
var angle = Math.atan2(y - player.y, x - player.x);
var spread = Math.PI / 16; // ~11.25 degrees
for (var i = -2; i <= 2; i++) {
var b = new Bullet();
b.x = player.x;
b.y = player.y - player.radius - 20;
// Calculate new target with spread
var targetAngle = angle + i * spread;
var dist = 1000;
var tx = player.x + Math.cos(targetAngle) * dist;
var ty = player.y + Math.sin(targetAngle) * dist;
b.setTarget(tx, ty);
bullets.push(b);
game.addChild(b);
}
player.shootCooldown = 12; // 0.2s
LK.getSound('shoot').play();
} else {
var b = new Bullet();
b.x = player.x;
b.y = player.y - player.radius - 20;
b.setTarget(x, y); // Set bullet direction toward tap
bullets.push(b);
game.addChild(b);
player.shootCooldown = 12; // 0.2s
LK.getSound('shoot').play();
}
}
});
// Main game loop
game.update = function () {
if (gameOver) return;
// Increase difficulty over time
// Increase zombie spawn rate by 10% for every 50 points scored
var newDifficulty = 1 + Math.floor(LK.getScore() / 50) * 0.1;
if (newDifficulty !== difficulty) {
difficulty = newDifficulty;
}
// Player update
player.update();
// Spawn logic
spawnTick++;
if (spawnTick % 30 === 0) {
// increased spawn rate, higher chance for more zombies
if (Math.random() < 0.85 * difficulty) spawnEnemy();
if (Math.random() < 0.25 * difficulty) spawnEnemy(); // sometimes spawn a second zombie
// FastZombie: 15% base chance, scales with difficulty, only after score >= 25
if (LK.getScore() >= 25 && Math.random() < 0.15 * difficulty) {
var fz = new FastZombie();
fz.x = 200 + Math.random() * (2048 - 400);
fz.y = -100;
enemies.push(fz);
game.addChild(fz);
}
}
// Powerup spawn: 5% chance every spawn tick, but only after score >= 100
if (spawnTick % 40 === 0 && LK.getScore() >= 100) {
if (Math.random() < 0.05) {
var p = new Powerup();
p.x = 200 + Math.random() * (2048 - 400);
p.y = -100;
powerups.push(p);
game.addChild(p);
}
// Bulletpowerup spawn: 1% chance every spawn tick, at any score
if (Math.random() < 0.01) {
var bp = new Bulletpowerup();
bp.x = 200 + Math.random() * (2048 - 400);
bp.y = -100;
bulletpowerups.push(bp);
game.addChild(bp);
}
}
// Bulletpowerup timer logic
// bulletpowerupActive is now permanent once collected; timer logic removed
// Bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var b = bullets[i];
b.update();
if (b.y < -60) {
b.destroy();
bullets.splice(i, 1);
continue;
}
// Bullet hits enemy
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
if (b.intersects(e)) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
LK.getSound('enemyDown').play();
e.destroy();
enemies.splice(j, 1);
b.destroy();
bullets.splice(i, 1);
break;
}
}
// Bullet hits powerup
for (var k = powerups.length - 1; k >= 0; k--) {
var p = powerups[k];
if (b.intersects(p)) {
if (typeof p.hits === "undefined") p.hits = 0;
if (typeof p.hit === "function") p.hit();
// Add 3 points to score when powerup is hit by bullet
LK.setScore(LK.getScore() + 3);
scoreTxt.setText(LK.getScore());
if (p.hits >= 5) {
p.destroy();
powerups.splice(k, 1);
}
b.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
e.update();
// Enemy reaches goal object
if (goalObj && e.intersects(goalObj)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
e.destroy();
enemies.splice(i, 1);
continue;
}
if (e.y > 2732 + 100) {
e.destroy();
enemies.splice(i, 1);
continue;
}
// Enemy hits player
if (e.intersects(player)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
e.destroy();
enemies.splice(i, 1);
}
}
// Obstacles removed from game
// Powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
p.update();
// Remove if off screen
if (p.y > 2732 + 100) {
p.destroy();
powerups.splice(i, 1);
continue;
}
// Powerup hits player: remove life
if (p.intersects(player)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
LK.getSound('powerup').play();
p.destroy();
powerups.splice(i, 1);
continue;
}
// Powerup hits obstacle: remove life
if (p.intersects(goalObj)) {
if (!player.invincible) {
player.hit();
updateLives();
if (player.lives <= 0) {
gameOver = true;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
LK.getSound('powerup').play();
p.destroy();
powerups.splice(i, 1);
continue;
}
}
// Bulletpowerups
for (var i = bulletpowerups.length - 1; i >= 0; i--) {
var bp = bulletpowerups[i];
bp.update();
// Remove if off screen
if (bp.y > 2732 + 100) {
bp.destroy();
bulletpowerups.splice(i, 1);
continue;
}
// Handle collision with player
if (bp.intersects(player)) {
bulletpowerupActive = true;
LK.getSound('powerup').play();
bp.destroy();
bulletpowerups.splice(i, 1);
continue;
}
}
};
// Score display
scoreTxt.setText(LK.getScore());
updateLives();
soldier pixel. In-Game asset. 2d. High contrast. No shadows
pixel ammo. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
pixel zombie character. In-Game asset. 2d. High contrast. No shadows
pixel brick wall. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Red zombie pixel. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
blood pixel. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
pixel shotgun. In-Game asset. 2d. High contrast. No shadows