User prompt
3. bölmeyide yap
User prompt
Bu şekilde devam et 20 ye kadar
User prompt
bak ilk başta kare sonra 2 tane eşit boyutlu kafat ilk karenin boyutlarının 2 bölünmüş şeklini istiyorum yani yine kare
User prompt
ilk adım doğru sonraki bölünmede yine ilk baştaki karenin 3 bölünmüş hali olsun
User prompt
her dikdörgen bölünmücek bunu düzelt
User prompt
ilk tıklamada sadece 2 tane kare olabilir ekranda sonra 3 sonra ....
User prompt
mesela ilk başta ekranda 1 kare var sonra 2 tane yan yana sonra 3 tane yan yana ve aralarında boşluk olsun
User prompt
eşit parçalara üst üste ve yan yana gelicek şekilde bölünsün
User prompt
ortadaki kareye dokununca kare 2 ye sonra 3 sonra 4 bu şekilde 20 ye kadar bölünsün
User prompt
ortadaki kareye dokun ve kareyi böl yaz aşağıya
Code edit (1 edits merged)
Please save this source code
User prompt
Ortadaki Kare
User prompt
ekranın ortasında bir adet kare var
Initial prompt
kareleri parçalara ayıracağız
/**** * 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