/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Siyah arka plan }); /**** * Game Code ****/ // Tween plugin import // Arka planı ekle (en alta) var arkaPlan = LK.getAsset('arkaplan', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, width: 2048, height: 2732 }); game.addChild(arkaPlan); // Üstte geniş ve kısa bir kutu görseli göster (resim koymak için uygun) var headerWideBox = LK.getAsset('headerWideBox', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, // Ortalanmış y: 200, // Biraz daha aşağıya kaydırıldı (daha fazla) width: 720, height: 360 }); game.addChild(headerWideBox); // Başlangıç seviyesi 1 olduğunda üstteki ve alttaki rakamlar 1-20 arası olacak if (typeof levelNumber === "undefined") var levelNumber = 1; var topNumber = 1 + Math.floor(Math.random() * 20); // 1-20 arası sayı var bottomNumber = 1 + Math.floor(Math.random() * 20); // 1-20 arası sayı // Alttaki sayı üstteki sayıdan büyük olmalı, değilse swap et if (bottomNumber <= topNumber) { var temp = bottomNumber; bottomNumber = topNumber + 1; if (bottomNumber > 20) bottomNumber = 20; topNumber = temp; } var headerNumberLabel = new Text2(topNumber.toString(), { size: 120, fill: 0xFFD700 }); headerNumberLabel.anchor.set(0.5, 0); // headerWideBox'ın altına, ortalanmış şekilde yerleştir headerNumberLabel.x = headerWideBox.x; headerNumberLabel.y = headerWideBox.y + headerWideBox.height + 40; game.addChild(headerNumberLabel); // İkinci rakamı, ilk rakamın hemen altına ekle var headerNumberLabel2 = new Text2(bottomNumber.toString(), { size: 120, fill: 0xFFD700 }); headerNumberLabel2.anchor.set(0.5, 0); headerNumberLabel2.x = headerWideBox.x; headerNumberLabel2.y = headerNumberLabel.y + headerNumberLabel.height + 40; game.addChild(headerNumberLabel2); // Sadece 5 ve 8 rakamları arasına sarı bir çizgi ekle // Çizgi, ilk label'ın alt kenarı ile ikinci label'ın üst kenarı arasında tam ortada ve sadece bu arada olacak // Yatay çizgi için genişliği iki label'ın genişliğinden biraz fazla yap, yüksekliği ise ince tut var lineHeight = 8; // Çizgi kalınlığı (ince) var lineWidth = Math.max(headerNumberLabel.width, headerNumberLabel2.width) + 80; // Label'ların genişliğinden biraz fazla var lineY = headerNumberLabel2.y - 40; // 5 ve 8 arasının ortasına yakın bir yerde var line = LK.getAsset('yellowLine', { anchorX: 0.5, anchorY: 0.5, x: headerWideBox.x, y: (headerNumberLabel.y + headerNumberLabel.height + headerNumberLabel2.y) / 2, width: lineWidth, height: lineHeight }); // Önce ekle, sonra en öne getir game.addChild(line); if (line.parent && typeof line.parent.setChildIndex === "function") { line.parent.setChildIndex(line, line.parent.children.length - 1); } // Baştan Başla butonu ekle var restartButton = new Text2('⟲ Baştan Başla', { size: 80, fill: 0xffffff }); restartButton.anchor.set(0.5, 0); // Ekranın üst kısmında, headerWideBox'ın biraz üstünde ortala restartButton.x = 2048 / 2; restartButton.y = headerWideBox.y - 100; game.addChild(restartButton); // Sağ üstte 'Altın:0' yazısı ekle var scoreLabel = new Text2('Altın:0', { size: 80, fill: 0xffd700, align: 'right' }); scoreLabel.anchor.set(1, 0); // sağ üst köşe scoreLabel.x = 2048 - 80; // Sağdan 80px içeride hizala scoreLabel.y = restartButton.y; // Baştan Başla ile aynı yatayda game.addChild(scoreLabel); // Altın:0 yazısının altına Seviye ve 1 rakamı ekle var levelLabel = new Text2('Seviye', { size: 60, fill: 0xffffff, align: 'center' }); levelLabel.anchor.set(0.5, 0); levelLabel.x = scoreLabel.x - scoreLabel.width / 2; // Altın:0 yazısının altına ortala levelLabel.y = scoreLabel.y + scoreLabel.height + 10; game.addChild(levelLabel); var levelNumber = 1; // Varsayılan seviye var levelNumberLabel = new Text2(levelNumber.toString(), { size: 60, fill: 0xffd700, align: 'center' }); levelNumberLabel.anchor.set(0.5, 0); levelNumberLabel.x = levelLabel.x; levelNumberLabel.y = levelLabel.y + levelLabel.height + 5; game.addChild(levelNumberLabel); // Butona tıklanınca oyunu baştan başlat restartButton.down = function (x, y, obj) { // Tüm oyun state'ini sıfırla ve yeniden başlat // 1. Eski kareleri ve konfeti varsa temizle if (centerSquare && !centerSquare._destroyed) { centerSquare.destroy(); } if (splitSquares && splitSquares.length > 0) { for (var i = 0; i < splitSquares.length; i++) { if (splitSquares[i] && !splitSquares[i]._destroyed) { splitSquares[i].destroy(); } } splitSquares = []; } if (game._confettiList && game._confettiList.length > 0) { for (var i = 0; i < game._confettiList.length; i++) { if (game._confettiList[i] && !game._confettiList[i]._destroyed) { game._confettiList[i].destroy(); } } game._confettiList = []; } // 2. Kazanma mesajı varsa kaldır if (game.children) { for (var i = game.children.length - 1; i >= 0; i--) { var child = game.children[i]; if (child && child.text && typeof child.text === "string" && child.text.indexOf("Tebrikler") === 0) { child.destroy(); } } } // 3. Yeni sayılar üret if (typeof levelNumber === "undefined") levelNumber = 1; topNumber = 1 + Math.floor(Math.random() * 20); bottomNumber = 1 + Math.floor(Math.random() * 20); if (bottomNumber <= topNumber) { var temp = bottomNumber; bottomNumber = topNumber + 1; if (bottomNumber > 20) bottomNumber = 20; topNumber = temp; } headerNumberLabel.setText(topNumber.toString()); headerNumberLabel2.setText(bottomNumber.toString()); // 4. Split adımını ve kareleri sıfırla splitStep = 1; // 5. Ortadaki kareyi tekrar oluştur var upperBound = headerWideBox.y + headerWideBox.height + 40; var lowerBound = 2732 - 140 - 60; var availableHeight = lowerBound - upperBound; var centerSquareY = upperBound + availableHeight / 2; centerSquare = LK.getAsset('centerSquare', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: centerSquareY }); game.addChild(centerSquare); // Kırmızı ve zıplama sadece bir kere yapılabilsin (flag ile kontrol) centerSquare._hasJumped = false; centerSquare.down = function (x, y, obj) { if (centerSquare._hasJumped) return; // Sadece bir kez çalışsın centerSquare._hasJumped = true; // Sadece yukarı animasyon ve pembe tint uygula, tekrar dokunulsa da başka renk değişimi olmasın centerSquare.tint = 0xFF69B4; var originalY = centerSquare.y; tween(centerSquare, { y: originalY - 120 }, { duration: 320, easing: tween.cubicOut, onFinish: function onFinish() { tween(centerSquare, { y: originalY }, { duration: 320, easing: tween.cubicIn }); } }); }; // 6. SplitLabel konumunu sıfırla splitLabel.y = centerSquare.y + centerSquare.height / 2 + 60; // Pastalar ve Pastayı Böl yazısı tekrar görünür olsun for (var i = 0; i < splitSquares.length; i++) { if (splitSquares[i] && !splitSquares[i]._destroyed) { splitSquares[i].visible = true; } } if (splitLabel && !splitLabel._destroyed) { splitLabel.visible = true; } // Rakamları tekrar görünür yap if (headerNumberLabel && !headerNumberLabel._destroyed) { headerNumberLabel.visible = true; } if (headerNumberLabel2 && !headerNumberLabel2._destroyed) { headerNumberLabel2.visible = true; } // Çizgiyi tekrar görünür yap if (line && !line._destroyed) { line.visible = true; } }; // 'Seçilen Pasta' ve 'Dilim Sayısı' etiketleri kaldırıldı // Ortaya bir kare ekle // Kareyi ekranın üst kısmından splitLabel'ın altına kadar olan bölgede tam ortada konumlandır var upperBound = headerWideBox.y + headerWideBox.height + 40; var lowerBound = 2732 - 140 - 60; // splitLabel.height yaklaşık 140, padding 60 var availableHeight = lowerBound - upperBound; var centerSquareY = upperBound + availableHeight / 2; var centerSquare = LK.getAsset('centerSquare', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: centerSquareY }); game.addChild(centerSquare); // Idle up-down animation for centerSquare function animateCenterSquareIdle() { var baseY = centerSquare.y; tween(centerSquare, { y: baseY + 18 }, { duration: 900, easing: tween.easeInOut, onFinish: function onFinish() { tween(centerSquare, { y: baseY - 18 }, { duration: 900, easing: tween.easeInOut, onFinish: function onFinish() { tween(centerSquare, { y: baseY }, { duration: 900, easing: tween.easeInOut, onFinish: animateCenterSquareIdle }); } }); } }); } // animateCenterSquareIdle(); // BAŞTA ÇAĞRILMIYOR, ilk pasta başta hareket etmeyecek // 'Pastayı Böl' yazısı için asset ekle (örnek: headerWideBox gibi bir görsel, üstüne Text2 ile yazı ekle) var splitLabel = LK.getAsset('splitLabelAsset', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: centerSquare.y + centerSquare.height / 2 + 60, width: 600, height: 360 // Yüksekliği iki katına çıkarıldı, karesi aşağıya doğru uzatıldı }); // Asset'i ekle game.addChild(splitLabel); // Idle büyüyüp küçülme animasyonu (sonsuz döngü) function animateSplitLabelIdle() { // Büyüt tween(splitLabel, { scaleX: 1.08, scaleY: 1.08 }, { duration: 1200, //{2p} // Animasyon süresi iki katına çıkarıldı (daha yavaş) easing: tween.easeInOut, onFinish: function onFinish() { // Küçült tween(splitLabel, { scaleX: 0.92, scaleY: 0.92 }, { duration: 1200, //{2u} // Animasyon süresi iki katına çıkarıldı (daha yavaş) easing: tween.easeInOut, onFinish: function onFinish() { // Tekrar başlat animateSplitLabelIdle(); } }); } }); } // Başlangıç boyutunu sıfırla ve animasyonu başlat splitLabel.scaleX = 1; splitLabel.scaleY = 1; animateSplitLabelIdle(); // 'Pastayı Böl' yazısı kaldırıldı // splitLabel assetine tıklanabilirlik ekle splitLabel.down = function (x, y, obj) { // Eğer ilk kare duruyorsa, onu kaldır if (centerSquare && !centerSquare._destroyed) { centerSquare.destroy(); } // 25'e ulaştıysa daha fazla bölme! if (splitStep >= 25 || splitStep + 1 > 25) { return; } // Önceki kareleri sadece yeni kareler eklenmeden önce kaldır if (splitSquares.length > 0) { for (var i = 0; i < splitSquares.length; i++) { if (splitSquares[i] && !splitSquares[i]._destroyed) { splitSquares[i].destroy(); } } splitSquares = []; } splitStep += 1; createSplitSquares(splitStep); }; // Kaç parçaya bölüneceğini takip eden değişken var splitStep = 1; // 1'den başlatıyoruz (ilk kareye tıklama ile 2'ye bölünecek) var splitSquares = []; // Aktif kareleri tutar // Ortadaki kareyi de seçilebilir yap // Kırmızı ve zıplama sadece bir kere yapılabilsin (flag ile kontrol) centerSquare._hasJumped = false; centerSquare.down = function (x, y, obj) { if (centerSquare._hasJumped) return; // Sadece bir kez çalışsın centerSquare._hasJumped = true; // Sadece yukarı animasyon ve pembe tint uygula, tekrar dokunulsa da başka renk değişimi olmasın centerSquare.tint = 0xFF69B4; var originalY = centerSquare.y; tween(centerSquare, { y: originalY - 120 }, { duration: 320, easing: tween.cubicOut, onFinish: function onFinish() { tween(centerSquare, { y: originalY }, { duration: 320, easing: tween.cubicIn }); } }); }; // 'Kareyi Böl' yazısına tıklanınca kareleri böl splitLabel.down = function (x, y, obj) { // Eğer ilk kare duruyorsa, onu kaldır if (centerSquare && !centerSquare._destroyed) { centerSquare.destroy(); } // 25'e ulaştıysa daha fazla bölme! if (splitStep >= 25 || splitStep + 1 > 25) { return; } // Önceki kareleri sadece yeni kareler eklenmeden önce kaldır if (splitSquares.length > 0) { for (var i = 0; i < splitSquares.length; i++) { if (splitSquares[i] && !splitSquares[i]._destroyed) { splitSquares[i].destroy(); } } splitSquares = []; } splitStep += 1; createSplitSquares(splitStep); }; // Karelere tıklama ile bölme işlemini kaldırıyoruz function handleSplit(x, y, obj) { if (obj && obj.target) { // Her splitSquare sadece bir kere seçilebilsin ve bir kere zıplasın if (obj.target._hasJumped) return; obj.target._hasJumped = true; // Sadece yukarı animasyon ve pembe tint uygula, tekrar dokunulsa da başka renk değişimi olmasın obj.target.tint = 0xFF69B4; var originalY = obj.target.y; tween(obj.target, { y: originalY - 120 }, { duration: 320, easing: tween.cubicOut, onFinish: function onFinish() { tween(obj.target, { y: originalY }, { duration: 320, easing: tween.cubicIn }); } }); // Kazanma kontrolü: Kırmızı pasta sayısı üstteki sayıya, toplam pasta sayısı alttaki sayıya eşit mi? // Kırmızı pasta: tint'i 0xFF69B4 olanlar var redCount = 0; for (var i = 0; i < splitSquares.length; i++) { if (splitSquares[i] && splitSquares[i].tint === 0xFF69B4) { redCount++; } } if (splitSquares.length === bottomNumber && redCount === topNumber) { // Her kazandığınızda Altın skorunu 100 artır var currentGold = 0; if (typeof scoreLabel !== "undefined" && scoreLabel.text && scoreLabel.text.indexOf("Altın:") === 0) { var parts = scoreLabel.text.split(":"); if (parts.length > 1) { var parsed = parseInt(parts[1]); if (!isNaN(parsed)) currentGold = parsed; } } if (typeof game._winCount === "undefined") game._winCount = 0; game._winCount++; currentGold += 100 * game._winCount; scoreLabel.setText("Altın:" + currentGold); // Altın 300 veya daha fazlaysa seviyenin altındaki rakamı 3 yap if (typeof levelNumberLabel !== "undefined") { if (currentGold >= 300) { levelNumberLabel.setText("3"); } else if (currentGold >= 100) { levelNumberLabel.setText("2"); } else { levelNumberLabel.setText("1"); } } // 2 kere kazandıktan sonra üstteki ve alttaki rakamları 1-20 arası random üret if (game._winCount >= 2) { topNumber = 1 + Math.floor(Math.random() * 20); bottomNumber = 1 + Math.floor(Math.random() * 20); if (bottomNumber <= topNumber) { var temp = bottomNumber; bottomNumber = topNumber + 1; if (bottomNumber > 20) bottomNumber = 20; topNumber = temp; } if (typeof headerNumberLabel !== "undefined") headerNumberLabel.setText(topNumber.toString()); if (typeof headerNumberLabel2 !== "undefined") headerNumberLabel2.setText(bottomNumber.toString()); } // Pastaları ve Pastayı Böl yazısını gizle for (var i = 0; i < splitSquares.length; i++) { if (splitSquares[i] && !splitSquares[i]._destroyed) { splitSquares[i].visible = false; } } if (splitLabel && !splitLabel._destroyed) { splitLabel.visible = false; } // Rakamları gizle if (headerNumberLabel && !headerNumberLabel._destroyed) { headerNumberLabel.visible = false; } if (headerNumberLabel2 && !headerNumberLabel2._destroyed) { headerNumberLabel2.visible = false; } // Çizgiyi gizle if (line && !line._destroyed) { line.visible = false; } // Tebrikler mesajı: büyük, ekranı kaplayan, sarı, alt alta var winLabel = new Text2('Tebrikler\nkazandınız!', { size: 260, fill: 0xFFD700, align: 'center' }); winLabel.anchor.set(0.5, 0.5); winLabel.x = 2048 / 2; winLabel.y = 2732 / 2; game.addChild(winLabel); // Altına 100 Puan yazısı ekle var winScoreLabel = new Text2('100 Puan', { size: 120, fill: 0xFFD700, align: 'center' }); winScoreLabel.anchor.set(0.5, 0); winScoreLabel.x = winLabel.x; winScoreLabel.y = winLabel.y + winLabel.height / 2 + 40; game.addChild(winScoreLabel); // 2 saniye sonra tebrikler ve 100 puan yazılarını kaldır, ardından oyunu baştan başlat LK.setTimeout(function () { if (winLabel && !winLabel._destroyed) winLabel.destroy(); if (winScoreLabel && !winScoreLabel._destroyed) winScoreLabel.destroy(); // Oyun state'ini baştan başlat (restartButton.down fonksiyonunu çağır) if (typeof restartButton !== "undefined" && typeof restartButton.down === "function") { restartButton.down(); } }, 2000); // Konfeti efekti: Çok daha fazla konfeti ve ekranın her yerine dağılacak şekilde var confettiCount = 400; // Çok daha fazla konfeti var colors = [0xffd700, 0xff69b4, 0x00ff00, 0x00bfff, 0xff4500, 0x9400d3, 0xffffff, 0x00ffff, 0xffa500, 0x228b22]; var screenW = 2048; var screenH = 2732; // Konfetiler ekranın farklı noktalarından patlayacak şekilde, 6 farklı merkezden yayılacak var burstCenters = [{ x: screenW / 2, y: screenH / 2 }, // tam merkez { x: screenW * 0.25, y: screenH * 0.25 }, // sol üst { x: screenW * 0.75, y: screenH * 0.25 }, // sağ üst { x: screenW * 0.25, y: screenH * 0.75 }, // sol alt { x: screenW * 0.75, y: screenH * 0.75 }, // sağ alt { x: screenW / 2, y: screenH * 0.1 } // üst orta ]; for (var b = 0; b < burstCenters.length; b++) { var center = burstCenters[b]; var burstCount = Math.floor(confettiCount / burstCenters.length); for (var i = 0; i < burstCount; i++) { // Spiral/dairesel yayılım için açı ve hız var angle = 2 * Math.PI * i / burstCount + (Math.random() - 0.5) * 0.5; // Daireye yay var spiral = 0.7 + Math.random() * 1.5; var speed = 18 + Math.random() * 22; var vx = Math.cos(angle) * speed * spiral; var vy = Math.sin(angle) * speed * spiral; // Başlangıç noktası: merkezden hafif rastgele sapmalı var startX = center.x + Math.cos(angle) * (Math.random() * 60); var startY = center.y + Math.sin(angle) * (Math.random() * 60); var confetti = LK.getAsset('yellowLine', { anchorX: 0.5, anchorY: 0.5, width: 18 + Math.random() * 60, height: 8 + Math.random() * 18, x: startX, y: startY }); confetti.tint = colors[Math.floor(Math.random() * colors.length)]; game.addChild(confetti); // Spiral/dairesel yayılım, hafif zıplama ve titreşim efekti (function (confetti, vx, vy, angle, center) { var gravity = 0.7 + Math.random() * 0.7; var friction = 0.95 + Math.random() * 0.04; var oscillate = 0.12 + Math.random() * 0.22; var oscillateSpeed = 0.10 + Math.random() * 0.22; var life = 80 + Math.floor(Math.random() * 70); // 1.3-2.5 saniye confetti._life = 0; var baseAngle = angle; confetti._update = function () { // Spiral hareket + titreşim confetti.x += vx + Math.cos(baseAngle + confetti._life * oscillateSpeed) * oscillate * 18; confetti.y += vy + Math.sin(baseAngle + confetti._life * oscillateSpeed) * oscillate * 8; vy += gravity; vx *= friction; vy *= friction; confetti.rotation += 0.25 * (Math.random() - 0.5) + Math.sin(confetti._life * 0.2) * 0.08; confetti._life++; // Ekran dışına çıkınca veya ömrü bitince yok et if (confetti._life > life || confetti.y > screenH + 120 || confetti.x < -120 || confetti.x > screenW + 120) { if (confetti.parent) confetti.destroy(); } }; // Her tick'te güncelle if (!game._confettiList) game._confettiList = []; game._confettiList.push(confetti); })(confetti, vx, vy, angle, center); } } // Konfeti güncellemesi için game.update'e ekle if (!game._confettiUpdateAdded) { var oldUpdate = game.update; game.update = function () { if (typeof oldUpdate === "function") oldUpdate.call(this); if (game._confettiList) { for (var i = game._confettiList.length - 1; i >= 0; i--) { var c = game._confettiList[i]; if (c._destroyed) { game._confettiList.splice(i, 1); } else if (typeof c._update === "function") { c._update(); } } } }; game._confettiUpdateAdded = true; } } } } // İstenilen sayıda kareyi ortaya, aralıklı ve eşit boyda yerleştirir function createSplitSquares(pieceCount) { // Dilim sayısı etiketini güncelleme kaldırıldı var gap = 40; // Karelerin boyutunu %10 küçült var baseWidth = centerSquare.width; var shrinkFactor = 0.9 * Math.pow(0.95, splitStep); // Her durumda %10 daha küçük başla, sonra her bölmede %5 küçült var pieceWidth = baseWidth * shrinkFactor; var pieceHeight = pieceWidth; // Kare olması için yükseklik = genişlik // Kare matris mi? (4, 9, 16, ...) var sqrt = Math.sqrt(pieceCount); var isPerfectSquare = sqrt === Math.floor(sqrt); if (isPerfectSquare) { // NxN grid var N = sqrt; var totalGapX = gap * (N - 1); var totalGapY = gap * (N - 1); var totalWidth = pieceWidth * N + totalGapX; var totalHeight = pieceHeight * N + totalGapY; var startX = 2048 / 2 - totalWidth / 2 + pieceWidth / 2; // Kareler ve 'Pastayı Böl' yazısı, headerWideBox'tan ekranın altına kadar olan bölgede hapis olacak şekilde konumlandırılır // Üst sınır: headerNumberLabel2'nin altı + 40px padding (rakamların hemen altı) // Alt sınır: ekranın altı - splitLabel yüksekliği - 60px padding var upperBound = headerNumberLabel2.y + headerNumberLabel2.height + 40; var lowerBound = 2732 - splitLabel.height - 60; var availableHeight = lowerBound - upperBound; if (totalHeight > availableHeight) { // Kareler sığmıyorsa, kare boyutunu küçült var scale = availableHeight / totalHeight; pieceWidth *= scale; pieceHeight = pieceWidth; totalHeight = pieceHeight * N + totalGapY; } var startY = upperBound + (availableHeight - totalHeight) / 2 + pieceHeight / 2; var idx = 0; for (var row = 0; row < N; row++) { for (var col = 0; col < N; col++) { if (idx >= pieceCount) { break; } // Karelerin merkezini kendi kare alanlarının tam ortasına yerleştir var squareCenterX = startX + col * (pieceWidth + gap); var squareCenterY = startY + row * (pieceHeight + gap); var square = LK.getAsset('splitSquare', { anchorX: 0.5, anchorY: 0.5, width: pieceWidth, height: pieceHeight, x: squareCenterX, y: squareCenterY }); game.addChild(square); splitSquares.push(square); // Split animasyonu: önce büyüt, sonra normale döndür square.scaleX = 0.7; square.scaleY = 0.7; tween(square, { scaleX: 1.15, scaleY: 1.15 }, { duration: 180, easing: tween.cubicOut, onFinish: function (sq) { return function () { tween(sq, { scaleX: 1, scaleY: 1 }, { duration: 180, easing: tween.cubicIn }); }; }(square) }); // Her kareye tıklama eventi ekle (20'ye kadar) square._hasJumped = false; square.down = handleSplit; idx++; } } // Kareyi Böl butonunu en alt satırın altına yerleştir var lastRowY = startY + (N - 1) * (pieceHeight + gap); splitLabel.y = lastRowY + pieceHeight / 2 + 60; } else { // NxN grid gibi göster (ekrana sığdırmak için) var N = Math.ceil(Math.sqrt(pieceCount)); var rows = Math.ceil(pieceCount / N); var cols = N; var totalGapX = gap * (cols - 1); var totalGapY = gap * (rows - 1); var totalWidth = pieceWidth * cols + totalGapX; var totalHeight = pieceHeight * rows + totalGapY; var startX = 2048 / 2 - totalWidth / 2 + pieceWidth / 2; // Kareler ve 'Pastayı Böl' yazısı, headerWideBox'tan ekranın altına kadar olan bölgede hapis olacak şekilde konumlandırılır // Üst sınır: headerNumberLabel2'nin altı + 40px padding (rakamların hemen altı) // Alt sınır: ekranın altı - splitLabel yüksekliği - 60px padding var upperBound = headerNumberLabel2.y + headerNumberLabel2.height + 40; var lowerBound = 2732 - splitLabel.height - 60; var availableHeight = lowerBound - upperBound; if (totalHeight > availableHeight) { // Kareler sığmıyorsa, kare boyutunu küçült var scale = availableHeight / totalHeight; pieceWidth *= scale; pieceHeight = pieceWidth; totalHeight = pieceHeight * rows + totalGapY; } var startY = upperBound + (availableHeight - totalHeight) / 2 + pieceHeight / 2; var idx = 0; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { if (idx >= pieceCount) { break; } // Karelerin merkezini kendi kare alanlarının tam ortasına yerleştir (non-square grid) var squareCenterX = startX + col * (pieceWidth + gap); var squareCenterY = startY + row * (pieceHeight + gap); var square = LK.getAsset('splitSquare', { anchorX: 0.5, anchorY: 0.5, width: pieceWidth, height: pieceHeight, x: squareCenterX, y: squareCenterY }); game.addChild(square); splitSquares.push(square); // Split animasyonu: önce büyüt, sonra normale döndür square.scaleX = 0.7; square.scaleY = 0.7; tween(square, { scaleX: 1.15, scaleY: 1.15 }, { duration: 180, easing: tween.cubicOut, onFinish: function (sq) { return function () { tween(sq, { scaleX: 1, scaleY: 1 }, { duration: 180, easing: tween.cubicIn }); }; }(square) }); // Her kareye tıklama eventi ekle (20'ye kadar) square._hasJumped = false; square.down = handleSplit; idx++; } } // Kareyi Böl butonunu en alt satırın altına yerleştir (non-square grid) var lastRowY = startY + (rows - 1) * (pieceHeight + gap); splitLabel.y = lastRowY + pieceHeight / 2 + 60; } } // Alttaki seviye ve 1 yazısı kaldırıldı ;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Siyah arka plan
});
/****
* Game Code
****/
// Tween plugin import
// Arka planı ekle (en alta)
var arkaPlan = LK.getAsset('arkaplan', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
width: 2048,
height: 2732
});
game.addChild(arkaPlan);
// Üstte geniş ve kısa bir kutu görseli göster (resim koymak için uygun)
var headerWideBox = LK.getAsset('headerWideBox', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
// Ortalanmış
y: 200,
// Biraz daha aşağıya kaydırıldı (daha fazla)
width: 720,
height: 360
});
game.addChild(headerWideBox);
// Başlangıç seviyesi 1 olduğunda üstteki ve alttaki rakamlar 1-20 arası olacak
if (typeof levelNumber === "undefined") var levelNumber = 1;
var topNumber = 1 + Math.floor(Math.random() * 20); // 1-20 arası sayı
var bottomNumber = 1 + Math.floor(Math.random() * 20); // 1-20 arası sayı
// Alttaki sayı üstteki sayıdan büyük olmalı, değilse swap et
if (bottomNumber <= topNumber) {
var temp = bottomNumber;
bottomNumber = topNumber + 1;
if (bottomNumber > 20) bottomNumber = 20;
topNumber = temp;
}
var headerNumberLabel = new Text2(topNumber.toString(), {
size: 120,
fill: 0xFFD700
});
headerNumberLabel.anchor.set(0.5, 0);
// headerWideBox'ın altına, ortalanmış şekilde yerleştir
headerNumberLabel.x = headerWideBox.x;
headerNumberLabel.y = headerWideBox.y + headerWideBox.height + 40;
game.addChild(headerNumberLabel);
// İkinci rakamı, ilk rakamın hemen altına ekle
var headerNumberLabel2 = new Text2(bottomNumber.toString(), {
size: 120,
fill: 0xFFD700
});
headerNumberLabel2.anchor.set(0.5, 0);
headerNumberLabel2.x = headerWideBox.x;
headerNumberLabel2.y = headerNumberLabel.y + headerNumberLabel.height + 40;
game.addChild(headerNumberLabel2);
// Sadece 5 ve 8 rakamları arasına sarı bir çizgi ekle
// Çizgi, ilk label'ın alt kenarı ile ikinci label'ın üst kenarı arasında tam ortada ve sadece bu arada olacak
// Yatay çizgi için genişliği iki label'ın genişliğinden biraz fazla yap, yüksekliği ise ince tut
var lineHeight = 8; // Çizgi kalınlığı (ince)
var lineWidth = Math.max(headerNumberLabel.width, headerNumberLabel2.width) + 80; // Label'ların genişliğinden biraz fazla
var lineY = headerNumberLabel2.y - 40; // 5 ve 8 arasının ortasına yakın bir yerde
var line = LK.getAsset('yellowLine', {
anchorX: 0.5,
anchorY: 0.5,
x: headerWideBox.x,
y: (headerNumberLabel.y + headerNumberLabel.height + headerNumberLabel2.y) / 2,
width: lineWidth,
height: lineHeight
});
// Önce ekle, sonra en öne getir
game.addChild(line);
if (line.parent && typeof line.parent.setChildIndex === "function") {
line.parent.setChildIndex(line, line.parent.children.length - 1);
}
// Baştan Başla butonu ekle
var restartButton = new Text2('⟲ Baştan Başla', {
size: 80,
fill: 0xffffff
});
restartButton.anchor.set(0.5, 0);
// Ekranın üst kısmında, headerWideBox'ın biraz üstünde ortala
restartButton.x = 2048 / 2;
restartButton.y = headerWideBox.y - 100;
game.addChild(restartButton);
// Sağ üstte 'Altın:0' yazısı ekle
var scoreLabel = new Text2('Altın:0', {
size: 80,
fill: 0xffd700,
align: 'right'
});
scoreLabel.anchor.set(1, 0); // sağ üst köşe
scoreLabel.x = 2048 - 80; // Sağdan 80px içeride hizala
scoreLabel.y = restartButton.y; // Baştan Başla ile aynı yatayda
game.addChild(scoreLabel);
// Altın:0 yazısının altına Seviye ve 1 rakamı ekle
var levelLabel = new Text2('Seviye', {
size: 60,
fill: 0xffffff,
align: 'center'
});
levelLabel.anchor.set(0.5, 0);
levelLabel.x = scoreLabel.x - scoreLabel.width / 2; // Altın:0 yazısının altına ortala
levelLabel.y = scoreLabel.y + scoreLabel.height + 10;
game.addChild(levelLabel);
var levelNumber = 1; // Varsayılan seviye
var levelNumberLabel = new Text2(levelNumber.toString(), {
size: 60,
fill: 0xffd700,
align: 'center'
});
levelNumberLabel.anchor.set(0.5, 0);
levelNumberLabel.x = levelLabel.x;
levelNumberLabel.y = levelLabel.y + levelLabel.height + 5;
game.addChild(levelNumberLabel);
// Butona tıklanınca oyunu baştan başlat
restartButton.down = function (x, y, obj) {
// Tüm oyun state'ini sıfırla ve yeniden başlat
// 1. Eski kareleri ve konfeti varsa temizle
if (centerSquare && !centerSquare._destroyed) {
centerSquare.destroy();
}
if (splitSquares && splitSquares.length > 0) {
for (var i = 0; i < splitSquares.length; i++) {
if (splitSquares[i] && !splitSquares[i]._destroyed) {
splitSquares[i].destroy();
}
}
splitSquares = [];
}
if (game._confettiList && game._confettiList.length > 0) {
for (var i = 0; i < game._confettiList.length; i++) {
if (game._confettiList[i] && !game._confettiList[i]._destroyed) {
game._confettiList[i].destroy();
}
}
game._confettiList = [];
}
// 2. Kazanma mesajı varsa kaldır
if (game.children) {
for (var i = game.children.length - 1; i >= 0; i--) {
var child = game.children[i];
if (child && child.text && typeof child.text === "string" && child.text.indexOf("Tebrikler") === 0) {
child.destroy();
}
}
}
// 3. Yeni sayılar üret
if (typeof levelNumber === "undefined") levelNumber = 1;
topNumber = 1 + Math.floor(Math.random() * 20);
bottomNumber = 1 + Math.floor(Math.random() * 20);
if (bottomNumber <= topNumber) {
var temp = bottomNumber;
bottomNumber = topNumber + 1;
if (bottomNumber > 20) bottomNumber = 20;
topNumber = temp;
}
headerNumberLabel.setText(topNumber.toString());
headerNumberLabel2.setText(bottomNumber.toString());
// 4. Split adımını ve kareleri sıfırla
splitStep = 1;
// 5. Ortadaki kareyi tekrar oluştur
var upperBound = headerWideBox.y + headerWideBox.height + 40;
var lowerBound = 2732 - 140 - 60;
var availableHeight = lowerBound - upperBound;
var centerSquareY = upperBound + availableHeight / 2;
centerSquare = LK.getAsset('centerSquare', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: centerSquareY
});
game.addChild(centerSquare);
// Kırmızı ve zıplama sadece bir kere yapılabilsin (flag ile kontrol)
centerSquare._hasJumped = false;
centerSquare.down = function (x, y, obj) {
if (centerSquare._hasJumped) return; // Sadece bir kez çalışsın
centerSquare._hasJumped = true;
// Sadece yukarı animasyon ve pembe tint uygula, tekrar dokunulsa da başka renk değişimi olmasın
centerSquare.tint = 0xFF69B4;
var originalY = centerSquare.y;
tween(centerSquare, {
y: originalY - 120
}, {
duration: 320,
easing: tween.cubicOut,
onFinish: function onFinish() {
tween(centerSquare, {
y: originalY
}, {
duration: 320,
easing: tween.cubicIn
});
}
});
};
// 6. SplitLabel konumunu sıfırla
splitLabel.y = centerSquare.y + centerSquare.height / 2 + 60;
// Pastalar ve Pastayı Böl yazısı tekrar görünür olsun
for (var i = 0; i < splitSquares.length; i++) {
if (splitSquares[i] && !splitSquares[i]._destroyed) {
splitSquares[i].visible = true;
}
}
if (splitLabel && !splitLabel._destroyed) {
splitLabel.visible = true;
}
// Rakamları tekrar görünür yap
if (headerNumberLabel && !headerNumberLabel._destroyed) {
headerNumberLabel.visible = true;
}
if (headerNumberLabel2 && !headerNumberLabel2._destroyed) {
headerNumberLabel2.visible = true;
}
// Çizgiyi tekrar görünür yap
if (line && !line._destroyed) {
line.visible = true;
}
};
// 'Seçilen Pasta' ve 'Dilim Sayısı' etiketleri kaldırıldı
// Ortaya bir kare ekle
// Kareyi ekranın üst kısmından splitLabel'ın altına kadar olan bölgede tam ortada konumlandır
var upperBound = headerWideBox.y + headerWideBox.height + 40;
var lowerBound = 2732 - 140 - 60; // splitLabel.height yaklaşık 140, padding 60
var availableHeight = lowerBound - upperBound;
var centerSquareY = upperBound + availableHeight / 2;
var centerSquare = LK.getAsset('centerSquare', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: centerSquareY
});
game.addChild(centerSquare);
// Idle up-down animation for centerSquare
function animateCenterSquareIdle() {
var baseY = centerSquare.y;
tween(centerSquare, {
y: baseY + 18
}, {
duration: 900,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(centerSquare, {
y: baseY - 18
}, {
duration: 900,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(centerSquare, {
y: baseY
}, {
duration: 900,
easing: tween.easeInOut,
onFinish: animateCenterSquareIdle
});
}
});
}
});
}
// animateCenterSquareIdle(); // BAŞTA ÇAĞRILMIYOR, ilk pasta başta hareket etmeyecek
// 'Pastayı Böl' yazısı için asset ekle (örnek: headerWideBox gibi bir görsel, üstüne Text2 ile yazı ekle)
var splitLabel = LK.getAsset('splitLabelAsset', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: centerSquare.y + centerSquare.height / 2 + 60,
width: 600,
height: 360 // Yüksekliği iki katına çıkarıldı, karesi aşağıya doğru uzatıldı
});
// Asset'i ekle
game.addChild(splitLabel);
// Idle büyüyüp küçülme animasyonu (sonsuz döngü)
function animateSplitLabelIdle() {
// Büyüt
tween(splitLabel, {
scaleX: 1.08,
scaleY: 1.08
}, {
duration: 1200,
//{2p} // Animasyon süresi iki katına çıkarıldı (daha yavaş)
easing: tween.easeInOut,
onFinish: function onFinish() {
// Küçült
tween(splitLabel, {
scaleX: 0.92,
scaleY: 0.92
}, {
duration: 1200,
//{2u} // Animasyon süresi iki katına çıkarıldı (daha yavaş)
easing: tween.easeInOut,
onFinish: function onFinish() {
// Tekrar başlat
animateSplitLabelIdle();
}
});
}
});
}
// Başlangıç boyutunu sıfırla ve animasyonu başlat
splitLabel.scaleX = 1;
splitLabel.scaleY = 1;
animateSplitLabelIdle();
// 'Pastayı Böl' yazısı kaldırıldı
// splitLabel assetine tıklanabilirlik ekle
splitLabel.down = function (x, y, obj) {
// Eğer ilk kare duruyorsa, onu kaldır
if (centerSquare && !centerSquare._destroyed) {
centerSquare.destroy();
}
// 25'e ulaştıysa daha fazla bölme!
if (splitStep >= 25 || splitStep + 1 > 25) {
return;
}
// Önceki kareleri sadece yeni kareler eklenmeden önce kaldır
if (splitSquares.length > 0) {
for (var i = 0; i < splitSquares.length; i++) {
if (splitSquares[i] && !splitSquares[i]._destroyed) {
splitSquares[i].destroy();
}
}
splitSquares = [];
}
splitStep += 1;
createSplitSquares(splitStep);
};
// Kaç parçaya bölüneceğini takip eden değişken
var splitStep = 1; // 1'den başlatıyoruz (ilk kareye tıklama ile 2'ye bölünecek)
var splitSquares = []; // Aktif kareleri tutar
// Ortadaki kareyi de seçilebilir yap
// Kırmızı ve zıplama sadece bir kere yapılabilsin (flag ile kontrol)
centerSquare._hasJumped = false;
centerSquare.down = function (x, y, obj) {
if (centerSquare._hasJumped) return; // Sadece bir kez çalışsın
centerSquare._hasJumped = true;
// Sadece yukarı animasyon ve pembe tint uygula, tekrar dokunulsa da başka renk değişimi olmasın
centerSquare.tint = 0xFF69B4;
var originalY = centerSquare.y;
tween(centerSquare, {
y: originalY - 120
}, {
duration: 320,
easing: tween.cubicOut,
onFinish: function onFinish() {
tween(centerSquare, {
y: originalY
}, {
duration: 320,
easing: tween.cubicIn
});
}
});
};
// 'Kareyi Böl' yazısına tıklanınca kareleri böl
splitLabel.down = function (x, y, obj) {
// Eğer ilk kare duruyorsa, onu kaldır
if (centerSquare && !centerSquare._destroyed) {
centerSquare.destroy();
}
// 25'e ulaştıysa daha fazla bölme!
if (splitStep >= 25 || splitStep + 1 > 25) {
return;
}
// Önceki kareleri sadece yeni kareler eklenmeden önce kaldır
if (splitSquares.length > 0) {
for (var i = 0; i < splitSquares.length; i++) {
if (splitSquares[i] && !splitSquares[i]._destroyed) {
splitSquares[i].destroy();
}
}
splitSquares = [];
}
splitStep += 1;
createSplitSquares(splitStep);
};
// Karelere tıklama ile bölme işlemini kaldırıyoruz
function handleSplit(x, y, obj) {
if (obj && obj.target) {
// Her splitSquare sadece bir kere seçilebilsin ve bir kere zıplasın
if (obj.target._hasJumped) return;
obj.target._hasJumped = true;
// Sadece yukarı animasyon ve pembe tint uygula, tekrar dokunulsa da başka renk değişimi olmasın
obj.target.tint = 0xFF69B4;
var originalY = obj.target.y;
tween(obj.target, {
y: originalY - 120
}, {
duration: 320,
easing: tween.cubicOut,
onFinish: function onFinish() {
tween(obj.target, {
y: originalY
}, {
duration: 320,
easing: tween.cubicIn
});
}
});
// Kazanma kontrolü: Kırmızı pasta sayısı üstteki sayıya, toplam pasta sayısı alttaki sayıya eşit mi?
// Kırmızı pasta: tint'i 0xFF69B4 olanlar
var redCount = 0;
for (var i = 0; i < splitSquares.length; i++) {
if (splitSquares[i] && splitSquares[i].tint === 0xFF69B4) {
redCount++;
}
}
if (splitSquares.length === bottomNumber && redCount === topNumber) {
// Her kazandığınızda Altın skorunu 100 artır
var currentGold = 0;
if (typeof scoreLabel !== "undefined" && scoreLabel.text && scoreLabel.text.indexOf("Altın:") === 0) {
var parts = scoreLabel.text.split(":");
if (parts.length > 1) {
var parsed = parseInt(parts[1]);
if (!isNaN(parsed)) currentGold = parsed;
}
}
if (typeof game._winCount === "undefined") game._winCount = 0;
game._winCount++;
currentGold += 100 * game._winCount;
scoreLabel.setText("Altın:" + currentGold);
// Altın 300 veya daha fazlaysa seviyenin altındaki rakamı 3 yap
if (typeof levelNumberLabel !== "undefined") {
if (currentGold >= 300) {
levelNumberLabel.setText("3");
} else if (currentGold >= 100) {
levelNumberLabel.setText("2");
} else {
levelNumberLabel.setText("1");
}
}
// 2 kere kazandıktan sonra üstteki ve alttaki rakamları 1-20 arası random üret
if (game._winCount >= 2) {
topNumber = 1 + Math.floor(Math.random() * 20);
bottomNumber = 1 + Math.floor(Math.random() * 20);
if (bottomNumber <= topNumber) {
var temp = bottomNumber;
bottomNumber = topNumber + 1;
if (bottomNumber > 20) bottomNumber = 20;
topNumber = temp;
}
if (typeof headerNumberLabel !== "undefined") headerNumberLabel.setText(topNumber.toString());
if (typeof headerNumberLabel2 !== "undefined") headerNumberLabel2.setText(bottomNumber.toString());
}
// Pastaları ve Pastayı Böl yazısını gizle
for (var i = 0; i < splitSquares.length; i++) {
if (splitSquares[i] && !splitSquares[i]._destroyed) {
splitSquares[i].visible = false;
}
}
if (splitLabel && !splitLabel._destroyed) {
splitLabel.visible = false;
}
// Rakamları gizle
if (headerNumberLabel && !headerNumberLabel._destroyed) {
headerNumberLabel.visible = false;
}
if (headerNumberLabel2 && !headerNumberLabel2._destroyed) {
headerNumberLabel2.visible = false;
}
// Çizgiyi gizle
if (line && !line._destroyed) {
line.visible = false;
}
// Tebrikler mesajı: büyük, ekranı kaplayan, sarı, alt alta
var winLabel = new Text2('Tebrikler\nkazandınız!', {
size: 260,
fill: 0xFFD700,
align: 'center'
});
winLabel.anchor.set(0.5, 0.5);
winLabel.x = 2048 / 2;
winLabel.y = 2732 / 2;
game.addChild(winLabel);
// Altına 100 Puan yazısı ekle
var winScoreLabel = new Text2('100 Puan', {
size: 120,
fill: 0xFFD700,
align: 'center'
});
winScoreLabel.anchor.set(0.5, 0);
winScoreLabel.x = winLabel.x;
winScoreLabel.y = winLabel.y + winLabel.height / 2 + 40;
game.addChild(winScoreLabel);
// 2 saniye sonra tebrikler ve 100 puan yazılarını kaldır, ardından oyunu baştan başlat
LK.setTimeout(function () {
if (winLabel && !winLabel._destroyed) winLabel.destroy();
if (winScoreLabel && !winScoreLabel._destroyed) winScoreLabel.destroy();
// Oyun state'ini baştan başlat (restartButton.down fonksiyonunu çağır)
if (typeof restartButton !== "undefined" && typeof restartButton.down === "function") {
restartButton.down();
}
}, 2000);
// Konfeti efekti: Çok daha fazla konfeti ve ekranın her yerine dağılacak şekilde
var confettiCount = 400; // Çok daha fazla konfeti
var colors = [0xffd700, 0xff69b4, 0x00ff00, 0x00bfff, 0xff4500, 0x9400d3, 0xffffff, 0x00ffff, 0xffa500, 0x228b22];
var screenW = 2048;
var screenH = 2732;
// Konfetiler ekranın farklı noktalarından patlayacak şekilde, 6 farklı merkezden yayılacak
var burstCenters = [{
x: screenW / 2,
y: screenH / 2
},
// tam merkez
{
x: screenW * 0.25,
y: screenH * 0.25
},
// sol üst
{
x: screenW * 0.75,
y: screenH * 0.25
},
// sağ üst
{
x: screenW * 0.25,
y: screenH * 0.75
},
// sol alt
{
x: screenW * 0.75,
y: screenH * 0.75
},
// sağ alt
{
x: screenW / 2,
y: screenH * 0.1
} // üst orta
];
for (var b = 0; b < burstCenters.length; b++) {
var center = burstCenters[b];
var burstCount = Math.floor(confettiCount / burstCenters.length);
for (var i = 0; i < burstCount; i++) {
// Spiral/dairesel yayılım için açı ve hız
var angle = 2 * Math.PI * i / burstCount + (Math.random() - 0.5) * 0.5; // Daireye yay
var spiral = 0.7 + Math.random() * 1.5;
var speed = 18 + Math.random() * 22;
var vx = Math.cos(angle) * speed * spiral;
var vy = Math.sin(angle) * speed * spiral;
// Başlangıç noktası: merkezden hafif rastgele sapmalı
var startX = center.x + Math.cos(angle) * (Math.random() * 60);
var startY = center.y + Math.sin(angle) * (Math.random() * 60);
var confetti = LK.getAsset('yellowLine', {
anchorX: 0.5,
anchorY: 0.5,
width: 18 + Math.random() * 60,
height: 8 + Math.random() * 18,
x: startX,
y: startY
});
confetti.tint = colors[Math.floor(Math.random() * colors.length)];
game.addChild(confetti);
// Spiral/dairesel yayılım, hafif zıplama ve titreşim efekti
(function (confetti, vx, vy, angle, center) {
var gravity = 0.7 + Math.random() * 0.7;
var friction = 0.95 + Math.random() * 0.04;
var oscillate = 0.12 + Math.random() * 0.22;
var oscillateSpeed = 0.10 + Math.random() * 0.22;
var life = 80 + Math.floor(Math.random() * 70); // 1.3-2.5 saniye
confetti._life = 0;
var baseAngle = angle;
confetti._update = function () {
// Spiral hareket + titreşim
confetti.x += vx + Math.cos(baseAngle + confetti._life * oscillateSpeed) * oscillate * 18;
confetti.y += vy + Math.sin(baseAngle + confetti._life * oscillateSpeed) * oscillate * 8;
vy += gravity;
vx *= friction;
vy *= friction;
confetti.rotation += 0.25 * (Math.random() - 0.5) + Math.sin(confetti._life * 0.2) * 0.08;
confetti._life++;
// Ekran dışına çıkınca veya ömrü bitince yok et
if (confetti._life > life || confetti.y > screenH + 120 || confetti.x < -120 || confetti.x > screenW + 120) {
if (confetti.parent) confetti.destroy();
}
};
// Her tick'te güncelle
if (!game._confettiList) game._confettiList = [];
game._confettiList.push(confetti);
})(confetti, vx, vy, angle, center);
}
}
// Konfeti güncellemesi için game.update'e ekle
if (!game._confettiUpdateAdded) {
var oldUpdate = game.update;
game.update = function () {
if (typeof oldUpdate === "function") oldUpdate.call(this);
if (game._confettiList) {
for (var i = game._confettiList.length - 1; i >= 0; i--) {
var c = game._confettiList[i];
if (c._destroyed) {
game._confettiList.splice(i, 1);
} else if (typeof c._update === "function") {
c._update();
}
}
}
};
game._confettiUpdateAdded = true;
}
}
}
}
// İstenilen sayıda kareyi ortaya, aralıklı ve eşit boyda yerleştirir
function createSplitSquares(pieceCount) {
// Dilim sayısı etiketini güncelleme kaldırıldı
var gap = 40;
// Karelerin boyutunu %10 küçült
var baseWidth = centerSquare.width;
var shrinkFactor = 0.9 * Math.pow(0.95, splitStep); // Her durumda %10 daha küçük başla, sonra her bölmede %5 küçült
var pieceWidth = baseWidth * shrinkFactor;
var pieceHeight = pieceWidth; // Kare olması için yükseklik = genişlik
// Kare matris mi? (4, 9, 16, ...)
var sqrt = Math.sqrt(pieceCount);
var isPerfectSquare = sqrt === Math.floor(sqrt);
if (isPerfectSquare) {
// NxN grid
var N = sqrt;
var totalGapX = gap * (N - 1);
var totalGapY = gap * (N - 1);
var totalWidth = pieceWidth * N + totalGapX;
var totalHeight = pieceHeight * N + totalGapY;
var startX = 2048 / 2 - totalWidth / 2 + pieceWidth / 2;
// Kareler ve 'Pastayı Böl' yazısı, headerWideBox'tan ekranın altına kadar olan bölgede hapis olacak şekilde konumlandırılır
// Üst sınır: headerNumberLabel2'nin altı + 40px padding (rakamların hemen altı)
// Alt sınır: ekranın altı - splitLabel yüksekliği - 60px padding
var upperBound = headerNumberLabel2.y + headerNumberLabel2.height + 40;
var lowerBound = 2732 - splitLabel.height - 60;
var availableHeight = lowerBound - upperBound;
if (totalHeight > availableHeight) {
// Kareler sığmıyorsa, kare boyutunu küçült
var scale = availableHeight / totalHeight;
pieceWidth *= scale;
pieceHeight = pieceWidth;
totalHeight = pieceHeight * N + totalGapY;
}
var startY = upperBound + (availableHeight - totalHeight) / 2 + pieceHeight / 2;
var idx = 0;
for (var row = 0; row < N; row++) {
for (var col = 0; col < N; col++) {
if (idx >= pieceCount) {
break;
}
// Karelerin merkezini kendi kare alanlarının tam ortasına yerleştir
var squareCenterX = startX + col * (pieceWidth + gap);
var squareCenterY = startY + row * (pieceHeight + gap);
var square = LK.getAsset('splitSquare', {
anchorX: 0.5,
anchorY: 0.5,
width: pieceWidth,
height: pieceHeight,
x: squareCenterX,
y: squareCenterY
});
game.addChild(square);
splitSquares.push(square);
// Split animasyonu: önce büyüt, sonra normale döndür
square.scaleX = 0.7;
square.scaleY = 0.7;
tween(square, {
scaleX: 1.15,
scaleY: 1.15
}, {
duration: 180,
easing: tween.cubicOut,
onFinish: function (sq) {
return function () {
tween(sq, {
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.cubicIn
});
};
}(square)
});
// Her kareye tıklama eventi ekle (20'ye kadar)
square._hasJumped = false;
square.down = handleSplit;
idx++;
}
}
// Kareyi Böl butonunu en alt satırın altına yerleştir
var lastRowY = startY + (N - 1) * (pieceHeight + gap);
splitLabel.y = lastRowY + pieceHeight / 2 + 60;
} else {
// NxN grid gibi göster (ekrana sığdırmak için)
var N = Math.ceil(Math.sqrt(pieceCount));
var rows = Math.ceil(pieceCount / N);
var cols = N;
var totalGapX = gap * (cols - 1);
var totalGapY = gap * (rows - 1);
var totalWidth = pieceWidth * cols + totalGapX;
var totalHeight = pieceHeight * rows + totalGapY;
var startX = 2048 / 2 - totalWidth / 2 + pieceWidth / 2;
// Kareler ve 'Pastayı Böl' yazısı, headerWideBox'tan ekranın altına kadar olan bölgede hapis olacak şekilde konumlandırılır
// Üst sınır: headerNumberLabel2'nin altı + 40px padding (rakamların hemen altı)
// Alt sınır: ekranın altı - splitLabel yüksekliği - 60px padding
var upperBound = headerNumberLabel2.y + headerNumberLabel2.height + 40;
var lowerBound = 2732 - splitLabel.height - 60;
var availableHeight = lowerBound - upperBound;
if (totalHeight > availableHeight) {
// Kareler sığmıyorsa, kare boyutunu küçült
var scale = availableHeight / totalHeight;
pieceWidth *= scale;
pieceHeight = pieceWidth;
totalHeight = pieceHeight * rows + totalGapY;
}
var startY = upperBound + (availableHeight - totalHeight) / 2 + pieceHeight / 2;
var idx = 0;
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
if (idx >= pieceCount) {
break;
}
// Karelerin merkezini kendi kare alanlarının tam ortasına yerleştir (non-square grid)
var squareCenterX = startX + col * (pieceWidth + gap);
var squareCenterY = startY + row * (pieceHeight + gap);
var square = LK.getAsset('splitSquare', {
anchorX: 0.5,
anchorY: 0.5,
width: pieceWidth,
height: pieceHeight,
x: squareCenterX,
y: squareCenterY
});
game.addChild(square);
splitSquares.push(square);
// Split animasyonu: önce büyüt, sonra normale döndür
square.scaleX = 0.7;
square.scaleY = 0.7;
tween(square, {
scaleX: 1.15,
scaleY: 1.15
}, {
duration: 180,
easing: tween.cubicOut,
onFinish: function (sq) {
return function () {
tween(sq, {
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.cubicIn
});
};
}(square)
});
// Her kareye tıklama eventi ekle (20'ye kadar)
square._hasJumped = false;
square.down = handleSplit;
idx++;
}
}
// Kareyi Böl butonunu en alt satırın altına yerleştir (non-square grid)
var lastRowY = startY + (rows - 1) * (pieceHeight + gap);
splitLabel.y = lastRowY + pieceHeight / 2 + 60;
}
}
// Alttaki seviye ve 1 yazısı kaldırıldı
;
a slice cake top view for kids. In-Game asset. 2d. High contrast. No shadows
Just write 'BÖLME' as a title in colorful text.. In-Game asset. 2d. High contrast. No shadows
Sarı bir button olsun ve içinde 'Pastayı Böl' yazsın. In-Game asset. 2d. High contrast. No shadows
Full ekran sadece sarı renk ekranda başka hiçbirşey yok. In-Game asset. 2d. High contrast. No shadows