User prompt
yan çevrildiginde tek sıra halındeki blokların geleceği yeri o blokla aynı yerde olmasını sagla
User prompt
tek sıra halindeki blokları döndürdüğünde bozuluyor bunu duzeltt
User prompt
tekrardan düzelt olmamış
User prompt
hataları bul ve düzelt
User prompt
bloklar sadece goruntu olarak değil işlevsel olarakda 90 derece dönsunler
User prompt
düz blokları eski haline getir
User prompt
düz blokları yerleştirirken olması gereken yerin sag tarafında tutunca yerleşiyor bun düzlet
User prompt
düz blokların hitbox ını düzelt
User prompt
blokları 90 derece dpndurunce hitboxıyla beraber hareket etsin
User prompt
bloklar sadece goruntu olarak değil işlevsel olarakda 90 derece dönsunler
User prompt
düz bloklardaki dödürme eylemındeki hataları bul ve duzelt
User prompt
eger oyuncu 90 drece döcururse alanda koyabilecegimiz yeride dönsün yanı mesela duz bloku aldım 90 derece cevirdim ve en alttakı sıraya koymak istiyorum bunu yapabilmeliyim
User prompt
ve 90 drece döndürüldüğünde hitbox larınıda aynı şekilde döndür
User prompt
bloklara iki ez art arda dokundugumuzda sag tarafa 90 derce dönsünler
User prompt
tetristeki t blogun ekle
Remix started
Copy Block Puzzle
/**** * Classes ****/ var Block = Container.expand(function (board) { var self = Container.call(this); var hsvToRgb = function hsvToRgb(h, s, v) { var r, g, b; var i = Math.floor(h * 6); var f = h * 6 - i; var p = v * (1 - s); var q = v * (1 - f * s); var t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } return (Math.round(r * 255) << 16) + (Math.round(g * 255) << 8) + Math.round(b * 255); }; var ShapeTypes = { SINGLE: [[1]], TRI: [[1, 1, 1]], QUAD: [[1, 1, 1, 1]], LSHAPE: [[1, 0, 0], [1, 0, 0], [1, 1, 1]], BLOCK: [[1, 1], [1, 1]], SMALLLSHAPE: [[1, 0], [1, 1]], T: [[0, 1, 0], [1, 1, 1]] }; var shapes = Object.values(ShapeTypes); var offset = Math.floor(Math.random() * shapes.length); self.shape = shapes[offset]; var hue = offset % shapes.length / shapes.length; self.color = hsvToRgb(hue, 0.6, 1); self.rotateShapeRandomly = function () { var rotations = Math.floor(Math.random() * 4); for (var r = 0; r < rotations; r++) { self.shape = self.shape[0].map(function (val, index) { return self.shape.map(function (row) { return row[index]; }).reverse(); }); } }; self.rotateShapeRandomly(); self.blocks = []; var background = self.attachAsset('background', { anchorX: 0.5, anchorY: 0.5 }); background.alpha = 0; var blockSize = 160; background.width = 4 * blockSize; background.height = 4 * blockSize; self.addChild(background); self.offsetX = 0; self.offsetY = 0; var blockOffsetX = (background.width / 2 - self.shape[0].length * blockSize) / 2 - blockSize / 2; var blockOffsetY = (background.height / 2 - self.shape.length * blockSize) / 2 - blockSize / 2; for (var i = 0; i < self.shape.length; i++) { for (var j = 0; j < self.shape[i].length; j++) { if (self.shape[i][j] === 1) { var block = self.attachAsset('block', { anchorX: 0.5, anchorY: 0.5 }); block.tint = self.color; block.width = blockSize; block.height = blockSize; block.x = j * blockSize + blockOffsetX; block.y = i * blockSize + blockOffsetY; self.blocks.push(block); self.addChild(block); } } } self.startX = 0; self.startY = 0; self.moveTowardsHomePosition = function () { var dx = self.startX - self.x; var dy = self.startY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 1) { self.x += dx * 0.3; self.y += dy * 0.3; } else { self.x = self.startX; self.y = self.startY; } }; var currentX = 0; var currentY = 0; self.moveToDragTarget = function () { var ox = -this.targetX; var oy = (LK.is.mobile ? 400 : 0) - this.targetY; this.targetX += ox / 5; this.targetY += oy / 5; this.x = currentX - this.targetX; this.y = currentY - this.targetY; }; self._move_migrated = function (x, y) { currentX = x; currentY = y; self.x = x - this.targetX; self.y = y - this.targetY; }; self.setStartPosition = function (x, y) { self.startX = x; self.startY = y; }; self.getOverlappingCells = function () { var cells = []; var boardPos = { x: -board.x + self.x + 160 * 4 + blockOffsetX + 160, y: -board.y + self.y + 160 * 4 + blockOffsetY + 160 }; var startX = Math.floor(boardPos.x / 160); var startY = Math.floor(boardPos.y / 160); // Use rotated shape for hitbox logic if available, otherwise compute it var shape; if (self._rotatedShape) { shape = self._rotatedShape; } else { // Deep copy shape to avoid mutating self.shape var deepCopyShape = function deepCopyShape(s) { var out = []; for (var i = 0; i < s.length; i++) { out.push(s[i].slice()); } return out; }; // fallback: compute rotated shape shape = self.shape; var rot = self._rotation || 0; shape = deepCopyShape(shape); // Special handling for straight (QUAD) blocks to ensure correct hitbox // QUAD is a 1x4 or 4x1 block, so after rotation, shape must be correct // Detect if this is a straight block (all 1s in a row or column) var isStraight = false; if (shape.length === 1 && shape[0].length === 4 && shape[0][0] === 1 && shape[0][1] === 1 && shape[0][2] === 1 && shape[0][3] === 1 || shape.length === 4 && shape[0].length === 1 && shape[0][0] === 1 && shape[1][0] === 1 && shape[2][0] === 1 && shape[3][0] === 1) { isStraight = true; } // Rotate shape for hitbox logic according to self._rotation for (var r = 0; r < rot; r++) { shape = shape[0].map(function (val, index) { return shape.map(function (row) { return row[index]; }).reverse(); }); } // After rotation, for straight blocks, ensure shape is always a 1x4 or 4x1 array of 1s if (isStraight) { if (rot % 2 === 0) { // Horizontal: 1x4 shape = [[1, 1, 1, 1]]; } else { // Vertical: 4x1 shape = [[1], [1], [1], [1]]; } } } for (var i = 0; i < shape.length; i++) { for (var j = 0; j < shape[i].length; j++) { if (shape[i][j] === 1) { var cell = board.grid && board.grid[startY + i] && board.grid[startY + i][startX + j]; if (cell && !cell.filled) { cells.push(cell); } else { return null; } } } } return cells; }; self.showOverlap = function () { var cells = self.getOverlappingCells(); if (cells) { for (var a = 0; a < cells.length; a++) { var cell = cells[a]; cell.setTint(self.color); } } }; self.rotateShapeRandomly = function () { var rotations = Math.floor(Math.random() * 4); for (var r = 0; r < rotations; r++) { self.shape = self.shape[0].map(function (val, index) { return self.shape.map(function (row) { return row[index]; }).reverse(); }); } }; }); var Board = Container.expand(function () { var self = Container.call(this); self.particles = []; Board.prototype.spawnParticles = function (x, y, tint) { for (var i = 0; i < 10; i++) { var particle = new Particle(tint); particle.x = x; particle.y = y; this.particles.push(particle); this.addChild(particle); } }; var background = self.attachAsset('background', { anchorX: 0.5, anchorY: 0.5 }); background.y = -20; background.alpha = .4; background.blendMode = 1; self.grid = new Array(10).fill(null).map(function () { return new Array(10).fill(null); }); var size = 158; var totalWidth = 10 * size; var totalHeight = 10 * size; for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { var cell = new Cell(); cell.x = i * size - totalWidth / 2 + size / 2; cell.y = j * size - totalHeight / 2 + size / 2; self.grid[j][i] = cell; self.addChild(cell); } } self.removeTint = function () { for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if (!self.grid[i][j].filled) { self.grid[i][j].setTint(0xffffff); } } } }; self.checkLines = function () { var rowsRemoved = 0; for (var i = 0; i < 10; i++) { var rowFilled = true; var colFilled = true; for (var j = 0; j < 10; j++) { if (!self.grid[i][j].filled) { rowFilled = false; } if (!self.grid[j][i].filled) { colFilled = false; } } if (rowFilled || colFilled) { rowsRemoved += (rowFilled ? 1 : 0) + (colFilled ? 1 : 0); for (var j = 0; j < 10; j++) { if (rowFilled) { self.grid[i][j].setFill(false); self.spawnParticles(self.grid[i][j].x, self.grid[i][j].y, self.grid[i][j].getTint()); } if (colFilled) { self.grid[j][i].setFill(false); self.spawnParticles(self.grid[j][i].x, self.grid[j][i].y, self.grid[j][i].getTint()); } } } } return rowsRemoved; }; self.tick = function () { for (var i = self.particles.length - 1; i >= 0; i--) { var particle = self.particles[i]; if (particle) { particle.tick(); if (particle.alpha <= 0) { self.particles.splice(i, 1); } } } }; self.placeBlock = function () {}; }); var Cell = Container.expand(function () { var self = Container.call(this); self.filled = false; var empty = self.attachAsset('cell', { anchorX: 0.5, anchorY: 0.5 }); empty.alpha = .8; var filled = self.attachAsset('block', { anchorX: 0.5, anchorY: 0.5 }); empty.y = 2; self.setFill = function (isFilled) { self.filled = isFilled; empty.visible = !self.filled; filled.visible = self.filled; }; self.getTint = function () { return filled.tint; }; self.setTint = function (tint) { empty.tint = filled.tint = tint; }; self.setFill(false); }); var Particle = Container.expand(function (tint) { var self = Container.call(this); self.tint = tint; var particleGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); particleGraphics.rotation = Math.random() * Math.PI * 2; particleGraphics.tint = self.tint; self.vx = Math.random() * 4 - 2; self.vy = Math.random() * 4 - 2; self.alpha = 1; self.lifetime = 60; self.tick = function () { self.x += self.vx; self.y += self.vy; self.alpha -= 1 / self.lifetime; if (self.alpha <= 0) { self.destroy(); } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var gameBackground = game.attachAsset('gameBackground', { anchorX: 0.5, anchorY: 0.5 }); gameBackground.x = 2048 / 2; gameBackground.y = 2732 / 2; var tilesBackground = game.attachAsset('tileBackground', { anchorX: 0.5, anchorY: 0.5 }); tilesBackground.y = -20; tilesBackground.alpha = .4; tilesBackground.blendMode = 1; var blocks = []; var dragTarget; var board = game.addChild(new Board()); board.x = 2048 / 2; board.y = 2732 / 2 - 250 + 30; tilesBackground.x = 2048 / 2; tilesBackground.y = 2732 - 300; var targetOffset; game.createBlock = function (index) { var block = new Block(board); block.x = 2048 / 2 + (index - 1) * (block.width + 30); block.y = 2732 + block.height; block.setStartPosition(block.x, 2732 - block.height / 2 - 30); blocks.push(block); game.addChild(block); // Double-tap detection and 90-degree right rotation block._lastTapTime = 0; block._rotation = 0; // Track rotation state for hitbox and visuals block.on('down', function (x, y, obj) { var now = Date.now(); if (now - this._lastTapTime < 350) { // Double-tap detected, rotate 90 degrees right this._rotation = (this._rotation + 1) % 4; // Remove old blocks for (var i = 0; i < this.blocks.length; i++) { this.removeChild(this.blocks[i]); } this.blocks = []; // Calculate rotated shape for visuals (do not mutate original shape) var shape = this.shape; for (var r = 0; r < this._rotation; r++) { shape = shape[0].map(function (val, index) { return shape.map(function (row) { return row[index]; }).reverse(); }); } var blockSize = 160; var background = this.children[0]; var blockOffsetX = (background.width / 2 - shape[0].length * blockSize) / 2 - blockSize / 2; var blockOffsetY = (background.height / 2 - shape.length * blockSize) / 2 - blockSize / 2; for (var i = 0; i < shape.length; i++) { for (var j = 0; j < shape[i].length; j++) { if (shape[i][j] === 1) { var blockAsset = this.attachAsset('block', { anchorX: 0.5, anchorY: 0.5 }); blockAsset.tint = this.color; blockAsset.width = blockSize; blockAsset.height = blockSize; blockAsset.x = j * blockSize + blockOffsetX; blockAsset.y = i * blockSize + blockOffsetY; this.blocks.push(blockAsset); this.addChild(blockAsset); } } } // Update hitbox logic: set a property to store the current rotated shape for hitbox use this._rotatedShape = shape; this._lastTapTime = 0; // reset return; } this._lastTapTime = now; dragTarget = this; var pos = this.toLocal(obj.global); var targetPos = game.toLocal(obj.global); this.targetX = pos.x; this.targetY = pos.y; dragTarget._move_migrated(targetPos.x, targetPos.y); }); }; game.on('move', function (x, y, obj) { if (dragTarget) { board.removeTint(); var pos = game.toLocal(obj.global); dragTarget._move_migrated(pos.x, pos.y); dragTarget.showOverlap(); } }); game.on('up', function (x, y, obj) { if (dragTarget) { var cells = dragTarget.getOverlappingCells(); if (cells) { for (var a = 0; a < cells.length; a++) { cells[a].setFill(true); cells[a].setTint(dragTarget.color); } blocks[blocks.indexOf(dragTarget)] = undefined; dragTarget.destroy(); if (!blocks.some(function (block) { return block; })) { game.createBlocks(); } var pointsToAdd = board.checkLines(); if (pointsToAdd) { score += Math.pow(pointsToAdd, 2) * 10; scoreTxt.setText(score); } } board.removeTint(); dragTarget = undefined; } }); game.createBlocks = function () { for (var i = 0; i < 3; i++) { game.createBlock(i); } }; var score = 0; game.createBlocks(); var scoreTxt = new Text2('0', { size: 150, fill: 0xFFFFFF, font: 'Impact', dropShadow: true, dropShadowColor: '#2a636e' }); scoreTxt.anchor.set(.5, 0); LK.gui.top.addChild(scoreTxt); game.isMovePossible = function () { for (var a = 0; a < blocks.length; a++) { if (blocks[a]) { for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if (board.grid[i][j].filled) { continue; } var canPlace = true; // Only check the current rotation of the block for placement var shape = blocks[a].shape; for (var r = 0; r < (blocks[a]._rotation || 0); r++) { shape = shape[0].map(function (val, index) { return shape.map(function (row) { return row[index]; }).reverse(); }); } for (var k = 0; k < shape.length; k++) { for (var l = 0; l < shape[k].length; l++) { if (shape[k][l] === 1) { if (i + k < 0 || i + k >= 10 || j + l < 0 || j + l >= 10 || board.grid[i + k][j + l].filled) { canPlace = false; break; } } } if (!canPlace) { break; } } if (canPlace) { return true; } canPlace = true; // Reset for next block } } } } return false; }; var isGameOver = false; LK.on('tick', function () { board.tick(); if (isGameOver || !game.isMovePossible()) { LK.effects.flashScreen(0xffffff, 1000); LK.showGameOver(); } for (var a = blocks.length - 1; a >= 0; a--) { if (blocks[a]) { if (blocks[a] != dragTarget) { blocks[a].moveTowardsHomePosition(); } else { blocks[a].moveToDragTarget(); } } } });
===================================================================
--- original.js
+++ change.js
@@ -146,16 +146,33 @@
// fallback: compute rotated shape
shape = self.shape;
var rot = self._rotation || 0;
shape = deepCopyShape(shape);
+ // Special handling for straight (QUAD) blocks to ensure correct hitbox
+ // QUAD is a 1x4 or 4x1 block, so after rotation, shape must be correct
+ // Detect if this is a straight block (all 1s in a row or column)
+ var isStraight = false;
+ if (shape.length === 1 && shape[0].length === 4 && shape[0][0] === 1 && shape[0][1] === 1 && shape[0][2] === 1 && shape[0][3] === 1 || shape.length === 4 && shape[0].length === 1 && shape[0][0] === 1 && shape[1][0] === 1 && shape[2][0] === 1 && shape[3][0] === 1) {
+ isStraight = true;
+ }
// Rotate shape for hitbox logic according to self._rotation
for (var r = 0; r < rot; r++) {
shape = shape[0].map(function (val, index) {
return shape.map(function (row) {
return row[index];
}).reverse();
});
}
+ // After rotation, for straight blocks, ensure shape is always a 1x4 or 4x1 array of 1s
+ if (isStraight) {
+ if (rot % 2 === 0) {
+ // Horizontal: 1x4
+ shape = [[1, 1, 1, 1]];
+ } else {
+ // Vertical: 4x1
+ shape = [[1], [1], [1], [1]];
+ }
+ }
}
for (var i = 0; i < shape.length; i++) {
for (var j = 0; j < shape[i].length; j++) {
if (shape[i][j] === 1) {
White square with round corners, flat shaded, hyper casual game. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Background for relaxing puzzle game. Pastel colors, flat shaded, vector art. Flowers. Blocks. Relaxing. Clouds Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
White particle cloud. Cartoon. Bright outline. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
block with a smile face. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat