User prompt
Arka plan siyah olsun
User prompt
Oyunda karakter ten daha büyük düşmanlar her zaman olsun
User prompt
Dikene çarptığında bir sefer parçalansın ve diken yok olsun. Parça sayısı 3 4 parça olsun
User prompt
Oyuna diken ekle. Karakter dikenden küçükken altına saklansın dikenden büyük olunca dokunduğunda küçük parçalara ayrılsın
User prompt
Bunları yap
User prompt
Oyuncu parmağını çekince karakter yavaşlamasın
User prompt
Oyuncu gıda yedikçe büyüsün
User prompt
Ekrandan parmağı çekince oyuncu harekete devam etsin
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'x')' in or related to this line: 'stage.x = 1024 - camX;' Line Number: 369
User prompt
Ekran oyuncuyu takip etsin
User prompt
Oyundaki sınırları genişlet
User prompt
Oyuncu hücresinin hareketini parmakla kaydırma hareketi ile yönlendir
User prompt
Düşmanları yüzde 70 yavaşlat
User prompt
Oyundaki karakterler çok daha yavaş olsun
Code edit (1 edits merged)
Please save this source code
User prompt
Cell Eater: Agar.io Clone
Initial prompt
Agar io tarzı bir oyun yapmak istiyorum
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Cell Class
var EnemyCell = Container.expand(function () {
var self = Container.call(this);
var cell = self.attachAsset('enemyCell', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = cell.width / 2;
self.lastX = self.x;
self.lastY = self.y;
self.lastRadius = self.radius;
self.setSize = function (diameter) {
cell.width = diameter;
cell.height = diameter;
self.radius = diameter / 2;
};
// AI movement target
self.targetX = self.x;
self.targetY = self.y;
self.speed = (3 + 40 / (self.radius + 40)) * 0.3; // 70% slower movement for enemies
self.update = function () {
// Move towards target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
self.lastX = self.x;
self.lastY = self.y;
self.lastRadius = self.radius;
if (dist > self.speed) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
self.x = self.targetX;
self.y = self.targetY;
}
};
return self;
});
// Food Cell Class
var FoodCell = Container.expand(function () {
var self = Container.call(this);
var cell = self.attachAsset('foodCell', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = cell.width / 2;
self.setSize = function (diameter) {
cell.width = diameter;
cell.height = diameter;
self.radius = diameter / 2;
};
return self;
});
// Player Cell Class
var PlayerCell = Container.expand(function () {
var self = Container.call(this);
var cell = self.attachAsset('playerCell', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = cell.width / 2;
self.lastX = self.x;
self.lastY = self.y;
self.lastRadius = self.radius;
self.setSize = function (diameter) {
cell.width = diameter;
cell.height = diameter;
self.radius = diameter / 2;
};
// For smooth movement
self.targetX = self.x;
self.targetY = self.y;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
self.lastRadius = self.radius;
// Drag direction control: move in drag direction if dragging
var speed = 4 + 40 / (self.radius + 40); // Slower movement for player, larger cells move slower
if (typeof dragDirX !== "undefined" && (dragDirX !== 0 || dragDirY !== 0)) {
// Move in drag direction
self.x += dragDirX * speed;
self.y += dragDirY * speed;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf0f0f0
});
/****
* Game Code
****/
// Food cell: yellow ellipse
// Enemy cell: blue ellipse
// Player cell: green ellipse
// Arena size (expanded for a much larger play area)
var ARENA_WIDTH = 4096;
var ARENA_HEIGHT = 5464;
// Player cell
var player = new PlayerCell();
player.setSize(180);
player.x = ARENA_WIDTH / 2;
player.y = ARENA_HEIGHT / 2;
game.addChild(player);
// Arrays for enemies and food
var enemies = [];
var foods = [];
// Score display
var score = 0;
var scoreTxt = new Text2('Score: 0', {
size: 90,
fill: 0x222222
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Helper: spawn food at random position
function spawnFood() {
var food = new FoodCell();
var size = 60 + Math.floor(Math.random() * 40);
food.setSize(size);
food.x = 100 + Math.random() * (ARENA_WIDTH - 200);
food.y = 200 + Math.random() * (ARENA_HEIGHT - 400);
foods.push(food);
game.addChild(food);
}
// Helper: spawn enemy at random position and size
function spawnEnemy() {
var enemy = new EnemyCell();
var size = 120 + Math.floor(Math.random() * 120);
enemy.setSize(size);
// Avoid spawning too close to player
var safe = false;
while (!safe) {
enemy.x = 100 + Math.random() * (ARENA_WIDTH - 200);
enemy.y = 200 + Math.random() * (ARENA_HEIGHT - 400);
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
if (Math.sqrt(dx * dx + dy * dy) > 400) safe = true;
}
// Set initial AI target
enemy.targetX = enemy.x;
enemy.targetY = enemy.y;
enemies.push(enemy);
game.addChild(enemy);
}
// Initial spawn
for (var i = 0; i < 18; i++) spawnFood();
for (var i = 0; i < 7; i++) spawnEnemy();
// Drag-to-move: swipe direction controls player movement
var dragging = false;
var dragStartX = 0;
var dragStartY = 0;
var dragLastX = 0;
var dragLastY = 0;
var dragDirX = 0;
var dragDirY = 0;
function clamp(val, min, max) {
return Math.max(min, Math.min(max, val));
}
game.down = function (x, y, obj) {
dragging = true;
dragStartX = x;
dragStartY = y;
dragLastX = x;
dragLastY = y;
dragDirX = 0;
dragDirY = 0;
};
game.move = function (x, y, obj) {
if (dragging) {
// Calculate drag direction vector
dragDirX = x - dragStartX;
dragDirY = y - dragStartY;
dragLastX = x;
dragLastY = y;
// Normalize direction for smooth control
var len = Math.sqrt(dragDirX * dragDirX + dragDirY * dragDirY);
if (len > 20) {
// Only if drag is significant
dragDirX /= len;
dragDirY /= len;
} else {
dragDirX = 0;
dragDirY = 0;
}
}
};
game.up = function (x, y, obj) {
dragging = false;
// Do not reset dragDirX/dragDirY here; keep last direction for inertia
};
// Main update loop
game.update = function () {
// Update player
player.update();
// Only update and check collisions for enemies and foods near the camera view for performance
var camX = clamp(player.x, 1024, ARENA_WIDTH - 1024);
var camY = clamp(player.y, 1366, ARENA_HEIGHT - 1366);
var camLeft = camX - 1200,
camRight = camX + 1200,
camTop = camY - 1600,
camBottom = camY + 1600;
// Update enemies (only those near camera)
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
// Only update if near camera
if (enemy.x > camLeft - 400 && enemy.x < camRight + 400 && enemy.y > camTop - 400 && enemy.y < camBottom + 400) {
// AI: If player is smaller, chase; if bigger, flee; else random walk
var dx = player.x - enemy.x;
var dy = player.y - enemy.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (enemy.radius > player.radius * 1.15) {
// Enemy is bigger: chase player if not too close to border
if (dist < 900) {
// Move towards player
enemy.targetX = clamp(player.x, enemy.radius, ARENA_WIDTH - enemy.radius);
enemy.targetY = clamp(player.y, enemy.radius, ARENA_HEIGHT - enemy.radius);
} else {
// Random walk
if (LK.ticks % 120 === 0) {
enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
}
}
} else if (enemy.radius < player.radius * 0.85) {
// Enemy is smaller: flee from player
if (dist < 700) {
var angle = Math.atan2(dy, dx) + Math.PI; // Opposite direction
var fleeDist = 300;
enemy.targetX = clamp(enemy.x + Math.cos(angle) * fleeDist, enemy.radius, ARENA_WIDTH - enemy.radius);
enemy.targetY = clamp(enemy.y + Math.sin(angle) * fleeDist, enemy.radius, ARENA_HEIGHT - enemy.radius);
} else {
// Random walk
if (LK.ticks % 120 === 0) {
enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
}
}
} else {
// Similar size: random walk
if (LK.ticks % 120 === 0) {
enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
}
}
enemy.update();
}
}
// --- Collision: Player eats food (only foods near player/camera) ---
for (var i = foods.length - 1; i >= 0; i--) {
var food = foods[i];
// Only check if food is near player/camera
if (food.x > camLeft - 200 && food.x < camRight + 200 && food.y > camTop - 200 && food.y < camBottom + 200) {
var dx = player.x - food.x;
var dy = player.y - food.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < player.radius + food.radius * 0.7) {
// Eat food: grow player by a fixed amount
var growAmount = Math.max(12, food.radius * 0.6);
var newDiameter = player.radius * 2 + growAmount;
newDiameter = Math.min(newDiameter, 600); // Cap max size
player.setSize(newDiameter);
// Score
score += 1;
scoreTxt.setText('Score: ' + score);
// Remove food
food.destroy();
foods.splice(i, 1);
// Spawn new food
spawnFood();
}
}
}
// --- Collision: Enemy eats food (only if both are near camera) ---
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
if (enemy.x > camLeft - 400 && enemy.x < camRight + 400 && enemy.y > camTop - 400 && enemy.y < camBottom + 400) {
for (var i = foods.length - 1; i >= 0; i--) {
var food = foods[i];
if (food.x > camLeft - 200 && food.x < camRight + 200 && food.y > camTop - 200 && food.y < camBottom + 200) {
var dx = enemy.x - food.x;
var dy = enemy.y - food.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < enemy.radius + food.radius * 0.7) {
// Enemy eats food
var newSize = Math.min(enemy.radius * 2 + 12, 400);
enemy.setSize(newSize);
food.destroy();
foods.splice(i, 1);
spawnFood();
}
}
}
}
}
// --- Collision: Player eats enemy or is eaten ---
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = player.x - enemy.x;
var dy = player.y - enemy.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < player.radius + enemy.radius * 0.7) {
if (player.radius > enemy.radius * 1.15) {
// Player eats enemy
var newSize = Math.min(player.radius * 2 + enemy.radius * 2 * 0.7, 700);
player.setSize(newSize);
score += 5;
scoreTxt.setText('Score: ' + score);
enemy.destroy();
enemies.splice(i, 1);
spawnEnemy();
} else if (enemy.radius > player.radius * 1.15) {
// Player is eaten
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// --- Enemy eats enemy ---
for (var i = enemies.length - 1; i >= 0; i--) {
var enemyA = enemies[i];
for (var j = enemies.length - 1; j >= 0; j--) {
if (i === j) continue;
var enemyB = enemies[j];
var dx = enemyA.x - enemyB.x;
var dy = enemyA.y - enemyB.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < enemyA.radius + enemyB.radius * 0.7) {
if (enemyA.radius > enemyB.radius * 1.15) {
// A eats B
var newSize = Math.min(enemyA.radius * 2 + enemyB.radius * 2 * 0.5, 500);
enemyA.setSize(newSize);
enemyB.destroy();
enemies.splice(j, 1);
spawnEnemy();
if (j < i) i--; // Adjust index if needed
}
}
}
}
// Clamp player inside arena
player.x = clamp(player.x, player.radius, ARENA_WIDTH - player.radius);
player.y = clamp(player.y, player.radius, ARENA_HEIGHT - player.radius);
// Clamp enemies inside arena
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
enemy.x = clamp(enemy.x, enemy.radius, ARENA_WIDTH - enemy.radius);
enemy.y = clamp(enemy.y, enemy.radius, ARENA_HEIGHT - enemy.radius);
}
// Camera follow: center the visible area on the player
// LK.stage is the root container for all game objects
// The visible area is 2048x2732 (game resolution)
var camX = clamp(player.x, 1024, ARENA_WIDTH - 1024);
var camY = clamp(player.y, 1366, ARENA_HEIGHT - 1366);
game.x = 1024 - camX;
game.y = 1366 - camY;
}; ===================================================================
--- original.js
+++ change.js
@@ -13,8 +13,11 @@
anchorX: 0.5,
anchorY: 0.5
});
self.radius = cell.width / 2;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.lastRadius = self.radius;
self.setSize = function (diameter) {
cell.width = diameter;
cell.height = diameter;
self.radius = diameter / 2;
@@ -27,8 +30,11 @@
// Move towards target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.lastRadius = self.radius;
if (dist > self.speed) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
@@ -60,8 +66,11 @@
anchorX: 0.5,
anchorY: 0.5
});
self.radius = cell.width / 2;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.lastRadius = self.radius;
self.setSize = function (diameter) {
cell.width = diameter;
cell.height = diameter;
self.radius = diameter / 2;
@@ -69,8 +78,11 @@
// For smooth movement
self.targetX = self.x;
self.targetY = self.y;
self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.lastRadius = self.radius;
// Drag direction control: move in drag direction if dragging
var speed = 4 + 40 / (self.radius + 40); // Slower movement for player, larger cells move slower
if (typeof dragDirX !== "undefined" && (dragDirX !== 0 || dragDirY !== 0)) {
// Move in drag direction
@@ -193,91 +205,108 @@
// Main update loop
game.update = function () {
// Update player
player.update();
- // Update enemies
+ // Only update and check collisions for enemies and foods near the camera view for performance
+ var camX = clamp(player.x, 1024, ARENA_WIDTH - 1024);
+ var camY = clamp(player.y, 1366, ARENA_HEIGHT - 1366);
+ var camLeft = camX - 1200,
+ camRight = camX + 1200,
+ camTop = camY - 1600,
+ camBottom = camY + 1600;
+ // Update enemies (only those near camera)
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
- // AI: If player is smaller, chase; if bigger, flee; else random walk
- var dx = player.x - enemy.x;
- var dy = player.y - enemy.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (enemy.radius > player.radius * 1.15) {
- // Enemy is bigger: chase player if not too close to border
- if (dist < 900) {
- // Move towards player
- enemy.targetX = clamp(player.x, enemy.radius, ARENA_WIDTH - enemy.radius);
- enemy.targetY = clamp(player.y, enemy.radius, ARENA_HEIGHT - enemy.radius);
- } else {
- // Random walk
- if (LK.ticks % 120 === 0) {
- enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
- enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
+ // Only update if near camera
+ if (enemy.x > camLeft - 400 && enemy.x < camRight + 400 && enemy.y > camTop - 400 && enemy.y < camBottom + 400) {
+ // AI: If player is smaller, chase; if bigger, flee; else random walk
+ var dx = player.x - enemy.x;
+ var dy = player.y - enemy.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (enemy.radius > player.radius * 1.15) {
+ // Enemy is bigger: chase player if not too close to border
+ if (dist < 900) {
+ // Move towards player
+ enemy.targetX = clamp(player.x, enemy.radius, ARENA_WIDTH - enemy.radius);
+ enemy.targetY = clamp(player.y, enemy.radius, ARENA_HEIGHT - enemy.radius);
+ } else {
+ // Random walk
+ if (LK.ticks % 120 === 0) {
+ enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
+ enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
+ }
}
- }
- } else if (enemy.radius < player.radius * 0.85) {
- // Enemy is smaller: flee from player
- if (dist < 700) {
- var angle = Math.atan2(dy, dx) + Math.PI; // Opposite direction
- var fleeDist = 300;
- enemy.targetX = clamp(enemy.x + Math.cos(angle) * fleeDist, enemy.radius, ARENA_WIDTH - enemy.radius);
- enemy.targetY = clamp(enemy.y + Math.sin(angle) * fleeDist, enemy.radius, ARENA_HEIGHT - enemy.radius);
+ } else if (enemy.radius < player.radius * 0.85) {
+ // Enemy is smaller: flee from player
+ if (dist < 700) {
+ var angle = Math.atan2(dy, dx) + Math.PI; // Opposite direction
+ var fleeDist = 300;
+ enemy.targetX = clamp(enemy.x + Math.cos(angle) * fleeDist, enemy.radius, ARENA_WIDTH - enemy.radius);
+ enemy.targetY = clamp(enemy.y + Math.sin(angle) * fleeDist, enemy.radius, ARENA_HEIGHT - enemy.radius);
+ } else {
+ // Random walk
+ if (LK.ticks % 120 === 0) {
+ enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
+ enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
+ }
+ }
} else {
- // Random walk
+ // Similar size: random walk
if (LK.ticks % 120 === 0) {
enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
}
}
- } else {
- // Similar size: random walk
- if (LK.ticks % 120 === 0) {
- enemy.targetX = 100 + Math.random() * (ARENA_WIDTH - 200);
- enemy.targetY = 200 + Math.random() * (ARENA_HEIGHT - 400);
- }
+ enemy.update();
}
- enemy.update();
}
- // --- Collision: Player eats food ---
+ // --- Collision: Player eats food (only foods near player/camera) ---
for (var i = foods.length - 1; i >= 0; i--) {
var food = foods[i];
- var dx = player.x - food.x;
- var dy = player.y - food.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < player.radius + food.radius * 0.7) {
- // Eat food: grow player by a fixed amount
- var growAmount = Math.max(12, food.radius * 0.6);
- var newDiameter = player.radius * 2 + growAmount;
- newDiameter = Math.min(newDiameter, 600); // Cap max size
- player.setSize(newDiameter);
- // Score
- score += 1;
- scoreTxt.setText('Score: ' + score);
- // Remove food
- food.destroy();
- foods.splice(i, 1);
- // Spawn new food
- spawnFood();
- }
- }
- // --- Collision: Enemy eats food ---
- for (var j = 0; j < enemies.length; j++) {
- var enemy = enemies[j];
- for (var i = foods.length - 1; i >= 0; i--) {
- var food = foods[i];
- var dx = enemy.x - food.x;
- var dy = enemy.y - food.y;
+ // Only check if food is near player/camera
+ if (food.x > camLeft - 200 && food.x < camRight + 200 && food.y > camTop - 200 && food.y < camBottom + 200) {
+ var dx = player.x - food.x;
+ var dy = player.y - food.y;
var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < enemy.radius + food.radius * 0.7) {
- // Enemy eats food
- var newSize = Math.min(enemy.radius * 2 + 12, 400);
- enemy.setSize(newSize);
+ if (dist < player.radius + food.radius * 0.7) {
+ // Eat food: grow player by a fixed amount
+ var growAmount = Math.max(12, food.radius * 0.6);
+ var newDiameter = player.radius * 2 + growAmount;
+ newDiameter = Math.min(newDiameter, 600); // Cap max size
+ player.setSize(newDiameter);
+ // Score
+ score += 1;
+ scoreTxt.setText('Score: ' + score);
+ // Remove food
food.destroy();
foods.splice(i, 1);
+ // Spawn new food
spawnFood();
}
}
}
+ // --- Collision: Enemy eats food (only if both are near camera) ---
+ for (var j = 0; j < enemies.length; j++) {
+ var enemy = enemies[j];
+ if (enemy.x > camLeft - 400 && enemy.x < camRight + 400 && enemy.y > camTop - 400 && enemy.y < camBottom + 400) {
+ for (var i = foods.length - 1; i >= 0; i--) {
+ var food = foods[i];
+ if (food.x > camLeft - 200 && food.x < camRight + 200 && food.y > camTop - 200 && food.y < camBottom + 200) {
+ var dx = enemy.x - food.x;
+ var dy = enemy.y - food.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < enemy.radius + food.radius * 0.7) {
+ // Enemy eats food
+ var newSize = Math.min(enemy.radius * 2 + 12, 400);
+ enemy.setSize(newSize);
+ food.destroy();
+ foods.splice(i, 1);
+ spawnFood();
+ }
+ }
+ }
+ }
+ }
// --- Collision: Player eats enemy or is eaten ---
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = player.x - enemy.x;