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); 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 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.on('down', function (x, y, obj) { var now = Date.now(); if (now - this._lastTapTime < 350) { // Double-tap detected, rotate 90 degrees right // Rotate shape 90 degrees right (clockwise) and update logic // 1. Rotate the shape array var oldShape = this.shape; var newShape = []; // Handle single-row and single-column blocks correctly if (oldShape.length === 1) { // Single row (horizontal) -> become single column (vertical) for (var j = 0; j < oldShape[0].length; j++) { newShape.push([oldShape[0][j]]); } } else if (oldShape[0].length === 1) { // Single column (vertical) -> become single row (horizontal) var row = []; for (var i = oldShape.length - 1; i >= 0; i--) { row.push(oldShape[i][0]); } newShape.push(row); } else { // General case: rotate matrix for (var j = 0; j < oldShape[0].length; j++) { var newRow = []; for (var i = oldShape.length - 1; i >= 0; i--) { newRow.push(oldShape[i][j]); } newShape.push(newRow); } } this.shape = newShape; // 2. Remove old blocks for (var i = 0; i < this.blocks.length; i++) { this.removeChild(this.blocks[i]); } this.blocks = []; // 3. Recreate blocks with new shape var blockSize = 160; var background = this.children[0]; // Find the anchor cell (first '1' in the old shape) var anchorI = 0, anchorJ = 0; var foundAnchor = false; for (var i = 0; i < oldShape.length && !foundAnchor; i++) { for (var j = 0; j < oldShape[i].length && !foundAnchor; j++) { if (oldShape[i][j] === 1) { anchorI = i; anchorJ = j; foundAnchor = true; } } } // After rotation, find the new anchor cell (first '1' in the new shape) var newAnchorI = 0, newAnchorJ = 0; foundAnchor = false; for (var i = 0; i < newShape.length && !foundAnchor; i++) { for (var j = 0; j < newShape[i].length && !foundAnchor; j++) { if (newShape[i][j] === 1) { newAnchorI = i; newAnchorJ = j; foundAnchor = true; } } } // Calculate offset so that the anchor cell stays at the same place visually var blockOffsetX = (background.width / 2 - this.shape[0].length * blockSize) / 2 - blockSize / 2; var blockOffsetY = (background.height / 2 - this.shape.length * blockSize) / 2 - blockSize / 2; var anchorDeltaX = (anchorJ - newAnchorJ) * blockSize; var anchorDeltaY = (anchorI - newAnchorI) * blockSize; for (var i = 0; i < this.shape.length; i++) { for (var j = 0; j < this.shape[i].length; j++) { if (this.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 + anchorDeltaX; blockAsset.y = i * blockSize + blockOffsetY + anchorDeltaY; this.blocks.push(blockAsset); this.addChild(blockAsset); } } } // After rotation, update start position and drag offset if needed if (typeof this.setStartPosition === "function") { this.setStartPosition(this.x, this.y); } 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(); // Clean up undefined entries from blocks array for (var i = blocks.length - 1; i >= 0; i--) { if (blocks[i] === undefined) { blocks.splice(i, 1); } } if (blocks.length === 0) { 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]) continue; // skip undefined entries for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if (board.grid[i][j].filled) { continue; } var canPlace = true; for (var k = 0; k < blocks[a].shape.length; k++) { for (var l = 0; l < blocks[a].shape[k].length; l++) { if (blocks[a].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; } } } } return false; }; var isGameOver = false; LK.on('tick', function () { board.tick(); if (isGameOver || !game.isMovePossible()) { LK.effects.flashScreen(0xffffff, 1000); scoreTxt.setText(score); // Ensure score is up to date 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(); // If block is dragged off screen, reset to start position if (blocks[a].x < 0 || blocks[a].x > 2048 || blocks[a].y < 0 || blocks[a].y > 2732) { blocks[a].x = blocks[a].startX; blocks[a].y = blocks[a].startY; } } } } });
===================================================================
--- original.js
+++ change.js
@@ -377,10 +377,39 @@
this.blocks = [];
// 3. Recreate blocks with new shape
var blockSize = 160;
var background = this.children[0];
+ // Find the anchor cell (first '1' in the old shape)
+ var anchorI = 0,
+ anchorJ = 0;
+ var foundAnchor = false;
+ for (var i = 0; i < oldShape.length && !foundAnchor; i++) {
+ for (var j = 0; j < oldShape[i].length && !foundAnchor; j++) {
+ if (oldShape[i][j] === 1) {
+ anchorI = i;
+ anchorJ = j;
+ foundAnchor = true;
+ }
+ }
+ }
+ // After rotation, find the new anchor cell (first '1' in the new shape)
+ var newAnchorI = 0,
+ newAnchorJ = 0;
+ foundAnchor = false;
+ for (var i = 0; i < newShape.length && !foundAnchor; i++) {
+ for (var j = 0; j < newShape[i].length && !foundAnchor; j++) {
+ if (newShape[i][j] === 1) {
+ newAnchorI = i;
+ newAnchorJ = j;
+ foundAnchor = true;
+ }
+ }
+ }
+ // Calculate offset so that the anchor cell stays at the same place visually
var blockOffsetX = (background.width / 2 - this.shape[0].length * blockSize) / 2 - blockSize / 2;
var blockOffsetY = (background.height / 2 - this.shape.length * blockSize) / 2 - blockSize / 2;
+ var anchorDeltaX = (anchorJ - newAnchorJ) * blockSize;
+ var anchorDeltaY = (anchorI - newAnchorI) * blockSize;
for (var i = 0; i < this.shape.length; i++) {
for (var j = 0; j < this.shape[i].length; j++) {
if (this.shape[i][j] === 1) {
var blockAsset = this.attachAsset('block', {
@@ -389,10 +418,10 @@
});
blockAsset.tint = this.color;
blockAsset.width = blockSize;
blockAsset.height = blockSize;
- blockAsset.x = j * blockSize + blockOffsetX;
- blockAsset.y = i * blockSize + blockOffsetY;
+ blockAsset.x = j * blockSize + blockOffsetX + anchorDeltaX;
+ blockAsset.y = i * blockSize + blockOffsetY + anchorDeltaY;
this.blocks.push(blockAsset);
this.addChild(blockAsset);
}
}
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