User prompt
1 dk de 100 puan olmazsa oyunu kaybetsin ve kalan süreyi canın altında göstersin
User prompt
bomba ya temas edince bomb çalsın kurabiyeye temas edince eat çalsın
User prompt
100 puan olunca oyunu kazanlım
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var bigR = bigCircle.children[0].width / 2 * bigCircle.scaleX;' Line Number: 236
User prompt
bombalara temas edersek 1 canımız gitsin 3 canımız olsun ve bombaya temas etiğimizde bomba yok olsun bomba sayısı 5 olsun
User prompt
kurabiye gibi bomba da doğsun
Code edit (1 edits merged)
Please save this source code
User prompt
arka plan olsun
User prompt
puan ekranın üst ortasında olsun
User prompt
puan yenilensin
User prompt
score her bir kurabiyeye temas edince 5 artsın
User prompt
score yazısı beyaz olsun
User prompt
her kurabiye aldığımda score 5 artsın
User prompt
her kurabiyeye temas etiğimde 5 puan kazanıyım ve puan sol üst köşede gözüksün
User prompt
bir kurabiye yok olunca yeni bir kurabiye doğsun
User prompt
kurabiyeler her yerde olabilsin ama büyük daireni içine de veya çevrasınde olsmasın
User prompt
bir sürü kurabiye olsun
User prompt
puan ekranın üst sol köşesinde gözüksün
User prompt
char kurabiye ile temas ederse kurabiye yok olsun ve puanımız 5 artsın
User prompt
kurabiyeyi oyuna ekle ama büyük dairenin dışına ekle
User prompt
char alandan çıkamasın
User prompt
kurabiyeler pick rondom olsun
User prompt
Please fix the bug: 'ReferenceError: spawnCookie is not defined' in or related to this line: 'spawnCookie();' Line Number: 260
User prompt
Please fix the bug: 'ReferenceError: spawnCookie is not defined' in or related to this line: 'spawnCookie();' Line Number: 256
/**** * Classes ****/ // Class for the big circle (background) var BigCircle = Container.expand(function () { var self = Container.call(this); // Attach the big circle asset (ellipse) var circle = self.attachAsset('bigCircle', { anchorX: 0.5, anchorY: 0.5 }); // For possible future use: self.radius = circle.width / 2; return self; }); // Character class: simple box character var Character = Container.expand(function () { var self = Container.call(this); // Attach a red box asset as the character var charAsset = self.attachAsset('character', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // We need tween for possible future animations, but not required for MVP. // var tween = LK.import('@upit/tween.v1'); // Class for the draggable small circle var SmallCircle = Container.expand(function () { var self = Container.call(this); // Attach the small circle asset (ellipse) var circle = self.attachAsset('smallCircle', { anchorX: 0.5, anchorY: 0.5 }); // For possible future use: self.radius = circle.width / 2; // No per-object event handlers; all drag logic is handled in the main game. return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xae890f // Açık renkli arka plan }); /**** * Game Code ****/ // --- Start the timer when the game starts --- // (Timer removed) // --- Score Text in Top-Center --- // Create score text and add to gui.top (top-center of the screen) var scoreTxt = new Text2(LK.getScore().toString(), { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); // Center horizontally, top edge scoreTxt.x = 0; // x=0 for gui.top, which is already centered scoreTxt.y = 20; // Some padding from top LK.gui.top.addChild(scoreTxt); // Update score text when score changes (patch game.update) var _oldUpdate = game.update; game.update = function () { if (_oldUpdate) { _oldUpdate.apply(this, arguments); } if (scoreTxt) { scoreTxt.setText(LK.getScore().toString()); } // If player wins or loses, stop timer if ((LK.getScore() >= 100 || can === 0) && typeof timerInterval !== "undefined" && !timerBitti) { timerBitti = true; LK.clearInterval(timerInterval); } }; // --- Reset logic: when the game is reset, everything is re-initialized by LK ---; // --- Game Variables --- var bigCircle, smallCircle; var dragNode = null; var lastInside = true; // --- Create and Position Circles --- // Place both circles in the bottom-left corner, scaled down // New radii for smaller circles var bigCircleScale = 0.35; var smallCircleScale = 0.35; // Create big circle and add to game bigCircle = new BigCircle(); game.addChild(bigCircle); // Scale down big circle bigCircle.scaleX = bigCircleScale; bigCircle.scaleY = bigCircleScale; // Lower opacity for big circle bigCircle.alpha = 0.4; // Calculate position so the big circle is fully visible in the bottom-left var bigR = 0; if (bigCircle.children && bigCircle.children[0] && typeof bigCircle.children[0].width === "number") { bigR = bigCircle.children[0].width / 2 * bigCircleScale; } else { // fallback: use asset size directly if children[0] is not available var tempAsset = LK.getAsset('bigCircle', { anchorX: 0.5, anchorY: 0.5 }); bigR = tempAsset.width / 2 * bigCircleScale; tempAsset.destroy && tempAsset.destroy(); } bigCircle.x = bigR + 40; // 40px margin from left bigCircle.y = 2732 - bigR - 40; // 40px margin from bottom // Overlay a smaller circle of background color to create a ring effect var ringInnerScale = 0.80; // Adjust for ring thickness (0.80 = 80% of big circle) var ringInner = LK.getAsset('bigCircle', { anchorX: 0.5, anchorY: 0.5, scaleX: ringInnerScale, scaleY: ringInnerScale, x: 0, y: 0, color: 0x222222 // match background color }); bigCircle.addChild(ringInner); // Create small circle and add to game smallCircle = new SmallCircle(); game.addChild(smallCircle); // Scale down small circle smallCircle.scaleX = smallCircleScale; smallCircle.scaleY = smallCircleScale; // Place small circle at center of big circle var smallR = 0; if (smallCircle.children && smallCircle.children[0] && typeof smallCircle.children[0].width === "number") { smallR = smallCircle.children[0].width / 2 * smallCircleScale; } else { var tempAsset = LK.getAsset('smallCircle', { anchorX: 0.5, anchorY: 0.5 }); smallR = tempAsset.width / 2 * smallCircleScale; tempAsset.destroy && tempAsset.destroy(); } smallCircle.x = bigCircle.x; smallCircle.y = bigCircle.y; // --- Add multiple kurabiye (cookies) and bombs outside the big circle --- var kurabiyeler = []; var bombalar = []; var numKurabiye = 8; // You can increase for more cookies var numBomba = 5; // Number of bombs to spawn (always 5 bombs) var can = 3; // Player starts with 3 can (lives) // Can (life) text in top-center, below score var canTxt = new Text2("❤❤❤", { size: 80, fill: 0xff4444 }); canTxt.anchor.set(0.5, 0); canTxt.x = 0; canTxt.y = 120; // Below score LK.gui.top.addChild(canTxt); // Timer text below can var sureTxt = new Text2("60", { size: 70, fill: 0xFFFFFF }); sureTxt.anchor.set(0.5, 0); sureTxt.x = 0; sureTxt.y = 200; // Below can LK.gui.top.addChild(sureTxt); // Helper to update can text function updateCanText() { var hearts = ""; for (var i = 0; i < can; i++) hearts += "❤"; canTxt.setText(hearts); } // Timer logic var sureKalan = 60; // seconds var timerBitti = false; var timerInterval = LK.setInterval(function () { if (timerBitti) return; sureKalan--; if (sureKalan < 0) sureKalan = 0; if (sureTxt) sureTxt.setText(sureKalan.toString()); // If time runs out and score < 100, lose if (sureKalan === 0 && LK.getScore() < 100) { timerBitti = true; LK.showGameOver(); } }, 1000); // Helper function to place an item (kurabiye or bomba) outside the big circle ring function placeItemOutsideRing(assetId) { var item = LK.getAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); game.addChild(item); var itemR = item.width / 2; var placed = false; var maxTries = 100; var tries = 0; while (!placed && tries < maxTries) { // Random position anywhere in game area, but not inside or touching the big circle ring var x = itemR + 10 + Math.random() * (2048 - 2 * (itemR + 10)); var y = itemR + 10 + Math.random() * (2732 - 2 * (itemR + 10)); // Distance from big circle center var dx = x - bigCircle.x; var dy = y - bigCircle.y; var dist = Math.sqrt(dx * dx + dy * dy); var bigOuterR = bigCircle.children[0].width / 2 * bigCircle.scaleX; var ringInnerScale = 0.80; var bigInnerR = bigOuterR * ringInnerScale; // Place only if item is NOT overlapping the ring (not inside or touching the ring) // So: dist + itemR < bigInnerR OR dist - itemR > bigOuterR if (dist + itemR < bigInnerR || dist - itemR > bigOuterR) { item.x = x; item.y = y; placed = true; } tries++; } // If not placed after maxTries, just put it in a random valid spot at the edge if (!placed) { // Place at a random angle just outside the big circle var angle = Math.random() * 2 * Math.PI; var distance = bigCircle.children[0].width / 2 * bigCircle.scaleX + itemR + 20; item.x = bigCircle.x + Math.cos(angle) * distance; item.y = bigCircle.y + Math.sin(angle) * distance; // Clamp to stay inside game area if (item.x < itemR) { item.x = itemR + 10; } if (item.x > 2048 - itemR) { item.x = 2048 - itemR - 10; } if (item.y < itemR) { item.y = itemR + 10; } if (item.y > 2732 - itemR) { item.y = 2732 - itemR - 10; } } return item; } // Spawn kurabiyeler for (var i = 0; i < numKurabiye; i++) { var kurabiye = placeItemOutsideRing('kurabiye'); kurabiyeler.push(kurabiye); } // Spawn bombalar for (var i = 0; i < numBomba; i++) { var bomba = placeItemOutsideRing('bomba'); bombalar.push(bomba); } updateCanText(); // --- Create and position character in the center of the screen --- var character = new Character(); game.addChild(character); // Center character on screen (2048x2732), anchor is 0.5 so this is true center character.x = 2048 / 2; character.y = 2732 / 2; // --- Helper: Check if small circle is fully inside big circle --- function isSmallCircleInsideBigCircle() { // Both circles are centered at their x/y var dx = smallCircle.x - bigCircle.x; var dy = smallCircle.y - bigCircle.y; var dist = Math.sqrt(dx * dx + dy * dy); // Use scaled radii var bigR = 0; if (bigCircle.children && bigCircle.children[0] && typeof bigCircle.children[0].width === "number") { bigR = bigCircle.children[0].width / 2 * bigCircle.scaleX; } else { var tempAsset = LK.getAsset('bigCircle', { anchorX: 0.5, anchorY: 0.5 }); bigR = tempAsset.width / 2 * bigCircle.scaleX; tempAsset.destroy && tempAsset.destroy(); } var smallR = 0; if (smallCircle.children && smallCircle.children[0] && typeof smallCircle.children[0].width === "number") { smallR = smallCircle.children[0].width / 2 * smallCircle.scaleX; } else { var tempAsset2 = LK.getAsset('smallCircle', { anchorX: 0.5, anchorY: 0.5 }); smallR = tempAsset2.width / 2 * smallCircle.scaleX; tempAsset2.destroy && tempAsset2.destroy(); } // The small circle is fully inside if its center is at most (bigR - smallR) from the center return dist <= bigR - smallR; } // --- Timer Logic --- // (Timer logic removed) // --- Drag Logic --- // Convert move to keep smallCircle inside bigCircle function clampSmallCirclePosition(x, y) { var bigR = 0; if (bigCircle.children && bigCircle.children[0] && typeof bigCircle.children[0].width === "number") { bigR = bigCircle.children[0].width / 2 * bigCircle.scaleX; } else { var tempAsset = LK.getAsset('bigCircle', { anchorX: 0.5, anchorY: 0.5 }); bigR = tempAsset.width / 2 * bigCircle.scaleX; tempAsset.destroy && tempAsset.destroy(); } var smallR = 0; if (smallCircle.children && smallCircle.children[0] && typeof smallCircle.children[0].width === "number") { smallR = smallCircle.children[0].width / 2 * smallCircle.scaleX; } else { var tempAsset2 = LK.getAsset('smallCircle', { anchorX: 0.5, anchorY: 0.5 }); smallR = tempAsset2.width / 2 * smallCircle.scaleX; tempAsset2.destroy && tempAsset2.destroy(); } var dx = x - bigCircle.x; var dy = y - bigCircle.y; var dist = Math.sqrt(dx * dx + dy * dy); var maxDist = bigR - smallR; if (dist > maxDist) { // Clamp to the edge var angle = Math.atan2(dy, dx); x = bigCircle.x + Math.cos(angle) * maxDist; y = bigCircle.y + Math.sin(angle) * maxDist; } return { x: x, y: y }; } // --- Game Event Handlers --- // Only allow dragging the small circle game.down = function (x, y, obj) { // Check if the down is on the small circle // Convert global to local for smallCircle var local = smallCircle.toLocal(game.toGlobal({ x: x, y: y })); var smallR = 0; if (smallCircle.children && smallCircle.children[0] && typeof smallCircle.children[0].width === "number") { smallR = smallCircle.children[0].width / 2; } else { var tempAsset = LK.getAsset('smallCircle', { anchorX: 0.5, anchorY: 0.5 }); smallR = tempAsset.width / 2; tempAsset.destroy && tempAsset.destroy(); } // Check if within the circle if ((local.x - 0) * (local.x - 0) + (local.y - 0) * (local.y - 0) <= smallR * smallR) { dragNode = smallCircle; } }; game.up = function (x, y, obj) { dragNode = null; // When releasing, snap smallCircle to center of bigCircle smallCircle.x = bigCircle.x; smallCircle.y = bigCircle.y; }; function handleMove(x, y, obj) { if (dragNode === smallCircle) { // Clamp position so the small circle never leaves the big circle var clamped = clampSmallCirclePosition(x, y); smallCircle.x = clamped.x; smallCircle.y = clamped.y; } // Check if small circle is still inside big circle // (No game over or timer logic needed) lastInside = isSmallCircleInsideBigCircle(); } game.move = handleMove; // --- Game Update Loop --- game.update = function () { // Calculate direction from bigCircle center to smallCircle center var dx = smallCircle.x - bigCircle.x; var dy = smallCircle.y - bigCircle.y; var dist = Math.sqrt(dx * dx + dy * dy); // Only move if the small circle is not exactly at the center AND is being dragged if (dist > 1 && dragNode === smallCircle) { // Normalize direction var dirX = dx / dist; var dirY = dy / dist; // Move character a fixed speed per frame (e.g. 8px per frame) var speed = 8; character.x += dirX * speed; character.y += dirY * speed; } // Clamp character position so it cannot leave the game area var charW = 0, charH = 0; if (character.children && character.children[0] && typeof character.children[0].width === "number") { charW = character.children[0].width * 0.5; charH = character.children[0].height * 0.5; } else { var tempAsset = LK.getAsset('character', { anchorX: 0.5, anchorY: 0.5 }); charW = tempAsset.width * 0.5; charH = tempAsset.height * 0.5; tempAsset.destroy && tempAsset.destroy(); } if (character.x < charW) { character.x = charW; } if (character.x > 2048 - charW) { character.x = 2048 - charW; } if (character.y < charH) { character.y = charH; } if (character.y > 2732 - charH) { character.y = 2732 - charH; } // --- Kurabiye collision and score logic --- for (var i = kurabiyeler.length - 1; i >= 0; i--) { var k = kurabiyeler[i]; if (k && character.intersects(k)) { LK.getSound('eat').play(); k.destroy(); kurabiyeler.splice(i, 1); // Her bir kurabiyeye temas edince 5 puan artır LK.setScore(LK.getScore() + 5); if (scoreTxt) { scoreTxt.setText(LK.getScore().toString()); } // Win if score is 100 or more if (LK.getScore() >= 100) { if (typeof timerInterval !== "undefined" && !timerBitti) { timerBitti = true; LK.clearInterval(timerInterval); } LK.showYouWin(); return; } // --- Spawn a new kurabiye outside the big circle ring --- var kurabiye = LK.getAsset('kurabiye', { anchorX: 0.5, anchorY: 0.5 }); game.addChild(kurabiye); var kurabiyeR = kurabiye.width / 2; var placed = false; var maxTries = 100; var tries = 0; while (!placed && tries < maxTries) { // Random position anywhere in game area, but not inside or touching the big circle ring var x = kurabiyeR + 10 + Math.random() * (2048 - 2 * (kurabiyeR + 10)); var y = kurabiyeR + 10 + Math.random() * (2732 - 2 * (kurabiyeR + 10)); // Distance from big circle center var dx = x - bigCircle.x; var dy = y - bigCircle.y; var dist = Math.sqrt(dx * dx + dy * dy); var bigOuterR = bigCircle.children[0].width / 2 * bigCircle.scaleX; var ringInnerScale = 0.80; var bigInnerR = bigOuterR * ringInnerScale; // Place only if kurabiye is NOT overlapping the ring (not inside or touching the ring) // So: dist + kurabiyeR < bigInnerR OR dist - kurabiyeR > bigOuterR if (dist + kurabiyeR < bigInnerR || dist - kurabiyeR > bigOuterR) { kurabiye.x = x; kurabiye.y = y; placed = true; } tries++; } // If not placed after maxTries, just put it in a random valid spot at the edge if (!placed) { // Place at a random angle just outside the big circle var angle = Math.random() * 2 * Math.PI; var distance = bigOuterR + kurabiyeR + 20; kurabiye.x = bigCircle.x + Math.cos(angle) * distance; kurabiye.y = bigCircle.y + Math.sin(angle) * distance; // Clamp to stay inside game area if (kurabiye.x < kurabiyeR) { kurabiye.x = kurabiyeR + 10; } if (kurabiye.x > 2048 - kurabiyeR) { kurabiye.x = 2048 - kurabiyeR - 10; } if (kurabiye.y < kurabiyeR) { kurabiye.y = kurabiyeR + 10; } if (kurabiye.y > 2732 - kurabiyeR) { kurabiye.y = 2732 - kurabiyeR - 10; } } kurabiyeler.push(kurabiye); } } ; // --- Bomb collision and can logic --- for (var i = bombalar.length - 1; i >= 0; i--) { var b = bombalar[i]; if (b && character.intersects(b)) { LK.getSound('bomb').play(); b.destroy(); bombalar.splice(i, 1); can--; if (can < 0) can = 0; if (typeof updateCanText === "function") updateCanText(); // Game over if can is 0 if (can === 0) { if (typeof timerInterval !== "undefined" && !timerBitti) { timerBitti = true; LK.clearInterval(timerInterval); } LK.showGameOver(); return; } // Always keep 5 bombs on screen while (bombalar.length < numBomba) { var newBomba = placeItemOutsideRing('bomba'); bombalar.push(newBomba); } } } }; // --- Start the timer when the game starts --- // (Timer removed) // --- Reset logic: when the game is reset, everything is re-initialized by LK ---
===================================================================
--- original.js
+++ change.js
@@ -67,8 +67,13 @@
}
if (scoreTxt) {
scoreTxt.setText(LK.getScore().toString());
}
+ // If player wins or loses, stop timer
+ if ((LK.getScore() >= 100 || can === 0) && typeof timerInterval !== "undefined" && !timerBitti) {
+ timerBitti = true;
+ LK.clearInterval(timerInterval);
+ }
};
// --- Reset logic: when the game is reset, everything is re-initialized by LK ---;
// --- Game Variables ---
var bigCircle, smallCircle;
@@ -148,14 +153,37 @@
canTxt.anchor.set(0.5, 0);
canTxt.x = 0;
canTxt.y = 120; // Below score
LK.gui.top.addChild(canTxt);
+// Timer text below can
+var sureTxt = new Text2("60", {
+ size: 70,
+ fill: 0xFFFFFF
+});
+sureTxt.anchor.set(0.5, 0);
+sureTxt.x = 0;
+sureTxt.y = 200; // Below can
+LK.gui.top.addChild(sureTxt);
// Helper to update can text
function updateCanText() {
var hearts = "";
for (var i = 0; i < can; i++) hearts += "❤";
canTxt.setText(hearts);
}
+// Timer logic
+var sureKalan = 60; // seconds
+var timerBitti = false;
+var timerInterval = LK.setInterval(function () {
+ if (timerBitti) return;
+ sureKalan--;
+ if (sureKalan < 0) sureKalan = 0;
+ if (sureTxt) sureTxt.setText(sureKalan.toString());
+ // If time runs out and score < 100, lose
+ if (sureKalan === 0 && LK.getScore() < 100) {
+ timerBitti = true;
+ LK.showGameOver();
+ }
+}, 1000);
// Helper function to place an item (kurabiye or bomba) outside the big circle ring
function placeItemOutsideRing(assetId) {
var item = LK.getAsset(assetId, {
anchorX: 0.5,
@@ -399,8 +427,12 @@
scoreTxt.setText(LK.getScore().toString());
}
// Win if score is 100 or more
if (LK.getScore() >= 100) {
+ if (typeof timerInterval !== "undefined" && !timerBitti) {
+ timerBitti = true;
+ LK.clearInterval(timerInterval);
+ }
LK.showYouWin();
return;
}
// --- Spawn a new kurabiye outside the big circle ring ---
@@ -469,8 +501,12 @@
if (can < 0) can = 0;
if (typeof updateCanText === "function") updateCanText();
// Game over if can is 0
if (can === 0) {
+ if (typeof timerInterval !== "undefined" && !timerBitti) {
+ timerBitti = true;
+ LK.clearInterval(timerInterval);
+ }
LK.showGameOver();
return;
}
// Always keep 5 bombs on screen