User prompt
The character is still very fast
User prompt
The character is very fast
User prompt
Remove the shop
User prompt
I can't leave the store, fix this
User prompt
I can't get anything from the store and I can't leave
User prompt
Enlarge text in the shop
User prompt
Make the buttons in the shop functional instead of non-functional
User prompt
Have a shop somewhere on the map ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Remove all animations
User prompt
Update
User prompt
The game lags a lot
User prompt
Optimize the game
User prompt
Add grass to the ground and a black barrier at the end of the map
User prompt
Add and expand the map to the game
User prompt
Make the game open world
User prompt
After 5 waves, the game over message should appear.
User prompt
I can't start the game please fix this
User prompt
Make main menu
User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween.to(spawnParticle, {' Line Number: 244 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Update 1000 lines
User prompt
Correct the trajectory of bullets
User prompt
Add weapon to character
User prompt
Make it harder
User prompt
Make it harder
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.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 = 12; self.directionX = 0; self.directionY = 0; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * 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 }); // Add weapon to player var weaponGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); weaponGraphics.x = 25; // Position weapon to the right of player weaponGraphics.y = 0; self.speed = 4; self.health = 1; self.lastShootTime = 0; self.shootInterval = 500; // milliseconds 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 = 1; self.update = function () { if (player) { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2E2E2E }); /**** * Game Code ****/ // Game variables var player; var zombies = []; var bullets = []; var dragNode = null; var gameTime = 0; var zombieSpawnRate = 50; // frames between spawns var zombieSpeed = 4; var zombiesKilled = 0; var waveNumber = 1; // UI Elements var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var waveTxt = new Text2('Wave: 1', { size: 50, fill: 0xFFFFFF }); waveTxt.anchor.set(0, 0); waveTxt.x = 20; waveTxt.y = 20; LK.gui.topLeft.addChild(waveTxt); var timeTxt = new Text2('Time: 0s', { size: 50, fill: 0xFFFFFF }); timeTxt.anchor.set(1, 0); timeTxt.x = -20; timeTxt.y = 20; LK.gui.topRight.addChild(timeTxt); // Initialize player player = game.addChild(new Player()); player.x = 2048 / 2; player.y = 2732 / 2; // Helper functions function spawnZombie() { var zombie = new Zombie(); 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; } zombie.speed = zombieSpeed; zombies.push(zombie); game.addChild(zombie); } function findNearestZombie() { var nearestZombie = null; var nearestDistance = Infinity; for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; var dx = zombie.x - player.x; var dy = zombie.y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestZombie = zombie; } } return nearestZombie; } function shootBullet() { var target = findNearestZombie(); if (!target) return; var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; // Calculate zombie's movement direction var zombieDx = player.x - target.x; var zombieDy = player.y - target.y; var zombieDistance = Math.sqrt(zombieDx * zombieDx + zombieDy * zombieDy); var zombieDirectionX = zombieDistance > 0 ? zombieDx / zombieDistance : 0; var zombieDirectionY = zombieDistance > 0 ? zombieDy / zombieDistance : 0; // Predict where zombie will be var timeToTarget = zombieDistance / bullet.speed; var predictedX = target.x + zombieDirectionX * target.speed * timeToTarget; var predictedY = target.y + zombieDirectionY * target.speed * timeToTarget; // Aim at predicted position var dx = predictedX - player.x; var dy = predictedY - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { bullet.directionX = dx / distance; bullet.directionY = dy / distance; } bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } function updateDifficulty() { waveNumber = Math.floor(gameTime / 1200) + 1; // New wave every 20 seconds zombieSpawnRate = Math.max(15, 50 - waveNumber * 8); zombieSpeed = 4 + (waveNumber - 1) * 1.2; waveTxt.setText('Wave: ' + waveNumber); } // Event handlers function handleMove(x, y, obj) { if (dragNode) { // Keep player within screen bounds dragNode.x = Math.max(30, Math.min(2048 - 30, x)); dragNode.y = Math.max(30, Math.min(2732 - 30, y)); } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = player; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; // Main game loop game.update = function () { gameTime++; // Update UI timeTxt.setText('Time: ' + Math.floor(gameTime / 60) + 's'); // Update difficulty updateDifficulty(); // Spawn zombies if (gameTime % zombieSpawnRate === 0) { spawnZombie(); // Spawn additional zombies in later waves if (waveNumber >= 2 && gameTime % (zombieSpawnRate * 2) === 0) { spawnZombie(); } if (waveNumber >= 3 && gameTime % (zombieSpawnRate * 3) === 0) { spawnZombie(); } if (waveNumber >= 4 && gameTime % (zombieSpawnRate * 4) === 0) { spawnZombie(); } } // Auto-shoot if (gameTime % 60 === 0) { // Shoot every 1 second shootBullet(); } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Remove bullets that are off screen if (bullet.x < -100 || bullet.x > 2148 || bullet.y < -100 || bullet.y > 2832) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet-zombie collisions for (var j = zombies.length - 1; j >= 0; j--) { var zombie = zombies[j]; if (bullet.intersects(zombie)) { // Zombie hit LK.getSound('zombieHit').play(); zombie.destroy(); zombies.splice(j, 1); bullet.destroy(); bullets.splice(i, 1); zombiesKilled++; LK.setScore(zombiesKilled * 10 + Math.floor(gameTime / 60)); scoreTxt.setText('Score: ' + LK.getScore()); // Flash effect LK.effects.flashObject(zombie, 0xFF0000, 200); break; } } } // Check player-zombie collisions for (var k = 0; k < zombies.length; k++) { var zombie = zombies[k]; if (player.intersects(zombie)) { // Player hit - game over LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } // Remove zombies that are too far off screen (cleanup) for (var l = zombies.length - 1; l >= 0; l--) { var zombie = zombies[l]; if (zombie.x < -200 || zombie.x > 2248 || zombie.y < -200 || zombie.y > 2932) { zombie.destroy(); zombies.splice(l, 1); } } }; // Start background music LK.playMusic('bgmusic');
===================================================================
--- original.js
+++ change.js
@@ -161,10 +161,21 @@
if (!target) return;
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
- var dx = target.x - player.x;
- var dy = target.y - player.y;
+ // Calculate zombie's movement direction
+ var zombieDx = player.x - target.x;
+ var zombieDy = player.y - target.y;
+ var zombieDistance = Math.sqrt(zombieDx * zombieDx + zombieDy * zombieDy);
+ var zombieDirectionX = zombieDistance > 0 ? zombieDx / zombieDistance : 0;
+ var zombieDirectionY = zombieDistance > 0 ? zombieDy / zombieDistance : 0;
+ // Predict where zombie will be
+ var timeToTarget = zombieDistance / bullet.speed;
+ var predictedX = target.x + zombieDirectionX * target.speed * timeToTarget;
+ var predictedY = target.y + zombieDirectionY * target.speed * timeToTarget;
+ // Aim at predicted position
+ var dx = predictedX - player.x;
+ var dy = predictedY - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
bullet.directionX = dx / distance;
bullet.directionY = dy / distance;