Code edit (1 edits merged)
Please save this source code
User prompt
Zombie Dodge
Initial prompt
Design a game called 'Zombie Dodge'. The player controls a character in a field. Zombies spawn and chase the player. The goal is to survive as long as possible without being caught. Each second survived increases the score. The game ends if a zombie touches the player.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.isDead = false;
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.targetX = 0;
self.targetY = 0;
self.update = function () {
if (player && !player.isDead) {
// Calculate direction to player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
// Normalize and apply speed
var normalizedX = dx / distance;
var normalizedY = dy / distance;
self.x += normalizedX * self.speed;
self.y += normalizedY * self.speed;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2E7D32
});
/****
* Game Code
****/
// Game variables
var player;
var zombies = [];
var dragNode = null;
var gameTime = 0;
var spawnRate = 120; // Initial spawn rate (frames between spawns)
var minSpawnRate = 20;
var difficultyTimer = 0;
var lastScore = 0;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var timeTxt = new Text2('Time: 0s', {
size: 60,
fill: 0xFFFFFF
});
timeTxt.anchor.set(0, 0);
timeTxt.x = 120;
timeTxt.y = 120;
LK.gui.topLeft.addChild(timeTxt);
// Initialize player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Spawn zombie function
function spawnZombie() {
var zombie = new Zombie();
var side = Math.floor(Math.random() * 4); // 0=top, 1=right, 2=bottom, 3=left
switch (side) {
case 0:
// Top
zombie.x = Math.random() * 2048;
zombie.y = -30;
break;
case 1:
// Right
zombie.x = 2048 + 30;
zombie.y = Math.random() * 2732;
break;
case 2:
// Bottom
zombie.x = Math.random() * 2048;
zombie.y = 2732 + 30;
break;
case 3:
// Left
zombie.x = -30;
zombie.y = Math.random() * 2732;
break;
}
// Increase zombie speed based on time survived
zombie.speed = 2 + gameTime / 3600; // Speed increases every minute
if (zombie.speed > 6) zombie.speed = 6; // Cap maximum speed
zombies.push(zombie);
game.addChild(zombie);
}
// Movement handling
function handleMove(x, y, obj) {
if (dragNode && !player.isDead) {
var newX = x;
var newY = y;
// Keep player within screen bounds
if (newX < 40) newX = 40;
if (newX > 2048 - 40) newX = 2048 - 40;
if (newY < 40) newY = 40;
if (newY > 2732 - 40) newY = 2732 - 40;
dragNode.x = newX;
dragNode.y = newY;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (!player.isDead) {
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
if (player.isDead) return;
gameTime++;
// Update time display every second (60 ticks)
if (gameTime % 60 === 0) {
var seconds = Math.floor(gameTime / 60);
timeTxt.setText('Time: ' + seconds + 's');
// Increase score every second
LK.setScore(LK.getScore() + 1);
scoreTxt.setText('Score: ' + LK.getScore());
}
// Increase difficulty over time
difficultyTimer++;
if (difficultyTimer % 600 === 0) {
// Every 10 seconds
if (spawnRate > minSpawnRate) {
spawnRate -= 5; // Spawn zombies more frequently
}
}
// Spawn zombies
if (gameTime % spawnRate === 0) {
spawnZombie();
}
// Check collisions between player and zombies
for (var i = zombies.length - 1; i >= 0; i--) {
var zombie = zombies[i];
if (player.intersects(zombie)) {
// Game Over
player.isDead = true;
// Visual feedback
LK.effects.flashScreen(0xFF0000, 1000);
// Play game over sound
LK.getSound('gameOver').play();
// Show game over after a brief delay
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
return;
}
// Remove zombies that are too far off screen
if (zombie.x < -200 || zombie.x > 2248 || zombie.y < -200 || zombie.y > 2932) {
zombie.destroy();
zombies.splice(i, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,186 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.isDead = false;
+ 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.targetX = 0;
+ self.targetY = 0;
+ self.update = function () {
+ if (player && !player.isDead) {
+ // Calculate direction to player
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 0) {
+ // Normalize and apply speed
+ var normalizedX = dx / distance;
+ var normalizedY = dy / distance;
+ self.x += normalizedX * self.speed;
+ self.y += normalizedY * self.speed;
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2E7D32
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var zombies = [];
+var dragNode = null;
+var gameTime = 0;
+var spawnRate = 120; // Initial spawn rate (frames between spawns)
+var minSpawnRate = 20;
+var difficultyTimer = 0;
+var lastScore = 0;
+// UI Elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var timeTxt = new Text2('Time: 0s', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+timeTxt.anchor.set(0, 0);
+timeTxt.x = 120;
+timeTxt.y = 120;
+LK.gui.topLeft.addChild(timeTxt);
+// Initialize player
+player = game.addChild(new Player());
+player.x = 2048 / 2;
+player.y = 2732 / 2;
+// Spawn zombie function
+function spawnZombie() {
+ var zombie = new Zombie();
+ var side = Math.floor(Math.random() * 4); // 0=top, 1=right, 2=bottom, 3=left
+ switch (side) {
+ case 0:
+ // Top
+ zombie.x = Math.random() * 2048;
+ zombie.y = -30;
+ break;
+ case 1:
+ // Right
+ zombie.x = 2048 + 30;
+ zombie.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ zombie.x = Math.random() * 2048;
+ zombie.y = 2732 + 30;
+ break;
+ case 3:
+ // Left
+ zombie.x = -30;
+ zombie.y = Math.random() * 2732;
+ break;
+ }
+ // Increase zombie speed based on time survived
+ zombie.speed = 2 + gameTime / 3600; // Speed increases every minute
+ if (zombie.speed > 6) zombie.speed = 6; // Cap maximum speed
+ zombies.push(zombie);
+ game.addChild(zombie);
+}
+// Movement handling
+function handleMove(x, y, obj) {
+ if (dragNode && !player.isDead) {
+ var newX = x;
+ var newY = y;
+ // Keep player within screen bounds
+ if (newX < 40) newX = 40;
+ if (newX > 2048 - 40) newX = 2048 - 40;
+ if (newY < 40) newY = 40;
+ if (newY > 2732 - 40) newY = 2732 - 40;
+ dragNode.x = newX;
+ dragNode.y = newY;
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ if (!player.isDead) {
+ dragNode = player;
+ handleMove(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main game loop
+game.update = function () {
+ if (player.isDead) return;
+ gameTime++;
+ // Update time display every second (60 ticks)
+ if (gameTime % 60 === 0) {
+ var seconds = Math.floor(gameTime / 60);
+ timeTxt.setText('Time: ' + seconds + 's');
+ // Increase score every second
+ LK.setScore(LK.getScore() + 1);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ }
+ // Increase difficulty over time
+ difficultyTimer++;
+ if (difficultyTimer % 600 === 0) {
+ // Every 10 seconds
+ if (spawnRate > minSpawnRate) {
+ spawnRate -= 5; // Spawn zombies more frequently
+ }
+ }
+ // Spawn zombies
+ if (gameTime % spawnRate === 0) {
+ spawnZombie();
+ }
+ // Check collisions between player and zombies
+ for (var i = zombies.length - 1; i >= 0; i--) {
+ var zombie = zombies[i];
+ if (player.intersects(zombie)) {
+ // Game Over
+ player.isDead = true;
+ // Visual feedback
+ LK.effects.flashScreen(0xFF0000, 1000);
+ // Play game over sound
+ LK.getSound('gameOver').play();
+ // Show game over after a brief delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 500);
+ return;
+ }
+ // Remove zombies that are too far off screen
+ if (zombie.x < -200 || zombie.x > 2248 || zombie.y < -200 || zombie.y > 2932) {
+ zombie.destroy();
+ zombies.splice(i, 1);
+ }
+ }
+};
\ No newline at end of file