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 var oldShape = this.shape; var newShape = this.shape[0].map(function (val, index) { return this.shape.map(function (row) { return row[index]; }).reverse(); }, this); this.shape = newShape; // Remove old blocks for (var i = 0; i < this.blocks.length; i++) { this.removeChild(this.blocks[i]); } this.blocks = []; // Recreate blocks with new shape var blockSize = 160; var background = this.children[0]; 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; 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; blockAsset.y = i * blockSize + blockOffsetY; 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(); 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; 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); 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
@@ -123,18 +123,17 @@
self.startY = y;
};
self.getOverlappingCells = function () {
var cells = [];
- // Calculate the position of the top-left cell of the block relative to the board
- var blockTopLeftX = self.x + blockOffsetX - board.x + background.width / 2;
- var blockTopLeftY = self.y + blockOffsetY - board.y + background.height / 2;
- var startX = Math.round(blockTopLeftX / 160);
- var startY = Math.round(blockTopLeftY / 160);
- // Use shape as-is for hitbox logic (visual-only rotation for straight blocks)
- var shape = self.shape;
- for (var i = 0; i < shape.length; i++) {
- for (var j = 0; j < shape[i].length; j++) {
- if (shape[i][j] === 1) {
+ 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 {
@@ -338,35 +337,33 @@
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;
+ // Rotate shape 90 degrees right (clockwise) and update logic
+ var oldShape = this.shape;
+ var newShape = this.shape[0].map(function (val, index) {
+ return this.shape.map(function (row) {
+ return row[index];
+ }).reverse();
+ }, this);
+ this.shape = newShape;
// 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();
- });
- }
+ // Recreate blocks with new shape
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 blockOffsetX = (background.width / 2 - this.shape[0].length * blockSize) / 2 - blockSize / 2;
+ var blockOffsetY = (background.height / 2 - this.shape.length * blockSize) / 2 - blockSize / 2;
+ 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
});
@@ -379,10 +376,12 @@
this.addChild(blockAsset);
}
}
}
- // Update hitbox logic: set a property to store the current rotated shape for hitbox use
- this._rotatedShape = shape;
+ // 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;
@@ -451,20 +450,11 @@
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) {
+ 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;
}
@@ -476,9 +466,8 @@
}
if (canPlace) {
return true;
}
- canPlace = true; // Reset for next block
}
}
}
}
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