/**** * 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