/****
* 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.damage = 20;
self.direction = {
x: 0,
y: -1
}; // Default direction: up
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.health = 100;
self.maxHealth = 100;
self.fireRate = 20; // Frames between shots
self.fireCounter = 0;
self.invincible = false;
self.invincibleTimer = 0;
self.weaponPowerLevel = 1;
self.weaponPowerTimer = 0;
self.takeDamage = function (amount) {
if (self.invincible) {
return;
}
self.health -= amount;
if (self.health <= 0) {
self.health = 0;
gameOver();
}
// Flash player on hit
LK.effects.flashObject(self, 0xff0000, 500);
// Make player invincible for a short time
self.invincible = true;
self.invincibleTimer = 60; // 1 second at 60fps
// Play hit sound
LK.getSound('playerHit').play();
// Update health bar
updateHealthBar();
};
self.collectPowerup = function (type) {
LK.getSound('powerupCollect').play();
if (type === 'health') {
self.health = Math.min(self.health + 20, self.maxHealth);
updateHealthBar();
} else if (type === 'weapon') {
self.weaponPowerLevel = 2;
self.weaponPowerTimer = 300; // 5 seconds at 60fps
}
};
self.update = function () {
// Handle invincibility
if (self.invincible) {
self.invincibleTimer--;
// Flicker effect
self.alpha = self.invincibleTimer % 10 < 5 ? 0.5 : 1;
if (self.invincibleTimer <= 0) {
self.invincible = false;
self.alpha = 1;
}
}
// Handle weapon power timer
if (self.weaponPowerLevel > 1) {
self.weaponPowerTimer--;
if (self.weaponPowerTimer <= 0) {
self.weaponPowerLevel = 1;
}
}
// Update fire counter
if (self.fireCounter > 0) {
self.fireCounter--;
}
};
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 = 'health'; // Can be: health, weapon
self.lifetime = 300; // 5 seconds at 60fps
self.init = function (type) {
self.type = type || (Math.random() < 0.7 ? 'health' : 'weapon');
if (self.type === 'health') {
powerupGraphics.tint = 0x2ecc71; // Green
} else if (self.type === 'weapon') {
powerupGraphics.tint = 0xf39c12; // Orange
}
};
self.update = function () {
// Subtle floating animation
self.y += Math.sin(LK.ticks * 0.1) * 0.5;
// Fade out when about to disappear
if (self.lifetime < 60) {
self.alpha = self.lifetime / 60;
}
self.lifetime--;
};
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 = 40;
self.damage = 10;
self.hitTimer = 0;
self.type = 'normal'; // Can be: normal, fast, tank
self.init = function (type) {
self.type = type || 'normal';
// Set zombie properties based on type
if (self.type === 'fast') {
self.speed = 3.5;
self.health = 25;
zombieGraphics.tint = 0xe74c3c; // Red tint
} else if (self.type === 'tank') {
self.speed = 1.2;
self.health = 80;
self.damage = 20;
zombieGraphics.tint = 0x8e44ad; // Purple tint
zombieGraphics.scale.set(1.4, 1.4);
}
};
self.takeDamage = function (damage) {
self.health -= damage;
// Flash zombie on hit
LK.effects.flashObject(self, 0xff0000, 200);
// Play hit sound
LK.getSound('zombieHit').play();
if (self.health <= 0) {
// Add to score
var scoreValue = self.type === 'normal' ? 10 : self.type === 'fast' ? 15 : 25;
LK.setScore(LK.getScore() + scoreValue);
updateScoreDisplay();
// Chance to spawn a powerup
if (Math.random() < 0.1) {
spawnPowerup(self.x, self.y);
}
return true; // Zombie is dead
}
return false; // Zombie still alive
};
self.update = function () {
// Move towards player
if (player) {
var dx = player.x - self.x;
var dy = player.y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
}
// Attack player on collision
if (self.hitTimer <= 0 && self.intersects(player)) {
player.takeDamage(self.damage);
self.hitTimer = 30; // Half second cooldown
}
if (self.hitTimer > 0) {
self.hitTimer--;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x34495e
});
/****
* Game Code
****/
// Game variables
var player;
var bullets = [];
var zombies = [];
var powerups = [];
var waveNumber = 1;
var zombiesInWave = 5;
var waveTimer = 0;
var spawnDelay = 60; // 1 second between zombie spawns
var spawnCounter = 0;
var zombiesSpawned = 0;
var waveCooldown = false;
var gameStarted = false;
var healthBar;
var healthBarBg;
var scoreText;
var waveText;
// Setup game
function setupGame() {
// Create player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 300;
game.addChild(player);
// Create health bar background
healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 - 100
});
LK.gui.bottom.addChild(healthBarBg);
// Create health bar
healthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0.5,
x: 2048 / 2 - 200,
y: 2732 - 100
});
LK.gui.bottom.addChild(healthBar);
// Create score text
scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
// Create wave text
waveText = new Text2('Wave: 1', {
size: 80,
fill: 0xFFFFFF
});
waveText.anchor.set(0, 0);
LK.gui.topRight.x -= 200; // Move right a bit to avoid topLeft corner
LK.gui.topRight.addChild(waveText);
// Reset game state
LK.setScore(0);
updateScoreDisplay();
bullets = [];
zombies = [];
powerups = [];
waveNumber = 1;
zombiesInWave = 5;
waveTimer = 180; // 3 second delay before first wave
spawnCounter = 0;
zombiesSpawned = 0;
waveCooldown = false;
gameStarted = true;
// Play background music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
}
// Update score display
function updateScoreDisplay() {
scoreText.setText('Score: ' + LK.getScore());
}
// Update wave display
function updateWaveDisplay() {
waveText.setText('Wave: ' + waveNumber);
}
// Update health bar
function updateHealthBar() {
if (player) {
var healthPercentage = player.health / player.maxHealth;
healthBar.scale.x = healthPercentage;
}
}
// Spawn a zombie
function spawnZombie() {
var zombie = new Zombie();
// Determine zombie type based on wave and randomness
var zombieType = 'normal';
var rand = Math.random();
if (waveNumber >= 3) {
if (rand < 0.2) {
zombieType = 'fast';
} else if (waveNumber >= 5 && rand < 0.3) {
zombieType = 'tank';
}
}
zombie.init(zombieType);
// Position zombie at a random edge of the screen
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
zombie.x = Math.random() * 2048;
zombie.y = -50;
break;
case 1:
// Right
zombie.x = 2048 + 50;
zombie.y = Math.random() * 2732;
break;
case 2:
// Bottom
zombie.x = Math.random() * 2048;
zombie.y = 2732 + 50;
break;
case 3:
// Left
zombie.x = -50;
zombie.y = Math.random() * 2732;
break;
}
zombies.push(zombie);
game.addChild(zombie);
zombiesSpawned++;
}
// Spawn a powerup at the given position
function spawnPowerup(x, y) {
var powerup = new Powerup();
powerup.x = x;
powerup.y = y;
powerup.init();
powerups.push(powerup);
game.addChild(powerup);
}
// Fire a bullet
function fireBullet() {
if (!player || player.fireCounter > 0) {
return;
}
LK.getSound('shoot').play();
// Handle different weapon power levels
if (player.weaponPowerLevel === 1) {
// Single bullet
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y - 50;
bullets.push(bullet);
game.addChild(bullet);
} else if (player.weaponPowerLevel === 2) {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y - 50;
var angle = i * Math.PI / 8;
bullet.direction = {
x: Math.sin(angle),
y: -Math.cos(angle)
};
bullets.push(bullet);
game.addChild(bullet);
}
}
player.fireCounter = player.fireRate;
}
// Game over function
function gameOver() {
LK.effects.flashScreen(0xff0000, 1000);
LK.stopMusic();
LK.showGameOver();
}
// Drag functionality
var isDragging = false;
// Mouse/touch down
game.down = function (x, y, obj) {
if (!gameStarted) {
setupGame();
return;
}
isDragging = true;
fireBullet();
};
// Mouse/touch up
game.up = function (x, y, obj) {
isDragging = false;
};
// Mouse/touch move
game.move = function (x, y, obj) {
if (isDragging && player) {
player.x = x;
player.y = y;
// Keep player within boundaries
player.x = Math.max(60, Math.min(player.x, 2048 - 60));
player.y = Math.max(60, Math.min(player.y, 2732 - 60));
}
};
// Main update function
game.update = function () {
if (!gameStarted) {
return;
}
// Wave management
if (waveTimer > 0) {
waveTimer--;
if (waveTimer === 0 && waveCooldown) {
// Start next wave
waveNumber++;
updateWaveDisplay();
zombiesInWave = 5 + waveNumber * 2;
zombiesSpawned = 0;
waveCooldown = false;
}
}
// Spawn zombies
if (!waveCooldown && zombiesSpawned < zombiesInWave) {
spawnCounter++;
if (spawnCounter >= spawnDelay) {
spawnCounter = 0;
spawnZombie();
}
}
// Check if wave is complete
if (!waveCooldown && zombiesSpawned >= zombiesInWave && zombies.length === 0) {
waveCooldown = true;
waveTimer = 180; // 3 second break between waves
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Check if bullet is off screen
if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check for collisions with zombies
var hitZombie = false;
for (var j = zombies.length - 1; j >= 0; j--) {
var zombie = zombies[j];
if (bullet.intersects(zombie)) {
hitZombie = true;
// Damage zombie
if (zombie.takeDamage(bullet.damage)) {
zombie.destroy();
zombies.splice(j, 1);
}
break;
}
}
// Remove bullet if it hit a zombie
if (hitZombie) {
bullet.destroy();
bullets.splice(i, 1);
}
}
// Update zombies
for (var i = 0; i < zombies.length; i++) {
zombies[i].update();
}
// Update powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
powerup.update();
// Check if powerup is collected
if (player && powerup.intersects(player)) {
player.collectPowerup(powerup.type);
powerup.destroy();
powerups.splice(i, 1);
continue;
}
// Remove powerup if lifetime is over
if (powerup.lifetime <= 0) {
powerup.destroy();
powerups.splice(i, 1);
}
}
// Update player
if (player) {
player.update();
// Auto-fire if dragging
if (isDragging && player.fireCounter <= 0) {
fireBullet();
}
}
};
// Initial setup - display start screen
var startText = new Text2('Tap to Start', {
size: 120,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(startText);
var instructionText = new Text2('Drag to move, tap to shoot', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.y = 100;
LK.gui.center.addChild(instructionText);
// Reset when tapped
LK.setInterval(function () {
if (!gameStarted) {
return;
}
startText.visible = false;
instructionText.visible = false;
}, 100); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,518 @@
-/****
+/****
+* 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.damage = 20;
+ self.direction = {
+ x: 0,
+ y: -1
+ }; // Default direction: up
+ self.update = function () {
+ self.x += self.direction.x * self.speed;
+ self.y += self.direction.y * self.speed;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.health = 100;
+ self.maxHealth = 100;
+ self.fireRate = 20; // Frames between shots
+ self.fireCounter = 0;
+ self.invincible = false;
+ self.invincibleTimer = 0;
+ self.weaponPowerLevel = 1;
+ self.weaponPowerTimer = 0;
+ self.takeDamage = function (amount) {
+ if (self.invincible) {
+ return;
+ }
+ self.health -= amount;
+ if (self.health <= 0) {
+ self.health = 0;
+ gameOver();
+ }
+ // Flash player on hit
+ LK.effects.flashObject(self, 0xff0000, 500);
+ // Make player invincible for a short time
+ self.invincible = true;
+ self.invincibleTimer = 60; // 1 second at 60fps
+ // Play hit sound
+ LK.getSound('playerHit').play();
+ // Update health bar
+ updateHealthBar();
+ };
+ self.collectPowerup = function (type) {
+ LK.getSound('powerupCollect').play();
+ if (type === 'health') {
+ self.health = Math.min(self.health + 20, self.maxHealth);
+ updateHealthBar();
+ } else if (type === 'weapon') {
+ self.weaponPowerLevel = 2;
+ self.weaponPowerTimer = 300; // 5 seconds at 60fps
+ }
+ };
+ self.update = function () {
+ // Handle invincibility
+ if (self.invincible) {
+ self.invincibleTimer--;
+ // Flicker effect
+ self.alpha = self.invincibleTimer % 10 < 5 ? 0.5 : 1;
+ if (self.invincibleTimer <= 0) {
+ self.invincible = false;
+ self.alpha = 1;
+ }
+ }
+ // Handle weapon power timer
+ if (self.weaponPowerLevel > 1) {
+ self.weaponPowerTimer--;
+ if (self.weaponPowerTimer <= 0) {
+ self.weaponPowerLevel = 1;
+ }
+ }
+ // Update fire counter
+ if (self.fireCounter > 0) {
+ self.fireCounter--;
+ }
+ };
+ 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 = 'health'; // Can be: health, weapon
+ self.lifetime = 300; // 5 seconds at 60fps
+ self.init = function (type) {
+ self.type = type || (Math.random() < 0.7 ? 'health' : 'weapon');
+ if (self.type === 'health') {
+ powerupGraphics.tint = 0x2ecc71; // Green
+ } else if (self.type === 'weapon') {
+ powerupGraphics.tint = 0xf39c12; // Orange
+ }
+ };
+ self.update = function () {
+ // Subtle floating animation
+ self.y += Math.sin(LK.ticks * 0.1) * 0.5;
+ // Fade out when about to disappear
+ if (self.lifetime < 60) {
+ self.alpha = self.lifetime / 60;
+ }
+ self.lifetime--;
+ };
+ 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 = 40;
+ self.damage = 10;
+ self.hitTimer = 0;
+ self.type = 'normal'; // Can be: normal, fast, tank
+ self.init = function (type) {
+ self.type = type || 'normal';
+ // Set zombie properties based on type
+ if (self.type === 'fast') {
+ self.speed = 3.5;
+ self.health = 25;
+ zombieGraphics.tint = 0xe74c3c; // Red tint
+ } else if (self.type === 'tank') {
+ self.speed = 1.2;
+ self.health = 80;
+ self.damage = 20;
+ zombieGraphics.tint = 0x8e44ad; // Purple tint
+ zombieGraphics.scale.set(1.4, 1.4);
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ // Flash zombie on hit
+ LK.effects.flashObject(self, 0xff0000, 200);
+ // Play hit sound
+ LK.getSound('zombieHit').play();
+ if (self.health <= 0) {
+ // Add to score
+ var scoreValue = self.type === 'normal' ? 10 : self.type === 'fast' ? 15 : 25;
+ LK.setScore(LK.getScore() + scoreValue);
+ updateScoreDisplay();
+ // Chance to spawn a powerup
+ if (Math.random() < 0.1) {
+ spawnPowerup(self.x, self.y);
+ }
+ return true; // Zombie is dead
+ }
+ return false; // Zombie still alive
+ };
+ self.update = function () {
+ // Move towards player
+ if (player) {
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 0) {
+ self.x += dx / dist * self.speed;
+ self.y += dy / dist * self.speed;
+ }
+ // Attack player on collision
+ if (self.hitTimer <= 0 && self.intersects(player)) {
+ player.takeDamage(self.damage);
+ self.hitTimer = 30; // Half second cooldown
+ }
+ if (self.hitTimer > 0) {
+ self.hitTimer--;
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x34495e
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var bullets = [];
+var zombies = [];
+var powerups = [];
+var waveNumber = 1;
+var zombiesInWave = 5;
+var waveTimer = 0;
+var spawnDelay = 60; // 1 second between zombie spawns
+var spawnCounter = 0;
+var zombiesSpawned = 0;
+var waveCooldown = false;
+var gameStarted = false;
+var healthBar;
+var healthBarBg;
+var scoreText;
+var waveText;
+// Setup game
+function setupGame() {
+ // Create player
+ player = new Player();
+ player.x = 2048 / 2;
+ player.y = 2732 - 300;
+ game.addChild(player);
+ // Create health bar background
+ healthBarBg = LK.getAsset('healthBarBg', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 2732 - 100
+ });
+ LK.gui.bottom.addChild(healthBarBg);
+ // Create health bar
+ healthBar = LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 2048 / 2 - 200,
+ y: 2732 - 100
+ });
+ LK.gui.bottom.addChild(healthBar);
+ // Create score text
+ scoreText = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(1, 0);
+ LK.gui.topRight.addChild(scoreText);
+ // Create wave text
+ waveText = new Text2('Wave: 1', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ waveText.anchor.set(0, 0);
+ LK.gui.topRight.x -= 200; // Move right a bit to avoid topLeft corner
+ LK.gui.topRight.addChild(waveText);
+ // Reset game state
+ LK.setScore(0);
+ updateScoreDisplay();
+ bullets = [];
+ zombies = [];
+ powerups = [];
+ waveNumber = 1;
+ zombiesInWave = 5;
+ waveTimer = 180; // 3 second delay before first wave
+ spawnCounter = 0;
+ zombiesSpawned = 0;
+ waveCooldown = false;
+ gameStarted = true;
+ // Play background music
+ LK.playMusic('gameMusic', {
+ fade: {
+ start: 0,
+ end: 0.5,
+ duration: 1000
+ }
+ });
+}
+// Update score display
+function updateScoreDisplay() {
+ scoreText.setText('Score: ' + LK.getScore());
+}
+// Update wave display
+function updateWaveDisplay() {
+ waveText.setText('Wave: ' + waveNumber);
+}
+// Update health bar
+function updateHealthBar() {
+ if (player) {
+ var healthPercentage = player.health / player.maxHealth;
+ healthBar.scale.x = healthPercentage;
+ }
+}
+// Spawn a zombie
+function spawnZombie() {
+ var zombie = new Zombie();
+ // Determine zombie type based on wave and randomness
+ var zombieType = 'normal';
+ var rand = Math.random();
+ if (waveNumber >= 3) {
+ if (rand < 0.2) {
+ zombieType = 'fast';
+ } else if (waveNumber >= 5 && rand < 0.3) {
+ zombieType = 'tank';
+ }
+ }
+ zombie.init(zombieType);
+ // Position zombie at a random edge of the screen
+ var side = Math.floor(Math.random() * 4);
+ switch (side) {
+ case 0:
+ // Top
+ zombie.x = Math.random() * 2048;
+ zombie.y = -50;
+ break;
+ case 1:
+ // Right
+ zombie.x = 2048 + 50;
+ zombie.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ zombie.x = Math.random() * 2048;
+ zombie.y = 2732 + 50;
+ break;
+ case 3:
+ // Left
+ zombie.x = -50;
+ zombie.y = Math.random() * 2732;
+ break;
+ }
+ zombies.push(zombie);
+ game.addChild(zombie);
+ zombiesSpawned++;
+}
+// Spawn a powerup at the given position
+function spawnPowerup(x, y) {
+ var powerup = new Powerup();
+ powerup.x = x;
+ powerup.y = y;
+ powerup.init();
+ powerups.push(powerup);
+ game.addChild(powerup);
+}
+// Fire a bullet
+function fireBullet() {
+ if (!player || player.fireCounter > 0) {
+ return;
+ }
+ LK.getSound('shoot').play();
+ // Handle different weapon power levels
+ if (player.weaponPowerLevel === 1) {
+ // Single bullet
+ var bullet = new Bullet();
+ bullet.x = player.x;
+ bullet.y = player.y - 50;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ } else if (player.weaponPowerLevel === 2) {
+ // Triple shot
+ for (var i = -1; i <= 1; i++) {
+ var bullet = new Bullet();
+ bullet.x = player.x;
+ bullet.y = player.y - 50;
+ var angle = i * Math.PI / 8;
+ bullet.direction = {
+ x: Math.sin(angle),
+ y: -Math.cos(angle)
+ };
+ bullets.push(bullet);
+ game.addChild(bullet);
+ }
+ }
+ player.fireCounter = player.fireRate;
+}
+// Game over function
+function gameOver() {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.stopMusic();
+ LK.showGameOver();
+}
+// Drag functionality
+var isDragging = false;
+// Mouse/touch down
+game.down = function (x, y, obj) {
+ if (!gameStarted) {
+ setupGame();
+ return;
+ }
+ isDragging = true;
+ fireBullet();
+};
+// Mouse/touch up
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Mouse/touch move
+game.move = function (x, y, obj) {
+ if (isDragging && player) {
+ player.x = x;
+ player.y = y;
+ // Keep player within boundaries
+ player.x = Math.max(60, Math.min(player.x, 2048 - 60));
+ player.y = Math.max(60, Math.min(player.y, 2732 - 60));
+ }
+};
+// Main update function
+game.update = function () {
+ if (!gameStarted) {
+ return;
+ }
+ // Wave management
+ if (waveTimer > 0) {
+ waveTimer--;
+ if (waveTimer === 0 && waveCooldown) {
+ // Start next wave
+ waveNumber++;
+ updateWaveDisplay();
+ zombiesInWave = 5 + waveNumber * 2;
+ zombiesSpawned = 0;
+ waveCooldown = false;
+ }
+ }
+ // Spawn zombies
+ if (!waveCooldown && zombiesSpawned < zombiesInWave) {
+ spawnCounter++;
+ if (spawnCounter >= spawnDelay) {
+ spawnCounter = 0;
+ spawnZombie();
+ }
+ }
+ // Check if wave is complete
+ if (!waveCooldown && zombiesSpawned >= zombiesInWave && zombies.length === 0) {
+ waveCooldown = true;
+ waveTimer = 180; // 3 second break between waves
+ }
+ // Update bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ bullet.update();
+ // Check if bullet is off screen
+ if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check for collisions with zombies
+ var hitZombie = false;
+ for (var j = zombies.length - 1; j >= 0; j--) {
+ var zombie = zombies[j];
+ if (bullet.intersects(zombie)) {
+ hitZombie = true;
+ // Damage zombie
+ if (zombie.takeDamage(bullet.damage)) {
+ zombie.destroy();
+ zombies.splice(j, 1);
+ }
+ break;
+ }
+ }
+ // Remove bullet if it hit a zombie
+ if (hitZombie) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ }
+ }
+ // Update zombies
+ for (var i = 0; i < zombies.length; i++) {
+ zombies[i].update();
+ }
+ // Update powerups
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var powerup = powerups[i];
+ powerup.update();
+ // Check if powerup is collected
+ if (player && powerup.intersects(player)) {
+ player.collectPowerup(powerup.type);
+ powerup.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ // Remove powerup if lifetime is over
+ if (powerup.lifetime <= 0) {
+ powerup.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ // Update player
+ if (player) {
+ player.update();
+ // Auto-fire if dragging
+ if (isDragging && player.fireCounter <= 0) {
+ fireBullet();
+ }
+ }
+};
+// Initial setup - display start screen
+var startText = new Text2('Tap to Start', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+startText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(startText);
+var instructionText = new Text2('Drag to move, tap to shoot', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 0.5);
+instructionText.y = 100;
+LK.gui.center.addChild(instructionText);
+// Reset when tapped
+LK.setInterval(function () {
+ if (!gameStarted) {
+ return;
+ }
+ startText.visible = false;
+ instructionText.visible = false;
+}, 100);
\ No newline at end of file
Make an 8-bit zombie. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Make an 8 bit boy with a gun. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Make a city background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Make it a 8 bit red splatter. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Make it a yellow bullet . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat