User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var halfW = player.children[0].width / 2;' Line Number: 152
User prompt
enemys not spawm on mans spawm place
User prompt
when enemy touch man he will lose
User prompt
bro we can drag without touching when we can move mouse on finger player tho move
User prompt
make when mouse on screen player can move but without dragging and when players finger on screen he can move chacchter
User prompt
create a asset for background
User prompt
make we can drag tho when we holding background
User prompt
when we tocuh background its can move th
User prompt
its not work
User prompt
make we can control the charachrer
Code edit (1 edits merged)
Please save this source code
User prompt
Cube Survival: Dodge the Enemies
Initial prompt
there have 5 cubes. 4 cubes ae enemy. and one cube is we. enemys walking on random;. when we touch or when enemys touch we. then we lose and the score will up every second we live. make background white tho
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Cube Class
var EnemyCube = Container.expand(function () {
var self = Container.call(this);
// Assign a unique asset per enemy
var assetId = self.assetId || 'enemyCube1';
var enemyAsset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Movement speed in px per frame
self.speed = 7 + Math.random() * 3; // 7-10 px/frame
// Current movement direction (angle in radians)
self.direction = Math.random() * Math.PI * 2;
// Time until next direction change (in ticks)
self.ticksToChange = 60 + Math.floor(Math.random() * 90); // 1-2.5 seconds
// Update method: move, bounce, randomize direction
self.update = function () {
// Move in current direction
self.x += Math.cos(self.direction) * self.speed;
self.y += Math.sin(self.direction) * self.speed;
// Bounce off walls
var halfW = enemyAsset.width / 2;
var halfH = enemyAsset.height / 2;
// Left/right
if (self.x - halfW < 0) {
self.x = halfW;
self.direction = Math.PI - self.direction;
}
if (self.x + halfW > 2048) {
self.x = 2048 - halfW;
self.direction = Math.PI - self.direction;
}
// Top/bottom
if (self.y - halfH < 0) {
self.y = halfH;
self.direction = -self.direction;
}
if (self.y + halfH > 2732) {
self.y = 2732 - halfH;
self.direction = -self.direction;
}
// Randomly change direction
self.ticksToChange--;
if (self.ticksToChange <= 0) {
// Pick a new random direction, keep speed
var oldDir = self.direction;
// Avoid picking a direction too close to the current one
var delta = (Math.random() - 0.5) * Math.PI; // -90 to +90 deg
self.direction = (self.direction + delta) % (Math.PI * 2);
self.ticksToChange = 60 + Math.floor(Math.random() * 90);
}
};
return self;
});
// Player Cube Class
var PlayerCube = Container.expand(function () {
var self = Container.call(this);
var playerAsset = self.attachAsset('playerCube', {
anchorX: 0.5,
anchorY: 0.5
});
// No update needed; movement is handled by drag
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xffffff // White background for clear visibility
});
/****
* Game Code
****/
// Player and enemy cubes (distinct colors)
// Score variables
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0x222222
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Player setup
var player = new PlayerCube();
game.addChild(player);
// Center player
player.x = 2048 / 2;
player.y = 2732 / 2;
// Enemy setup
var enemyAssets = ['enemyCube1', 'enemyCube2', 'enemyCube3', 'enemyCube4'];
var enemies = [];
for (var i = 0; i < 4; i++) {
var enemy = new EnemyCube();
enemy.assetId = enemyAssets[i];
// Place enemies at random positions, not overlapping player
var safe = false;
while (!safe) {
enemy.x = 200 + Math.random() * (2048 - 400);
enemy.y = 200 + Math.random() * (2732 - 400);
// Check not overlapping player
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 350) safe = true;
}
enemies.push(enemy);
game.addChild(enemy);
}
// Dragging logic
var dragNode = null;
var offsetX = 0;
var offsetY = 0;
// Move handler: drag player, clamp to screen
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp to screen bounds
var halfW = dragNode.children[0].width / 2;
var halfH = dragNode.children[0].height / 2;
var nx = Math.max(halfW, Math.min(2048 - halfW, x - offsetX));
var ny = Math.max(halfH, Math.min(2732 - halfH, y - offsetY));
dragNode.x = nx;
dragNode.y = ny;
}
}
game.move = handleMove;
// Down: start dragging if on player
game.down = function (x, y, obj) {
// Only start drag if touch is inside player
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
var halfW = player.children[0].width / 2;
var halfH = player.children[0].height / 2;
if (local.x >= -halfW && local.x <= halfW && local.y >= -halfH && local.y <= halfH) {
dragNode = player;
// Offset so finger stays at same spot on cube
offsetX = x - player.x;
offsetY = y - player.y;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Collision detection helper
function checkCollision(a, b) {
// Both are containers with anchor 0.5,0.5, use bounding box
var aw = a.children[0].width,
ah = a.children[0].height;
var bw = b.children[0].width,
bh = b.children[0].height;
return Math.abs(a.x - b.x) < (aw + bw) / 2 && Math.abs(a.y - b.y) < (ah + bh) / 2;
}
// Score timer: +1 every second
var scoreTimer = LK.setInterval(function () {
score++;
scoreTxt.setText(score);
}, 1000);
// Game update: move enemies, check collisions
var gameOver = false;
game.update = function () {
if (gameOver) return;
// Move enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
// Check collision with player
if (checkCollision(player, enemies[i])) {
// Flash screen red, show game over
LK.effects.flashScreen(0xff0000, 1000);
gameOver = true;
LK.clearInterval(scoreTimer);
LK.showGameOver();
return;
}
}
};
// Reset score on game restart
LK.on('gameStart', function () {
score = 0;
scoreTxt.setText(score);
gameOver = false;
// Reset player position
player.x = 2048 / 2;
player.y = 2732 / 2;
// Reset enemies to new random positions
for (var i = 0; i < enemies.length; i++) {
var safe = false;
while (!safe) {
enemies[i].x = 200 + Math.random() * (2048 - 400);
enemies[i].y = 200 + Math.random() * (2732 - 400);
var dx = enemies[i].x - player.x;
var dy = enemies[i].y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 350) safe = true;
}
enemies[i].direction = Math.random() * Math.PI * 2;
enemies[i].ticksToChange = 60 + Math.floor(Math.random() * 90);
}
// Restart score timer
LK.clearInterval(scoreTimer);
scoreTimer = LK.setInterval(function () {
score++;
scoreTxt.setText(score);
}, 1000);
}); ===================================================================
--- original.js
+++ change.js