User prompt
Oyunda toplam skor ve level skoru olacak şekilde 2 adet skor yazımız olsun. Level skoru her levelde elde edilen skor. Toplam skor ise oyunun toplam skoru. Level bittiğinde level skorunu toplam skora ekleyelim. Level başladığında level skoru o levelde çıkan duvar sayısı çarpı 100 olsun. Her duvara çarptığımda level skorundan 20 puan düşelim.
User prompt
ilk levelde duvar olmasın
User prompt
ilk levelden itibaren hedef ile player arasında her zaman en az 1 duvar olsun
User prompt
hedef vurulduğunda target_broken resmini göster
User prompt
Please fix the bug: 'TypeError: Cannot read properties of null (reading 'x')' in or related to this line: 'var dx = b.x - target.x;' Line Number: 403
User prompt
Hedefe vurduğumda hedefin kırılmış halini de göstermek istiyorum. Hedefe vurduktan 2 saniye sonra yeni levele geçelim
User prompt
kenarlar çarpınca ses çıkmasın. Obstacle'a her çarptığımda break ve 3.çarptığımda break3 sesi çalsın
User prompt
Duvar'lara her çarptığında break sesi , 3. kez çarptığında break3 sesi çalsın
User prompt
kenarlara çarpınca ses gelmesin
User prompt
top kenarlara çarpınca ses çıkmasın sadece duvarlara çarpınca ses çıksın. Duvara 3. vuruşta farklı bir ses olsun. Kaleyi vurunca da farklı bir ses olsun
User prompt
duvara her çarptığında kırılma sesi gelsin
Code edit (1 edits merged)
Please save this source code
User prompt
Restart butonunun boyutunu %50 oranında arttır
Code edit (8 edits merged)
Please save this source code
User prompt
Baştan Başla butonunu kaldır
Code edit (1 edits merged)
Please save this source code
User prompt
Butonlar oyunu durdurma simgesinin altında olsun
User prompt
areBorder gözükmüyor
Code edit (1 edits merged)
Please save this source code
User prompt
oyunun sınırları görünsün
User prompt
oyunun sınırları belli olsun
User prompt
oyunun arka plan resmi olsun
User prompt
duvarlara 3 kere çarpınca duvar kırılsın. Duvara çarpma anında duvar üzerinde çatlak oluşsun, tekrar çarptığında çatlar büyüsün. 3. kez çarptığında kırılma sesi ile birlikte duvar yok olsun.
Code edit (1 edits merged)
Please save this source code
User prompt
butonları sağ üste koy
/**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletAsset = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = bulletAsset.width / 2; self.vx = 0; self.vy = 0; self.lastX = 0; self.lastY = 0; self.update = function () { self.lastX = self.x; self.lastY = self.y; self.x += self.vx; self.y += self.vy; // Rotate bullet to match its direction if (self.vx !== 0 || self.vy !== 0) { bulletAsset.rotation = Math.atan2(self.vy, self.vx); } // Wall bounce if (self.x - self.radius <= ARENA_X && self.lastX - self.radius > ARENA_X) { self.x = ARENA_X + self.radius; self.vx *= -1; } if (self.x + self.radius >= ARENA_X + ARENA_SIZE && self.lastX + self.radius < ARENA_X + ARENA_SIZE) { self.x = ARENA_X + ARENA_SIZE - self.radius; self.vx *= -1; } if (self.y - self.radius <= ARENA_Y && self.lastY - self.radius > ARENA_Y) { self.y = ARENA_Y + self.radius; self.vy *= -1; } if (self.y + self.radius >= ARENA_Y + ARENA_SIZE && self.lastY + self.radius < ARENA_Y + ARENA_SIZE) { self.y = ARENA_Y + ARENA_SIZE - self.radius; self.vy *= -1; } }; return self; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obsAsset = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.width = obsAsset.width; self.height = obsAsset.height; // Crack state: 0 = no crack, 1 = small crack, 2 = big crack, 3 = broken self.crackLevel = 0; self.crackAsset = null; // Show crack overlay self.showCrack = function (level) { // Remove previous crack asset if any if (self.crackAsset) { self.crackAsset.destroy(); self.crackAsset = null; } if (level === 1) { // Small crack self.crackAsset = self.attachAsset('obstacle_crack1', { anchorX: 0.5, anchorY: 0.5 }); } else if (level === 2) { // Big crack self.crackAsset = self.attachAsset('obstacle_crack2', { anchorX: 0.5, anchorY: 0.5 }); } // If level 0 or 3, no crack overlay }; // Break wall (remove from game) self.breakWall = function () { // Play break sound var breakSound = LK.getSound && LK.getSound('break'); if (breakSound) { breakSound.play(); } // Remove crack asset if any if (self.crackAsset) { self.crackAsset.destroy(); self.crackAsset = null; } // Remove self from game self.destroy(); }; return self; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerAsset = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.radius = playerAsset.width / 2; return self; }); // Target class var Target = Container.expand(function () { var self = Container.call(this); var targetAsset = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5 }); self.radius = targetAsset.width / 2; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Wall break sound // Big crack overlay // Small crack overlay // Add background image to the game scene var backgroundImg = LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 2048, height: 2732 }); game.addChild(backgroundImg); // Arena and gameplay variables var ARENA_SIZE = 1800; // Square arena, fits well in 2048x2732 var ARENA_X = (2048 - ARENA_SIZE) / 2; var ARENA_Y = (2732 - ARENA_SIZE) / 2; // Add visible arena border using a white rectangle shape var borderThickness = 16; var borderColor = 0xffffff; var arenaBorder = LK.getAsset('arenaBorder', { anchorX: 0, anchorY: 0, x: ARENA_X - borderThickness / 2, y: ARENA_Y - borderThickness / 2, width: ARENA_SIZE + borderThickness, height: ARENA_SIZE + borderThickness, color: borderColor, shape: 'box' }); game.addChild(arenaBorder); // Arena and gameplay variables var ARENA_SIZE = 1800; // Square arena, fits well in 2048x2732 var ARENA_X = (2048 - ARENA_SIZE) / 2; var ARENA_Y = (2732 - ARENA_SIZE) / 2; var player = null; var target = null; var bullets = []; var obstacles = []; var level = 1; var isAiming = false; var aimLine = null; var aimStart = null; var aimEnd = null; // Store X positions for each level so they are consistent on restart var levelPositions = {}; function setupLevel(lvl) { // Always ensure arena border is above background and below gameplay elements if (arenaBorder && arenaBorder.parent) { arenaBorder.parent.removeChild(arenaBorder); } game.addChild(arenaBorder); // Clear previous if (player) { player.destroy(); } if (target) { target.destroy(); } for (var i = 0; i < bullets.length; ++i) { bullets[i].destroy(); } bullets = []; for (var i = 0; i < obstacles.length; ++i) { obstacles[i].destroy(); } obstacles = []; // Player at random X along bottom, but keep same X for same level player = new Player(); var playerMinX = ARENA_X + player.radius + 60; var playerMaxX = ARENA_X + ARENA_SIZE - player.radius - 60; if (!levelPositions[lvl]) { levelPositions[lvl] = {}; levelPositions[lvl].playerX = playerMinX + Math.random() * (playerMaxX - playerMinX); } player.x = levelPositions[lvl].playerX; player.y = ARENA_Y + ARENA_SIZE - 120; game.addChild(player); // Set player asset rotation to default (facing up) if (typeof player.children !== "undefined" && player.children.length > 0) { var playerAsset = player.children[0]; playerAsset.rotation = -Math.PI / 2; } // Target at random X along top, but keep same X for same level target = new Target(); var targetMinX = ARENA_X + target.radius + 60; var targetMaxX = ARENA_X + ARENA_SIZE - target.radius - 60; if (!levelPositions[lvl].targetX) { levelPositions[lvl].targetX = targetMinX + Math.random() * (targetMaxX - targetMinX); } target.x = levelPositions[lvl].targetX; target.y = ARENA_Y + 120; game.addChild(target); // Obstacles for level > 1 if (lvl > 1) { var obsCount = Math.min(lvl - 1, 10); // Store obstacle positions for each level so they remain the same on restart if (!levelPositions[lvl].obstacles) { levelPositions[lvl].obstacles = []; for (var i = 0; i < obsCount; ++i) { // Distribute obstacles at different positions, not just center // Alternate between left, right, and center, and randomize Y var obsDummy = new Obstacle(); var posType = i % 3; var margin = 200; var xPos; var maxTries = 20; var tryCount = 0; do { if (posType === 0) { // Left third xPos = ARENA_X + margin + obsDummy.width / 2 + Math.random() * (ARENA_SIZE / 3 - margin - obsDummy.width); } else if (posType === 1) { // Right third xPos = ARENA_X + 2 * ARENA_SIZE / 3 + margin + obsDummy.width / 2 + Math.random() * (ARENA_SIZE / 3 - margin - obsDummy.width); } else { // Center third xPos = ARENA_X + ARENA_SIZE / 3 + margin + obsDummy.width / 2 + Math.random() * (ARENA_SIZE / 3 - 2 * margin - obsDummy.width); } tryCount++; // Avoid same X as player or target (±1 px tolerance) } while ((Math.abs(xPos - levelPositions[lvl].playerX) < obsDummy.width || Math.abs(xPos - levelPositions[lvl].targetX) < obsDummy.width) && tryCount < maxTries); // Y position: spread vertically, but randomize a bit var yBase = ARENA_Y + ARENA_SIZE / (obsCount + 1) * (i + 1); var yRand = Math.random() * 120 - 60; // -60 to +60 px var yPos = yBase + yRand; levelPositions[lvl].obstacles.push({ x: xPos, y: yPos }); obsDummy.destroy(); } } for (var i = 0; i < levelPositions[lvl].obstacles.length; ++i) { var obs = new Obstacle(); obs.x = levelPositions[lvl].obstacles[i].x; obs.y = levelPositions[lvl].obstacles[i].y; game.addChild(obs); obstacles.push(obs); } } } setupLevel(level); // Level counter text var levelTxt = new Text2('Level: ' + level, { size: 100, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); // Place at top center, but not in the top left 100x100 area LK.gui.top.addChild(levelTxt); // Add a button to restart the current level (without resetting level number) var retryBtn = new Text2('↺', { size: 80, fill: 0xFFFFFF }); retryBtn.anchor.set(0.5, 0.5); // Place at top left, just below the restart button, still below the 100x100 reserved area retryBtn.x = 550; retryBtn.y = 120; retryBtn.interactive = true; retryBtn.buttonMode = true; retryBtn.down = function (x, y, obj) { setupLevel(level); if (levelTxt) { levelTxt.setText('Level: ' + level); } }; LK.gui.top.addChild(retryBtn); // Aiming and shooting game.down = function (x, y, obj) { // Only allow aiming if no bullet is in play if (bullets.length === 0) { isAiming = true; aimStart = { x: player.x, y: player.y }; aimEnd = { x: x, y: y }; } }; game.move = function (x, y, obj) { if (isAiming) { aimEnd = { x: x, y: y }; // Rotate player asset to match the aiming direction var dx = aimEnd.x - player.x; var dy = aimEnd.y - player.y; if (typeof player.children !== "undefined" && player.children.length > 0) { // playerAsset is the first child var playerAsset = player.children[0]; playerAsset.rotation = Math.atan2(dy, dx); } } }; game.up = function (x, y, obj) { if (isAiming) { // Fire bullet var dx = aimEnd.x - player.x; var dy = aimEnd.y - player.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 10) { var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; var speed = 30; bullet.vx = dx / len * speed; bullet.vy = dy / len * speed; bullets.push(bullet); game.addChild(bullet); } isAiming = false; aimStart = null; aimEnd = null; // Reset player asset rotation to default (facing up) if (typeof player.children !== "undefined" && player.children.length > 0) { var playerAsset = player.children[0]; playerAsset.rotation = -Math.PI / 2; } } }; // Main update loop game.update = function () { // Draw aim line if aiming if (isAiming && aimStart && aimEnd) { if (!aimLine) { aimLine = LK.getAsset('aimLine', { anchorX: 0, anchorY: 0 }); game.addChild(aimLine); } // Set aimLine position and size var dx = aimEnd.x - aimStart.x; var dy = aimEnd.y - aimStart.y; var len = Math.sqrt(dx * dx + dy * dy); aimLine.x = aimStart.x; aimLine.y = aimStart.y; aimLine.width = len; aimLine.height = 10; aimLine.rotation = Math.atan2(dy, dx); } else if (aimLine) { aimLine.destroy(); aimLine = null; } // Update bullets for (var i = bullets.length - 1; i >= 0; --i) { var b = bullets[i]; b.update(); // Check collision with target var dx = b.x - target.x; var dy = b.y - target.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < b.radius + target.radius) { // Hit! Next level b.destroy(); bullets.splice(i, 1); level += 1; setupLevel(level); if (levelTxt) { levelTxt.setText('Level: ' + level); } return; } // Check collision with obstacles for (var j = obstacles.length - 1; j >= 0; --j) { var obs = obstacles[j]; var left = obs.x - obs.width / 2; var right = obs.x + obs.width / 2; var top = obs.y - obs.height / 2; var bottom = obs.y + obs.height / 2; // Simple AABB collision if (b.x + b.radius > left && b.x - b.radius < right && b.y + b.radius > top && b.y - b.radius < bottom) { // Reflect bullet: pick axis of minimum penetration var overlapX = Math.min(Math.abs(b.x + b.radius - left), Math.abs(b.x - b.radius - right)); var overlapY = Math.min(Math.abs(b.y + b.radius - top), Math.abs(b.y - b.radius - bottom)); if (overlapX < overlapY) { b.vx *= -1; } else { b.vy *= -1; } // Crack and break logic if (typeof obs.crackLevel === "undefined") { obs.crackLevel = 0; } obs.crackLevel++; if (obs.crackLevel === 1) { if (typeof obs.showCrack === "function") { obs.showCrack(1); } } else if (obs.crackLevel === 2) { if (typeof obs.showCrack === "function") { obs.showCrack(2); } } else if (obs.crackLevel >= 3) { if (typeof obs.breakWall === "function") { obs.breakWall(); } obstacles.splice(j, 1); } } } // Remove bullet if out of arena for too long (failsafe) if (b.x < ARENA_X - 200 || b.x > ARENA_X + ARENA_SIZE + 200 || b.y < ARENA_Y - 200 || b.y > ARENA_Y + ARENA_SIZE + 200) { b.destroy(); bullets.splice(i, 1); } } };
===================================================================
--- original.js
+++ change.js
@@ -274,36 +274,17 @@
});
levelTxt.anchor.set(0.5, 0);
// Place at top center, but not in the top left 100x100 area
LK.gui.top.addChild(levelTxt);
-// Restart level button (restarts from level 1)
-var restartBtn = new Text2('↺', {
- size: 100,
- fill: 0xFFFFFF
-});
-restartBtn.anchor.set(0.5, 0.5);
-// Place at top left, just below the 100x100 reserved area for pause/menu
-restartBtn.x = 120;
-restartBtn.y = 120;
-restartBtn.interactive = true;
-restartBtn.buttonMode = true;
-restartBtn.down = function (x, y, obj) {
- level = 1;
- setupLevel(level);
- if (levelTxt) {
- levelTxt.setText('Level: ' + level);
- }
-};
-LK.gui.top.addChild(restartBtn);
// Add a button to restart the current level (without resetting level number)
-var retryBtn = new Text2('Tekrar', {
+var retryBtn = new Text2('↺', {
size: 80,
fill: 0xFFFFFF
});
-retryBtn.anchor.set(0.5, 5);
+retryBtn.anchor.set(0.5, 0.5);
// Place at top left, just below the restart button, still below the 100x100 reserved area
-retryBtn.x = 120;
-retryBtn.y = 250;
+retryBtn.x = 550;
+retryBtn.y = 120;
retryBtn.interactive = true;
retryBtn.buttonMode = true;
retryBtn.down = function (x, y, obj) {
setupLevel(level);
full blue screen. In-Game asset. 2d. High contrast. No shadows
gülle. In-Game asset. 2d. High contrast. No shadows
castle wall. In-Game asset. 2d. High contrast. No shadows
only the mouth part of the cannon and looking at the vertical. In-Game asset. 2d. High contrast. No shadows
castle. In-Game asset. 2d. High contrast. No shadows
kırık
daha çok kırık
yıkılmış kale
next button , no background. In-Game asset. 2d. High contrast. No shadows