/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // DraggableBlock: Sürüklenebilir blok (ekranın altındaki bloklar) var DraggableBlock = Container.expand(function () { var self = Container.call(this); self.shapeIndex = 0; // BLOCK_SHAPES indexi self.matrix = null; // 2D array self.asset = null; // asset adı self.cells = []; // Çocuk bloklar (Container) self.isDragging = false; self.dragOffsetX = 0; self.dragOffsetY = 0; self.originX = 0; self.originY = 0; // Blok oluştur self.init = function (shapeIndex) { self.shapeIndex = shapeIndex; var shape = BLOCK_SHAPES[shapeIndex]; self.matrix = shape.matrix; self.asset = shape.asset; // Önceki hücreleri temizle for (var i = 0; i < self.cells.length; i++) { self.cells[i].destroy(); } self.cells = []; // Blok hücrelerini oluştur var rows = self.matrix.length; var cols = self.matrix[0].length; for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { if (self.matrix[r][c]) { var cell = new Container(); var asset = cell.attachAsset(self.asset, { anchorX: 0.5, anchorY: 0.5 }); cell.x = c * GRID_CELL_SIZE; cell.y = r * GRID_CELL_SIZE; self.addChild(cell); self.cells.push(cell); } } } // Blokun merkezini anchor olarak ayarla self.pivot.x = (cols - 1) * GRID_CELL_SIZE / 2; self.pivot.y = (rows - 1) * GRID_CELL_SIZE / 2; self.width = cols * GRID_CELL_SIZE; self.height = rows * GRID_CELL_SIZE; }; // Sürükleme başlat self.startDrag = function (x, y) { self.isDragging = true; self.dragOffsetX = x - self.x; self.dragOffsetY = y - self.y; self.originX = self.x; self.originY = self.y; // Öne getir if (self.parent) { self.parent.setChildIndex(self, self.parent.children.length - 1); } // Hafif büyüt tween(self, { scaleX: 1.1, scaleY: 1.1 }, { duration: 120, easing: tween.easeOut }); }; // Sürükleme bitir self.stopDrag = function () { self.isDragging = false; tween(self, { scaleX: 1, scaleY: 1 }, { duration: 120, easing: tween.easeIn }); }; // Sürükleme sırasında pozisyon güncelle self.dragMove = function (x, y) { if (self.isDragging) { self.x = x - self.dragOffsetX; self.y = y - self.dragOffsetY; } }; // Orijinal konuma dön self.returnToOrigin = function () { tween(self, { x: self.originX, y: self.originY }, { duration: 180, easing: tween.easeIn }); }; return self; }); /**** * Oyun Sabitleri ****/ // GridCell: Izgara hücresi (arka plan için) var GridCell = Container.expand(function () { var self = Container.call(this); var cell = self.attachAsset('gridCell', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // PlacedBlock: Izgaraya yerleştirilen blokun bir parçası var PlacedBlock = Container.expand(function () { var self = Container.call(this); // asset ve renk, parametre olarak alınacak self.init = function (asset) { self.asset = self.attachAsset(asset, { anchorX: 0.5, anchorY: 0.5 }); }; return self; }); /**** * Initialize Game ****/ // Blokların gösterileceği alt kısım var game = new LK.Game({ backgroundColor: 0x181c22 }); /**** * Game Code ****/ // Her şekil: {matrix: 2D array, asset: string} /**** * Blok Şekilleri Tanımı ****/ // Blok şekilleri için renkli kutular ve ızgara hücreleri // Izgara verisi: 10x10, 0=boş, 1=dolu var BLOCK_SHAPES = [ // Tekli blok { matrix: [[1]], asset: 'block1' }, // 1x2 yatay { matrix: [[1, 1]], asset: 'block2' }, // 1x3 yatay { matrix: [[1, 1, 1]], asset: 'block3' }, // 2x1 dikey { matrix: [[1], [1]], asset: 'block4' }, // 3x1 dikey { matrix: [[1], [1], [1]], asset: 'block5' }, // 2x2 kare { matrix: [[1, 1], [1, 1]], asset: 'block6' }, // L şekli { matrix: [[1, 0], [1, 0], [1, 1]], asset: 'block7' }, // T şekli { matrix: [[1, 1, 1], [0, 1, 0]], asset: 'block2' }, // Z şekli { matrix: [[1, 1, 0], [0, 1, 1]], asset: 'block3' }, // 1x4 yatay { matrix: [[1, 1, 1, 1]], asset: 'block4' }, // 4x1 dikey { matrix: [[1], [1], [1], [1]], asset: 'block5' }]; /**** * Oyun Sabitleri ****/ var GRID_SIZE = 10; var GRID_CELL_SIZE = 180; // px var GRID_MARGIN_TOP = 180; // px var GRID_MARGIN_LEFT = 124; // px (2048-1800)/2 var BLOCK_AREA_Y = 2200; var grid = []; for (var i = 0; i < GRID_SIZE; i++) { grid[i] = []; for (var j = 0; j < GRID_SIZE; j++) { grid[i][j] = 0; } } // Izgara hücrelerini çiz var gridCells = []; var gridOverlayCells = []; for (var r = 0; r < GRID_SIZE; r++) { for (var c = 0; c < GRID_SIZE; c++) { var cell = new GridCell(); cell.x = GRID_MARGIN_LEFT + c * GRID_CELL_SIZE + GRID_CELL_SIZE / 2; cell.y = GRID_MARGIN_TOP + r * GRID_CELL_SIZE + GRID_CELL_SIZE / 2; game.addChild(cell); gridCells.push(cell); // Küçük overlay hücresi (gri, daha küçük, üstte) var overlay = new Container(); var overlayAsset = overlay.attachAsset('gridCell', { anchorX: 0.5, anchorY: 0.5, width: GRID_CELL_SIZE * 0.28, height: GRID_CELL_SIZE * 0.28, color: 0x444c5a }); overlay.x = cell.x; overlay.y = cell.y; overlay.alpha = 0.7; game.addChild(overlay); gridOverlayCells.push(overlay); } } // Skor göstergesi var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Sürüklenebilir bloklar (en fazla 3 blok) var draggableBlocks = []; var BLOCKS_PER_SET = 3; // Blokları oluştur ve konumlandır function spawnDraggableBlocks() { // Öncekileri temizle for (var i = 0; i < draggableBlocks.length; i++) { draggableBlocks[i].destroy(); } draggableBlocks = []; for (var i = 0; i < BLOCKS_PER_SET; i++) { var block = new DraggableBlock(); var shapeIndex = Math.floor(Math.random() * BLOCK_SHAPES.length); block.init(shapeIndex); // Blokları alt kısımda ortalı ve aralıklı yerleştir var totalWidth = BLOCKS_PER_SET * 360 + (BLOCKS_PER_SET - 1) * 60; var startX = (2048 - totalWidth) / 2 + 180; block.x = startX + i * (360 + 60); block.y = BLOCK_AREA_Y; block.scaleX = 1; block.scaleY = 1; game.addChild(block); draggableBlocks.push(block); } } // Izgaraya blok yerleştirilebilir mi? (pozisyon, şekil matrisi) function canPlaceBlockAt(row, col, matrix) { var rows = matrix.length; var cols = matrix[0].length; if (row + rows > GRID_SIZE || col + cols > GRID_SIZE) return false; for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { if (matrix[r][c]) { if (grid[row + r][col + c]) return false; } } } return true; } // Blok yerleştir (verilen pozisyon ve şekil) function placeBlockAt(row, col, matrix, asset) { var rows = matrix.length; var cols = matrix[0].length; for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { if (matrix[r][c]) { grid[row + r][col + c] = 1; // Görsel olarak ekle var pb = new PlacedBlock(); pb.init(asset); pb.x = GRID_MARGIN_LEFT + (col + c) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2; pb.y = GRID_MARGIN_TOP + (row + r) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2; game.addChild(pb); } } } } // Satır/sütun temizle ve skor ekle function clearFullLines() { var cleared = 0; // Satırları kontrol et for (var r = 0; r < GRID_SIZE; r++) { var full = true; for (var c = 0; c < GRID_SIZE; c++) { if (!grid[r][c]) { full = false; break; } } if (full) { cleared++; for (var c = 0; c < GRID_SIZE; c++) { grid[r][c] = 0; // O hücredeki placedblock'u bul ve yok et removePlacedBlockAt(r, c); } } } // Sütunları kontrol et for (var c = 0; c < GRID_SIZE; c++) { var full = true; for (var r = 0; r < GRID_SIZE; r++) { if (!grid[r][c]) { full = false; break; } } if (full) { cleared++; for (var r = 0; r < GRID_SIZE; r++) { grid[r][c] = 0; removePlacedBlockAt(r, c); } } } if (cleared > 0) { score += cleared * 10; scoreTxt.setText(score); LK.effects.flashObject(scoreTxt, 0xffff00, 400); } } // Izgaradaki bir hücredeki placedblock'u bul ve yok et function removePlacedBlockAt(row, col) { var x = GRID_MARGIN_LEFT + col * GRID_CELL_SIZE + GRID_CELL_SIZE / 2; var y = GRID_MARGIN_TOP + row * GRID_CELL_SIZE + GRID_CELL_SIZE / 2; // game.children içinde arama for (var i = game.children.length - 1; i >= 0; i--) { var obj = game.children[i]; if (obj instanceof PlacedBlock) { if (Math.abs(obj.x - x) < 2 && Math.abs(obj.y - y) < 2) { obj.destroy(); break; } } } } // Ekrandaki bloklardan biri ızgaraya yerleştirilebiliyor mu? function anyBlockFits() { for (var i = 0; i < draggableBlocks.length; i++) { var block = draggableBlocks[i]; if (!block.parent) continue; // Kullanılmış blok var matrix = block.matrix; var rows = matrix.length; var cols = matrix[0].length; for (var r = 0; r <= GRID_SIZE - rows; r++) { for (var c = 0; c <= GRID_SIZE - cols; c++) { if (canPlaceBlockAt(r, c, matrix)) return true; } } } return false; } // Bloklar bittiğinde yeni set oluştur function allBlocksUsed() { for (var i = 0; i < draggableBlocks.length; i++) { if (draggableBlocks[i].parent) return false; } return true; } // Sürükleme değişkenleri var draggingBlock = null; // Oyun başlat score = 0; scoreTxt.setText(score); var gameOverTriggered = false; spawnDraggableBlocks(); // Oyun hareketleri game.move = function (x, y, obj) { // Sürüklenen blok varsa, hareket ettir if (draggingBlock) { draggingBlock.dragMove(x, y); // Vurgulama: Blokun ızgarada uygun yere denk gelip gelmediğini kontrol et var block = draggingBlock; var matrix = block.matrix; var rows = matrix.length; var cols = matrix[0].length; var gridX = Math.round((block.x + block.pivot.x - GRID_MARGIN_LEFT - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE); var gridY = Math.round((block.y + block.pivot.y - GRID_MARGIN_TOP - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE); // Tüm grid hücrelerinin rengini sıfırla for (var i = 0; i < gridCells.length; i++) { gridCells[i].alpha = 1; } // Eğer uygun yere denk geliyorsa, ilgili hücreleri vurgula if (canPlaceBlockAt(gridY, gridX, matrix)) { for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { if (matrix[r][c]) { var idx = (gridY + r) * GRID_SIZE + (gridX + c); if (idx >= 0 && idx < gridCells.length) { gridCells[idx].alpha = 0.6; } } } } } } }; game.down = function (x, y, obj) { // Bloklardan birine tıklandı mı? for (var i = 0; i < draggableBlocks.length; i++) { var block = draggableBlocks[i]; if (!block.parent) continue; // Blok sınırları içinde mi? var local = block.toLocal(game.toGlobal({ x: x, y: y })); // Blokun alanı içinde mi? if (local.x >= -block.pivot.x && local.x <= block.width - block.pivot.x && local.y >= -block.pivot.y && local.y <= block.height - block.pivot.y) { draggingBlock = block; block.startDrag(x, y); break; } } }; game.up = function (x, y, obj) { if (!draggingBlock) return; // Grid hücrelerinin vurgusunu sıfırla for (var i = 0; i < gridCells.length; i++) { gridCells[i].alpha = 1; } // Bırakılan pozisyonu ızgaraya çevir var block = draggingBlock; var matrix = block.matrix; var rows = matrix.length; var cols = matrix[0].length; // Blokun merkezini referans al var gridX = Math.round((block.x + block.pivot.x - GRID_MARGIN_LEFT - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE); var gridY = Math.round((block.y + block.pivot.y - GRID_MARGIN_TOP - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE); // Eğer blokun bir kısmı grid dışına taşarsa veya yerleşemezse, yerleştirme yapılmaz if (gridX >= 0 && gridY >= 0 && gridX + cols <= GRID_SIZE && gridY + rows <= GRID_SIZE && canPlaceBlockAt(gridY, gridX, matrix)) { // Yerleştir placeBlockAt(gridY, gridX, matrix, block.asset); block.destroy(); draggingBlock = null; clearFullLines(); // Tüm bloklar kullanıldıysa yeni set oluştur if (allBlocksUsed()) { spawnDraggableBlocks(); } // Oyun bitti mi? if (!anyBlockFits()) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); } } else { // Yerleştirilemezse orijinal konuma dön block.returnToOrigin(); block.stopDrag(); draggingBlock = null; } }; // Oyun güncellemesi (gerektiğinde) var gameOverTriggered = false; game.update = function () { // Oyun bitti mi? (her frame kontrol) if (!anyBlockFits() && !gameOverTriggered) { gameOverTriggered = true; LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// DraggableBlock: Sürüklenebilir blok (ekranın altındaki bloklar)
var DraggableBlock = Container.expand(function () {
var self = Container.call(this);
self.shapeIndex = 0; // BLOCK_SHAPES indexi
self.matrix = null; // 2D array
self.asset = null; // asset adı
self.cells = []; // Çocuk bloklar (Container)
self.isDragging = false;
self.dragOffsetX = 0;
self.dragOffsetY = 0;
self.originX = 0;
self.originY = 0;
// Blok oluştur
self.init = function (shapeIndex) {
self.shapeIndex = shapeIndex;
var shape = BLOCK_SHAPES[shapeIndex];
self.matrix = shape.matrix;
self.asset = shape.asset;
// Önceki hücreleri temizle
for (var i = 0; i < self.cells.length; i++) {
self.cells[i].destroy();
}
self.cells = [];
// Blok hücrelerini oluştur
var rows = self.matrix.length;
var cols = self.matrix[0].length;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (self.matrix[r][c]) {
var cell = new Container();
var asset = cell.attachAsset(self.asset, {
anchorX: 0.5,
anchorY: 0.5
});
cell.x = c * GRID_CELL_SIZE;
cell.y = r * GRID_CELL_SIZE;
self.addChild(cell);
self.cells.push(cell);
}
}
}
// Blokun merkezini anchor olarak ayarla
self.pivot.x = (cols - 1) * GRID_CELL_SIZE / 2;
self.pivot.y = (rows - 1) * GRID_CELL_SIZE / 2;
self.width = cols * GRID_CELL_SIZE;
self.height = rows * GRID_CELL_SIZE;
};
// Sürükleme başlat
self.startDrag = function (x, y) {
self.isDragging = true;
self.dragOffsetX = x - self.x;
self.dragOffsetY = y - self.y;
self.originX = self.x;
self.originY = self.y;
// Öne getir
if (self.parent) {
self.parent.setChildIndex(self, self.parent.children.length - 1);
}
// Hafif büyüt
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 120,
easing: tween.easeOut
});
};
// Sürükleme bitir
self.stopDrag = function () {
self.isDragging = false;
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
};
// Sürükleme sırasında pozisyon güncelle
self.dragMove = function (x, y) {
if (self.isDragging) {
self.x = x - self.dragOffsetX;
self.y = y - self.dragOffsetY;
}
};
// Orijinal konuma dön
self.returnToOrigin = function () {
tween(self, {
x: self.originX,
y: self.originY
}, {
duration: 180,
easing: tween.easeIn
});
};
return self;
});
/****
* Oyun Sabitleri
****/
// GridCell: Izgara hücresi (arka plan için)
var GridCell = Container.expand(function () {
var self = Container.call(this);
var cell = self.attachAsset('gridCell', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// PlacedBlock: Izgaraya yerleştirilen blokun bir parçası
var PlacedBlock = Container.expand(function () {
var self = Container.call(this);
// asset ve renk, parametre olarak alınacak
self.init = function (asset) {
self.asset = self.attachAsset(asset, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
/****
* Initialize Game
****/
// Blokların gösterileceği alt kısım
var game = new LK.Game({
backgroundColor: 0x181c22
});
/****
* Game Code
****/
// Her şekil: {matrix: 2D array, asset: string}
/****
* Blok Şekilleri Tanımı
****/
// Blok şekilleri için renkli kutular ve ızgara hücreleri
// Izgara verisi: 10x10, 0=boş, 1=dolu
var BLOCK_SHAPES = [
// Tekli blok
{
matrix: [[1]],
asset: 'block1'
},
// 1x2 yatay
{
matrix: [[1, 1]],
asset: 'block2'
},
// 1x3 yatay
{
matrix: [[1, 1, 1]],
asset: 'block3'
},
// 2x1 dikey
{
matrix: [[1], [1]],
asset: 'block4'
},
// 3x1 dikey
{
matrix: [[1], [1], [1]],
asset: 'block5'
},
// 2x2 kare
{
matrix: [[1, 1], [1, 1]],
asset: 'block6'
},
// L şekli
{
matrix: [[1, 0], [1, 0], [1, 1]],
asset: 'block7'
},
// T şekli
{
matrix: [[1, 1, 1], [0, 1, 0]],
asset: 'block2'
},
// Z şekli
{
matrix: [[1, 1, 0], [0, 1, 1]],
asset: 'block3'
},
// 1x4 yatay
{
matrix: [[1, 1, 1, 1]],
asset: 'block4'
},
// 4x1 dikey
{
matrix: [[1], [1], [1], [1]],
asset: 'block5'
}];
/****
* Oyun Sabitleri
****/
var GRID_SIZE = 10;
var GRID_CELL_SIZE = 180; // px
var GRID_MARGIN_TOP = 180; // px
var GRID_MARGIN_LEFT = 124; // px (2048-1800)/2
var BLOCK_AREA_Y = 2200;
var grid = [];
for (var i = 0; i < GRID_SIZE; i++) {
grid[i] = [];
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j] = 0;
}
}
// Izgara hücrelerini çiz
var gridCells = [];
var gridOverlayCells = [];
for (var r = 0; r < GRID_SIZE; r++) {
for (var c = 0; c < GRID_SIZE; c++) {
var cell = new GridCell();
cell.x = GRID_MARGIN_LEFT + c * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
cell.y = GRID_MARGIN_TOP + r * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
game.addChild(cell);
gridCells.push(cell);
// Küçük overlay hücresi (gri, daha küçük, üstte)
var overlay = new Container();
var overlayAsset = overlay.attachAsset('gridCell', {
anchorX: 0.5,
anchorY: 0.5,
width: GRID_CELL_SIZE * 0.28,
height: GRID_CELL_SIZE * 0.28,
color: 0x444c5a
});
overlay.x = cell.x;
overlay.y = cell.y;
overlay.alpha = 0.7;
game.addChild(overlay);
gridOverlayCells.push(overlay);
}
}
// Skor göstergesi
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Sürüklenebilir bloklar (en fazla 3 blok)
var draggableBlocks = [];
var BLOCKS_PER_SET = 3;
// Blokları oluştur ve konumlandır
function spawnDraggableBlocks() {
// Öncekileri temizle
for (var i = 0; i < draggableBlocks.length; i++) {
draggableBlocks[i].destroy();
}
draggableBlocks = [];
for (var i = 0; i < BLOCKS_PER_SET; i++) {
var block = new DraggableBlock();
var shapeIndex = Math.floor(Math.random() * BLOCK_SHAPES.length);
block.init(shapeIndex);
// Blokları alt kısımda ortalı ve aralıklı yerleştir
var totalWidth = BLOCKS_PER_SET * 360 + (BLOCKS_PER_SET - 1) * 60;
var startX = (2048 - totalWidth) / 2 + 180;
block.x = startX + i * (360 + 60);
block.y = BLOCK_AREA_Y;
block.scaleX = 1;
block.scaleY = 1;
game.addChild(block);
draggableBlocks.push(block);
}
}
// Izgaraya blok yerleştirilebilir mi? (pozisyon, şekil matrisi)
function canPlaceBlockAt(row, col, matrix) {
var rows = matrix.length;
var cols = matrix[0].length;
if (row + rows > GRID_SIZE || col + cols > GRID_SIZE) return false;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (matrix[r][c]) {
if (grid[row + r][col + c]) return false;
}
}
}
return true;
}
// Blok yerleştir (verilen pozisyon ve şekil)
function placeBlockAt(row, col, matrix, asset) {
var rows = matrix.length;
var cols = matrix[0].length;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (matrix[r][c]) {
grid[row + r][col + c] = 1;
// Görsel olarak ekle
var pb = new PlacedBlock();
pb.init(asset);
pb.x = GRID_MARGIN_LEFT + (col + c) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
pb.y = GRID_MARGIN_TOP + (row + r) * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
game.addChild(pb);
}
}
}
}
// Satır/sütun temizle ve skor ekle
function clearFullLines() {
var cleared = 0;
// Satırları kontrol et
for (var r = 0; r < GRID_SIZE; r++) {
var full = true;
for (var c = 0; c < GRID_SIZE; c++) {
if (!grid[r][c]) {
full = false;
break;
}
}
if (full) {
cleared++;
for (var c = 0; c < GRID_SIZE; c++) {
grid[r][c] = 0;
// O hücredeki placedblock'u bul ve yok et
removePlacedBlockAt(r, c);
}
}
}
// Sütunları kontrol et
for (var c = 0; c < GRID_SIZE; c++) {
var full = true;
for (var r = 0; r < GRID_SIZE; r++) {
if (!grid[r][c]) {
full = false;
break;
}
}
if (full) {
cleared++;
for (var r = 0; r < GRID_SIZE; r++) {
grid[r][c] = 0;
removePlacedBlockAt(r, c);
}
}
}
if (cleared > 0) {
score += cleared * 10;
scoreTxt.setText(score);
LK.effects.flashObject(scoreTxt, 0xffff00, 400);
}
}
// Izgaradaki bir hücredeki placedblock'u bul ve yok et
function removePlacedBlockAt(row, col) {
var x = GRID_MARGIN_LEFT + col * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
var y = GRID_MARGIN_TOP + row * GRID_CELL_SIZE + GRID_CELL_SIZE / 2;
// game.children içinde arama
for (var i = game.children.length - 1; i >= 0; i--) {
var obj = game.children[i];
if (obj instanceof PlacedBlock) {
if (Math.abs(obj.x - x) < 2 && Math.abs(obj.y - y) < 2) {
obj.destroy();
break;
}
}
}
}
// Ekrandaki bloklardan biri ızgaraya yerleştirilebiliyor mu?
function anyBlockFits() {
for (var i = 0; i < draggableBlocks.length; i++) {
var block = draggableBlocks[i];
if (!block.parent) continue; // Kullanılmış blok
var matrix = block.matrix;
var rows = matrix.length;
var cols = matrix[0].length;
for (var r = 0; r <= GRID_SIZE - rows; r++) {
for (var c = 0; c <= GRID_SIZE - cols; c++) {
if (canPlaceBlockAt(r, c, matrix)) return true;
}
}
}
return false;
}
// Bloklar bittiğinde yeni set oluştur
function allBlocksUsed() {
for (var i = 0; i < draggableBlocks.length; i++) {
if (draggableBlocks[i].parent) return false;
}
return true;
}
// Sürükleme değişkenleri
var draggingBlock = null;
// Oyun başlat
score = 0;
scoreTxt.setText(score);
var gameOverTriggered = false;
spawnDraggableBlocks();
// Oyun hareketleri
game.move = function (x, y, obj) {
// Sürüklenen blok varsa, hareket ettir
if (draggingBlock) {
draggingBlock.dragMove(x, y);
// Vurgulama: Blokun ızgarada uygun yere denk gelip gelmediğini kontrol et
var block = draggingBlock;
var matrix = block.matrix;
var rows = matrix.length;
var cols = matrix[0].length;
var gridX = Math.round((block.x + block.pivot.x - GRID_MARGIN_LEFT - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
var gridY = Math.round((block.y + block.pivot.y - GRID_MARGIN_TOP - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
// Tüm grid hücrelerinin rengini sıfırla
for (var i = 0; i < gridCells.length; i++) {
gridCells[i].alpha = 1;
}
// Eğer uygun yere denk geliyorsa, ilgili hücreleri vurgula
if (canPlaceBlockAt(gridY, gridX, matrix)) {
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
if (matrix[r][c]) {
var idx = (gridY + r) * GRID_SIZE + (gridX + c);
if (idx >= 0 && idx < gridCells.length) {
gridCells[idx].alpha = 0.6;
}
}
}
}
}
}
};
game.down = function (x, y, obj) {
// Bloklardan birine tıklandı mı?
for (var i = 0; i < draggableBlocks.length; i++) {
var block = draggableBlocks[i];
if (!block.parent) continue;
// Blok sınırları içinde mi?
var local = block.toLocal(game.toGlobal({
x: x,
y: y
}));
// Blokun alanı içinde mi?
if (local.x >= -block.pivot.x && local.x <= block.width - block.pivot.x && local.y >= -block.pivot.y && local.y <= block.height - block.pivot.y) {
draggingBlock = block;
block.startDrag(x, y);
break;
}
}
};
game.up = function (x, y, obj) {
if (!draggingBlock) return;
// Grid hücrelerinin vurgusunu sıfırla
for (var i = 0; i < gridCells.length; i++) {
gridCells[i].alpha = 1;
}
// Bırakılan pozisyonu ızgaraya çevir
var block = draggingBlock;
var matrix = block.matrix;
var rows = matrix.length;
var cols = matrix[0].length;
// Blokun merkezini referans al
var gridX = Math.round((block.x + block.pivot.x - GRID_MARGIN_LEFT - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
var gridY = Math.round((block.y + block.pivot.y - GRID_MARGIN_TOP - GRID_CELL_SIZE / 2) / GRID_CELL_SIZE);
// Eğer blokun bir kısmı grid dışına taşarsa veya yerleşemezse, yerleştirme yapılmaz
if (gridX >= 0 && gridY >= 0 && gridX + cols <= GRID_SIZE && gridY + rows <= GRID_SIZE && canPlaceBlockAt(gridY, gridX, matrix)) {
// Yerleştir
placeBlockAt(gridY, gridX, matrix, block.asset);
block.destroy();
draggingBlock = null;
clearFullLines();
// Tüm bloklar kullanıldıysa yeni set oluştur
if (allBlocksUsed()) {
spawnDraggableBlocks();
}
// Oyun bitti mi?
if (!anyBlockFits()) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
}
} else {
// Yerleştirilemezse orijinal konuma dön
block.returnToOrigin();
block.stopDrag();
draggingBlock = null;
}
};
// Oyun güncellemesi (gerektiğinde)
var gameOverTriggered = false;
game.update = function () {
// Oyun bitti mi? (her frame kontrol)
if (!anyBlockFits() && !gameOverTriggered) {
gameOverTriggered = true;
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
}
};