User prompt
Make the bullets rotate to direction ı shoot them at
User prompt
Im on pc can we do something better for walking
User prompt
Please fix the bug: 'TypeError: LK.getTouches is not a function' in or related to this line: 'var touches = LK.getTouches();' Line Number: 365
User prompt
Make us able to walk
User prompt
Make us able to walk around and change our wepon to a stick instead of a gun that we can swing and hit
Code edit (1 edits merged)
Please save this source code
User prompt
Monster Defense Arena
Initial prompt
Im planing a top view game. We will have a wepon and kill the monster comes close to us
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.dx = 0; self.dy = 0; self.active = true; self.update = function () { if (!self.active) return; self.x += self.dx; self.y += self.dy; if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.active = false; } }; self.setDirection = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.dx = dx / distance * self.speed; self.dy = dy / distance * self.speed; // Rotate bullet to face direction of travel graphics.rotation = Math.atan2(dy, dx) + Math.PI / 2; } }; return self; }); var Monster = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('monster', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.health = 1; self.damage = 10; self.active = true; self.lastPlayerDistance = 0; self.update = function () { if (!self.active) return; 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; } var currentDistance = distance; if (self.lastPlayerDistance > 50 && currentDistance <= 50) { player.takeDamage(self.damage); self.active = false; } self.lastPlayerDistance = currentDistance; }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.active = false; LK.setScore(LK.getScore() + 10); LK.getSound('hit').play(); return true; } return false; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.fireRate = 8; self.fireTimer = 0; self.powerUpTimer = 0; self.isEnhanced = false; self.update = function () { if (self.fireTimer > 0) { self.fireTimer--; } if (self.powerUpTimer > 0) { self.powerUpTimer--; if (self.powerUpTimer <= 0) { self.isEnhanced = false; graphics.tint = 0xffffff; } } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; LK.showGameOver(); } LK.effects.flashObject(self, 0xff0000, 300); }; self.canFire = function () { return self.fireTimer <= 0; }; self.fire = function () { if (self.canFire()) { self.fireTimer = self.isEnhanced ? self.fireRate / 2 : self.fireRate; return true; } return false; }; self.applyPowerUp = function () { self.isEnhanced = true; self.powerUpTimer = 300; graphics.tint = 0x00ff00; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.active = true; self.lifeTime = 600; self.blinkTimer = 0; self.update = function () { if (!self.active) return; self.lifeTime--; if (self.lifeTime <= 0) { self.active = false; return; } if (self.lifeTime < 120) { self.blinkTimer++; graphics.alpha = self.blinkTimer % 20 < 10 ? 1 : 0.3; } var distance = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2)); if (distance < 40) { player.applyPowerUp(); self.active = false; LK.getSound('pickup').play(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2c3e50 }); /**** * Game Code ****/ var player = null; var bullets = []; var monsters = []; var powerups = []; var waveNumber = 1; var monstersInWave = 5; var monstersSpawned = 0; var monstersKilled = 0; var spawnTimer = 0; var waveDelay = 180; var powerUpSpawnTimer = 0; var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var healthText = new Text2('Health: 100', { size: 50, fill: 0xFF4444 }); healthText.anchor.set(0, 0); healthText.x = 120; healthText.y = 20; LK.gui.topLeft.addChild(healthText); var waveText = new Text2('Wave: 1', { size: 50, fill: 0x4A90E2 }); waveText.anchor.set(1, 0); LK.gui.topRight.addChild(waveText); player = game.addChild(new Player()); player.x = 1024; player.y = 1366; function spawnMonster() { if (monstersSpawned >= monstersInWave) return; var monster = new Monster(); var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top monster.x = Math.random() * 2048; monster.y = -30; break; case 1: // Right monster.x = 2078; monster.y = Math.random() * 2732; break; case 2: // Bottom monster.x = Math.random() * 2048; monster.y = 2762; break; case 3: // Left monster.x = -30; monster.y = Math.random() * 2732; break; } monster.speed = 1.5 + waveNumber * 0.3; monsters.push(monster); game.addChild(monster); monstersSpawned++; } function spawnPowerUp() { if (powerups.length >= 2) return; var powerup = new PowerUp(); powerup.x = 300 + Math.random() * 1448; powerup.y = 300 + Math.random() * 2132; powerups.push(powerup); game.addChild(powerup); } function cleanupBullets() { for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (!bullet.active) { bullet.destroy(); bullets.splice(i, 1); } } } function cleanupMonsters() { for (var i = monsters.length - 1; i >= 0; i--) { var monster = monsters[i]; if (!monster.active) { monster.destroy(); monsters.splice(i, 1); monstersKilled++; } } } function cleanupPowerUps() { for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; if (!powerup.active) { powerup.destroy(); powerups.splice(i, 1); } } } function checkBulletCollisions() { for (var i = 0; i < bullets.length; i++) { var bullet = bullets[i]; if (!bullet.active) continue; for (var j = 0; j < monsters.length; j++) { var monster = monsters[j]; if (!monster.active) continue; if (bullet.intersects(monster)) { bullet.active = false; monster.takeDamage(1); break; } } } } function nextWave() { waveNumber++; monstersInWave = 5 + waveNumber * 2; monstersSpawned = 0; monstersKilled = 0; spawnTimer = 0; waveDelay = 180; waveText.setText('Wave: ' + waveNumber); } game.down = function (x, y, obj) { if (player.fire()) { var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; bullet.setDirection(x, y); bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } }; game.update = function () { if (waveDelay > 0) { waveDelay--; return; } spawnTimer++; if (spawnTimer >= 60 && monstersSpawned < monstersInWave) { spawnMonster(); spawnTimer = 0; } powerUpSpawnTimer++; if (powerUpSpawnTimer >= 900) { spawnPowerUp(); powerUpSpawnTimer = 0; } checkBulletCollisions(); cleanupBullets(); cleanupMonsters(); cleanupPowerUps(); if (monstersKilled >= monstersInWave && monsters.length === 0) { nextWave(); } scoreText.setText('Score: ' + LK.getScore()); healthText.setText('Health: ' + player.health); };
===================================================================
--- original.js
+++ change.js
@@ -5,8 +5,39 @@
/****
* Classes
****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.dx = 0;
+ self.dy = 0;
+ self.active = true;
+ self.update = function () {
+ if (!self.active) return;
+ self.x += self.dx;
+ self.y += self.dy;
+ if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
+ self.active = false;
+ }
+ };
+ self.setDirection = function (targetX, targetY) {
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 0) {
+ self.dx = dx / distance * self.speed;
+ self.dy = dy / distance * self.speed;
+ // Rotate bullet to face direction of travel
+ graphics.rotation = Math.atan2(dy, dx) + Math.PI / 2;
+ }
+ };
+ return self;
+});
var Monster = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('monster', {
anchorX: 0.5,
@@ -86,18 +117,8 @@
return true;
}
return false;
};
- self.swing = function (targetX, targetY) {
- if (self.canFire()) {
- self.fireTimer = self.isEnhanced ? self.fireRate / 2 : self.fireRate;
- return {
- x: targetX,
- y: targetY
- };
- }
- return null;
- };
self.applyPowerUp = function () {
self.isEnhanced = true;
self.powerUpTimer = 300;
graphics.tint = 0x00ff00;
@@ -132,47 +153,8 @@
}
};
return self;
});
-var Stick = Container.expand(function () {
- var self = Container.call(this);
- var graphics = self.attachAsset('stick', {
- anchorX: 0.2,
- anchorY: 0.5
- });
- self.active = true;
- self.swingDuration = 20;
- self.swingTimer = 0;
- self.startRotation = 0;
- self.endRotation = 0;
- self.isSwinging = false;
- self.update = function () {
- if (!self.active) return;
- if (self.isSwinging) {
- self.swingTimer++;
- var progress = self.swingTimer / self.swingDuration;
- if (progress >= 1) {
- progress = 1;
- self.isSwinging = false;
- self.active = false;
- }
- // Smooth swing animation
- var easeProgress = progress * progress * (3 - 2 * progress);
- graphics.rotation = self.startRotation + (self.endRotation - self.startRotation) * easeProgress;
- }
- };
- self.swing = function (targetX, targetY) {
- var dx = targetX - self.x;
- var dy = targetY - self.y;
- var targetAngle = Math.atan2(dy, dx);
- self.startRotation = targetAngle - Math.PI / 3;
- self.endRotation = targetAngle + Math.PI / 3;
- graphics.rotation = self.startRotation;
- self.isSwinging = true;
- self.swingTimer = 0;
- };
- return self;
-});
/****
* Initialize Game
****/
@@ -183,9 +165,9 @@
/****
* Game Code
****/
var player = null;
-var sticks = [];
+var bullets = [];
var monsters = [];
var powerups = [];
var waveNumber = 1;
var monstersInWave = 5;
@@ -255,14 +237,14 @@
powerup.y = 300 + Math.random() * 2132;
powerups.push(powerup);
game.addChild(powerup);
}
-function cleanupSticks() {
- for (var i = sticks.length - 1; i >= 0; i--) {
- var stick = sticks[i];
- if (!stick.active) {
- stick.destroy();
- sticks.splice(i, 1);
+function cleanupBullets() {
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ if (!bullet.active) {
+ bullet.destroy();
+ bullets.splice(i, 1);
}
}
}
function cleanupMonsters() {
@@ -283,17 +265,17 @@
powerups.splice(i, 1);
}
}
}
-function checkStickCollisions() {
- for (var i = 0; i < sticks.length; i++) {
- var stick = sticks[i];
- if (!stick.active || !stick.isSwinging) continue;
+function checkBulletCollisions() {
+ for (var i = 0; i < bullets.length; i++) {
+ var bullet = bullets[i];
+ if (!bullet.active) continue;
for (var j = 0; j < monsters.length; j++) {
var monster = monsters[j];
if (!monster.active) continue;
- var distance = Math.sqrt(Math.pow(stick.x - monster.x, 2) + Math.pow(stick.y - monster.y, 2));
- if (distance < 80) {
+ if (bullet.intersects(monster)) {
+ bullet.active = false;
monster.takeDamage(1);
break;
}
}
@@ -307,105 +289,20 @@
spawnTimer = 0;
waveDelay = 180;
waveText.setText('Wave: ' + waveNumber);
}
-// Movement system for PC and mobile
-var keys = {
- w: false,
- a: false,
- s: false,
- d: false
-};
-var playerSpeed = 4;
-var dragNode = null;
-// Keyboard event listeners for PC controls
-LK.on('keydown', function (event) {
- switch (event.key.toLowerCase()) {
- case 'w':
- keys.w = true;
- break;
- case 'a':
- keys.a = true;
- break;
- case 's':
- keys.s = true;
- break;
- case 'd':
- keys.d = true;
- break;
- }
-});
-LK.on('keyup', function (event) {
- switch (event.key.toLowerCase()) {
- case 'w':
- keys.w = false;
- break;
- case 'a':
- keys.a = false;
- break;
- case 's':
- keys.s = false;
- break;
- case 'd':
- keys.d = false;
- break;
- }
-});
-function updatePlayerMovement() {
- var moveX = 0;
- var moveY = 0;
- if (keys.w) moveY -= playerSpeed;
- if (keys.s) moveY += playerSpeed;
- if (keys.a) moveX -= playerSpeed;
- if (keys.d) moveX += playerSpeed;
- // Apply movement
- if (moveX !== 0 || moveY !== 0) {
- player.x += moveX;
- player.y += moveY;
- // Keep player within screen bounds
- if (player.x < 40) player.x = 40;
- if (player.x > 2008) player.x = 2008;
- if (player.y < 40) player.y = 40;
- if (player.y > 2692) player.y = 2692;
- }
-}
-function handleMove(x, y, obj) {
- if (dragNode) {
- dragNode.x = x;
- dragNode.y = y;
- // Keep player within screen bounds
- if (dragNode.x < 40) dragNode.x = 40;
- if (dragNode.x > 2008) dragNode.x = 2008;
- if (dragNode.y < 40) dragNode.y = 40;
- if (dragNode.y > 2692) dragNode.y = 2692;
- }
-}
-game.move = handleMove;
-// Touch/click controls for attacking and mobile movement
game.down = function (x, y, obj) {
- var swingResult = player.swing(x, y);
- if (swingResult) {
- var stick = new Stick();
- stick.x = player.x;
- stick.y = player.y;
- stick.swing(swingResult.x, swingResult.y);
- sticks.push(stick);
- game.addChild(stick);
+ if (player.fire()) {
+ var bullet = new Bullet();
+ bullet.x = player.x;
+ bullet.y = player.y;
+ bullet.setDirection(x, y);
+ bullets.push(bullet);
+ game.addChild(bullet);
LK.getSound('shoot').play();
- } else {
- // Only allow drag movement if no keyboard input is active
- if (!keys.w && !keys.a && !keys.s && !keys.d) {
- dragNode = player;
- handleMove(x, y, obj);
- }
}
};
-game.up = function (x, y, obj) {
- dragNode = null;
-};
game.update = function () {
- // Update player movement from keyboard input
- updatePlayerMovement();
if (waveDelay > 0) {
waveDelay--;
return;
}
@@ -418,10 +315,10 @@
if (powerUpSpawnTimer >= 900) {
spawnPowerUp();
powerUpSpawnTimer = 0;
}
- checkStickCollisions();
- cleanupSticks();
+ checkBulletCollisions();
+ cleanupBullets();
cleanupMonsters();
cleanupPowerUps();
if (monstersKilled >= monstersInWave && monsters.length === 0) {
nextWave();
Bullet. In-Game asset. 2d. High contrast. No shadows
A extremly basic zombie look from top. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
A round drop of blood. In-Game asset. 2d. High contrast. No shadows
Make it simple no blood or object
Make its skin blue and make it smile
A happier version of this zombie but its will be purple
Make it green
small rock. In-Game asset. 2d. High contrast. No shadows
Yellow version of it
make it white
Explosion!. In-Game asset. 2d. High contrast. No shadows
Lightning. In-Game asset. 2d. High contrast. No shadows
Make it rainbow and extremly happy
A cowboy hat from top. In-Game asset. 2d. High contrast. No shadows
Hake his skin red and add horns
A card. In-Game asset. 2d. High contrast. No shadows