User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'size')' in or related to this line: 'self.numberText.style.size = newValue >= 1000 ? 36 : newValue >= 100 ? 42 : 48;' Line Number: 60
User prompt
Hatayı çöz
Code edit (1 edits merged)
Please save this source code
User prompt
Number Merge 2048
Initial prompt
2048 yapmak istiyorum
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Tile = Container.expand(function (value, gridX, gridY) {
var self = Container.call(this);
self.value = value;
self.gridX = gridX;
self.gridY = gridY;
self.hasMerged = false;
// Get the appropriate asset based on value
var assetName = 'tile' + value;
var tileGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Add text for the number
self.numberText = new Text2(value.toString(), {
size: value >= 1000 ? 36 : value >= 100 ? 42 : 48,
fill: value <= 4 ? "#776e65" : "#f9f6f2"
});
self.numberText.anchor.set(0.5, 0.5);
self.addChild(self.numberText);
self.updatePosition = function () {
var targetX = gridStartX + self.gridX * (tileSize + tileGap);
var targetY = gridStartY + self.gridY * (tileSize + tileGap);
tween(self, {
x: targetX,
y: targetY
}, {
duration: 150,
easing: tween.easeOut
});
};
self.setValue = function (newValue) {
self.value = newValue;
self.numberText.setText(newValue.toString());
self.numberText.style.size = newValue >= 1000 ? 36 : newValue >= 100 ? 42 : 48;
// Update graphics
self.removeChild(tileGraphics);
assetName = 'tile' + newValue;
tileGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(tileGraphics, 0);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xfaf8ef
});
/****
* Game Code
****/
// Game constants
var gridSize = 4;
var tileSize = 120;
var tileGap = 10;
var gridStartX = (2048 - (gridSize * tileSize + (gridSize - 1) * tileGap)) / 2;
var gridStartY = (2732 - (gridSize * tileSize + (gridSize - 1) * tileGap)) / 2;
// Game state
var grid = [];
var tiles = [];
var isMoving = false;
var gameWon = false;
var gameOver = false;
// Initialize grid
for (var i = 0; i < gridSize; i++) {
grid[i] = [];
for (var j = 0; j < gridSize; j++) {
grid[i][j] = null;
}
}
// Create grid background
var gridContainer = game.addChild(new Container());
for (var i = 0; i < gridSize; i++) {
for (var j = 0; j < gridSize; j++) {
var cell = gridContainer.attachAsset('gridCell', {
anchorX: 0.5,
anchorY: 0.5,
x: gridStartX + j * (tileSize + tileGap),
y: gridStartY + i * (tileSize + tileGap)
});
}
}
// Score display
var scoreTxt = new Text2('0', {
size: 80,
fill: 0x776E65
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 100;
// Add initial tiles
function addRandomTile() {
var emptyCells = [];
for (var i = 0; i < gridSize; i++) {
for (var j = 0; j < gridSize; j++) {
if (grid[i][j] === null) {
emptyCells.push({
x: j,
y: i
});
}
}
}
if (emptyCells.length > 0) {
var randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)];
var value = Math.random() < 0.9 ? 2 : 4;
var tile = new Tile(value, randomCell.x, randomCell.y);
tile.x = gridStartX + randomCell.x * (tileSize + tileGap);
tile.y = gridStartY + randomCell.y * (tileSize + tileGap);
grid[randomCell.y][randomCell.x] = tile;
tiles.push(tile);
game.addChild(tile);
// Scale animation for new tile
tile.scaleX = 0.1;
tile.scaleY = 0.1;
tween(tile, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.bounceOut
});
}
}
function checkGameWon() {
for (var i = 0; i < tiles.length; i++) {
if (tiles[i].value >= 2048 && !gameWon) {
gameWon = true;
LK.showYouWin();
return true;
}
}
return false;
}
function checkGameOver() {
// Check if grid is full
var fullGrid = true;
for (var i = 0; i < gridSize; i++) {
for (var j = 0; j < gridSize; j++) {
if (grid[i][j] === null) {
fullGrid = false;
break;
}
}
if (!fullGrid) break;
}
if (!fullGrid) return false;
// Check for possible moves
for (var i = 0; i < gridSize; i++) {
for (var j = 0; j < gridSize; j++) {
var currentValue = grid[i][j].value;
// Check right
if (j < gridSize - 1 && grid[i][j + 1].value === currentValue) {
return false;
}
// Check down
if (i < gridSize - 1 && grid[i + 1][j].value === currentValue) {
return false;
}
}
}
gameOver = true;
LK.showGameOver();
return true;
}
function moveTiles(direction) {
if (isMoving || gameOver || gameWon) return false;
var moved = false;
var score = 0;
// Reset merge flags
for (var i = 0; i < tiles.length; i++) {
tiles[i].hasMerged = false;
}
// Create new grid state
var newGrid = [];
for (var i = 0; i < gridSize; i++) {
newGrid[i] = [];
for (var j = 0; j < gridSize; j++) {
newGrid[i][j] = null;
}
}
if (direction === 'left') {
for (var i = 0; i < gridSize; i++) {
var row = [];
// Collect non-null tiles
for (var j = 0; j < gridSize; j++) {
if (grid[i][j] !== null) {
row.push(grid[i][j]);
}
}
// Merge tiles
for (var k = 0; k < row.length - 1; k++) {
if (row[k].value === row[k + 1].value && !row[k].hasMerged && !row[k + 1].hasMerged) {
row[k].setValue(row[k].value * 2);
row[k].hasMerged = true;
score += row[k].value;
// Remove merged tile
game.removeChild(row[k + 1]);
tiles.splice(tiles.indexOf(row[k + 1]), 1);
row.splice(k + 1, 1);
LK.getSound('merge').play();
}
}
// Place tiles in new positions
for (var k = 0; k < row.length; k++) {
if (row[k].gridX !== k || row[k].gridY !== i) {
moved = true;
}
row[k].gridX = k;
row[k].gridY = i;
newGrid[i][k] = row[k];
row[k].updatePosition();
}
}
} else if (direction === 'right') {
for (var i = 0; i < gridSize; i++) {
var row = [];
// Collect non-null tiles
for (var j = gridSize - 1; j >= 0; j--) {
if (grid[i][j] !== null) {
row.push(grid[i][j]);
}
}
// Merge tiles
for (var k = 0; k < row.length - 1; k++) {
if (row[k].value === row[k + 1].value && !row[k].hasMerged && !row[k + 1].hasMerged) {
row[k].setValue(row[k].value * 2);
row[k].hasMerged = true;
score += row[k].value;
// Remove merged tile
game.removeChild(row[k + 1]);
tiles.splice(tiles.indexOf(row[k + 1]), 1);
row.splice(k + 1, 1);
LK.getSound('merge').play();
}
}
// Place tiles in new positions
for (var k = 0; k < row.length; k++) {
var newX = gridSize - 1 - k;
if (row[k].gridX !== newX || row[k].gridY !== i) {
moved = true;
}
row[k].gridX = newX;
row[k].gridY = i;
newGrid[i][newX] = row[k];
row[k].updatePosition();
}
}
} else if (direction === 'up') {
for (var j = 0; j < gridSize; j++) {
var column = [];
// Collect non-null tiles
for (var i = 0; i < gridSize; i++) {
if (grid[i][j] !== null) {
column.push(grid[i][j]);
}
}
// Merge tiles
for (var k = 0; k < column.length - 1; k++) {
if (column[k].value === column[k + 1].value && !column[k].hasMerged && !column[k + 1].hasMerged) {
column[k].setValue(column[k].value * 2);
column[k].hasMerged = true;
score += column[k].value;
// Remove merged tile
game.removeChild(column[k + 1]);
tiles.splice(tiles.indexOf(column[k + 1]), 1);
column.splice(k + 1, 1);
LK.getSound('merge').play();
}
}
// Place tiles in new positions
for (var k = 0; k < column.length; k++) {
if (column[k].gridX !== j || column[k].gridY !== k) {
moved = true;
}
column[k].gridX = j;
column[k].gridY = k;
newGrid[k][j] = column[k];
column[k].updatePosition();
}
}
} else if (direction === 'down') {
for (var j = 0; j < gridSize; j++) {
var column = [];
// Collect non-null tiles
for (var i = gridSize - 1; i >= 0; i--) {
if (grid[i][j] !== null) {
column.push(grid[i][j]);
}
}
// Merge tiles
for (var k = 0; k < column.length - 1; k++) {
if (column[k].value === column[k + 1].value && !column[k].hasMerged && !column[k + 1].hasMerged) {
column[k].setValue(column[k].value * 2);
column[k].hasMerged = true;
score += column[k].value;
// Remove merged tile
game.removeChild(column[k + 1]);
tiles.splice(tiles.indexOf(column[k + 1]), 1);
column.splice(k + 1, 1);
LK.getSound('merge').play();
}
}
// Place tiles in new positions
for (var k = 0; k < column.length; k++) {
var newY = gridSize - 1 - k;
if (column[k].gridX !== j || column[k].gridY !== newY) {
moved = true;
}
column[k].gridX = j;
column[k].gridY = newY;
newGrid[newY][j] = column[k];
column[k].updatePosition();
}
}
}
grid = newGrid;
if (moved) {
LK.setScore(LK.getScore() + score);
scoreTxt.setText(LK.getScore());
LK.getSound('move').play();
isMoving = true;
LK.setTimeout(function () {
addRandomTile();
isMoving = false;
if (!checkGameWon()) {
checkGameOver();
}
}, 200);
}
return moved;
}
// Touch controls
var startX = 0;
var startY = 0;
var isDragging = false;
game.down = function (x, y, obj) {
startX = x;
startY = y;
isDragging = true;
};
game.up = function (x, y, obj) {
if (!isDragging) return;
var deltaX = x - startX;
var deltaY = y - startY;
var minSwipeDistance = 50;
if (Math.abs(deltaX) > minSwipeDistance || Math.abs(deltaY) > minSwipeDistance) {
if (Math.abs(deltaX) > Math.abs(deltaY)) {
// Horizontal swipe
if (deltaX > 0) {
moveTiles('right');
} else {
moveTiles('left');
}
} else {
// Vertical swipe
if (deltaY > 0) {
moveTiles('down');
} else {
moveTiles('up');
}
}
}
isDragging = false;
};
// Add initial tiles
addRandomTile();
addRandomTile();
game.update = function () {
scoreTxt.setText(LK.getScore());
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,384 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Tile = Container.expand(function (value, gridX, gridY) {
+ var self = Container.call(this);
+ self.value = value;
+ self.gridX = gridX;
+ self.gridY = gridY;
+ self.hasMerged = false;
+ // Get the appropriate asset based on value
+ var assetName = 'tile' + value;
+ var tileGraphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Add text for the number
+ self.numberText = new Text2(value.toString(), {
+ size: value >= 1000 ? 36 : value >= 100 ? 42 : 48,
+ fill: value <= 4 ? "#776e65" : "#f9f6f2"
+ });
+ self.numberText.anchor.set(0.5, 0.5);
+ self.addChild(self.numberText);
+ self.updatePosition = function () {
+ var targetX = gridStartX + self.gridX * (tileSize + tileGap);
+ var targetY = gridStartY + self.gridY * (tileSize + tileGap);
+ tween(self, {
+ x: targetX,
+ y: targetY
+ }, {
+ duration: 150,
+ easing: tween.easeOut
+ });
+ };
+ self.setValue = function (newValue) {
+ self.value = newValue;
+ self.numberText.setText(newValue.toString());
+ self.numberText.style.size = newValue >= 1000 ? 36 : newValue >= 100 ? 42 : 48;
+ // Update graphics
+ self.removeChild(tileGraphics);
+ assetName = 'tile' + newValue;
+ tileGraphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.addChildAt(tileGraphics, 0);
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0xfaf8ef
+});
+
+/****
+* Game Code
+****/
+// Game constants
+var gridSize = 4;
+var tileSize = 120;
+var tileGap = 10;
+var gridStartX = (2048 - (gridSize * tileSize + (gridSize - 1) * tileGap)) / 2;
+var gridStartY = (2732 - (gridSize * tileSize + (gridSize - 1) * tileGap)) / 2;
+// Game state
+var grid = [];
+var tiles = [];
+var isMoving = false;
+var gameWon = false;
+var gameOver = false;
+// Initialize grid
+for (var i = 0; i < gridSize; i++) {
+ grid[i] = [];
+ for (var j = 0; j < gridSize; j++) {
+ grid[i][j] = null;
+ }
+}
+// Create grid background
+var gridContainer = game.addChild(new Container());
+for (var i = 0; i < gridSize; i++) {
+ for (var j = 0; j < gridSize; j++) {
+ var cell = gridContainer.attachAsset('gridCell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: gridStartX + j * (tileSize + tileGap),
+ y: gridStartY + i * (tileSize + tileGap)
+ });
+ }
+}
+// Score display
+var scoreTxt = new Text2('0', {
+ size: 80,
+ fill: 0x776E65
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+scoreTxt.y = 100;
+// Add initial tiles
+function addRandomTile() {
+ var emptyCells = [];
+ for (var i = 0; i < gridSize; i++) {
+ for (var j = 0; j < gridSize; j++) {
+ if (grid[i][j] === null) {
+ emptyCells.push({
+ x: j,
+ y: i
+ });
+ }
+ }
+ }
+ if (emptyCells.length > 0) {
+ var randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)];
+ var value = Math.random() < 0.9 ? 2 : 4;
+ var tile = new Tile(value, randomCell.x, randomCell.y);
+ tile.x = gridStartX + randomCell.x * (tileSize + tileGap);
+ tile.y = gridStartY + randomCell.y * (tileSize + tileGap);
+ grid[randomCell.y][randomCell.x] = tile;
+ tiles.push(tile);
+ game.addChild(tile);
+ // Scale animation for new tile
+ tile.scaleX = 0.1;
+ tile.scaleY = 0.1;
+ tween(tile, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.bounceOut
+ });
+ }
+}
+function checkGameWon() {
+ for (var i = 0; i < tiles.length; i++) {
+ if (tiles[i].value >= 2048 && !gameWon) {
+ gameWon = true;
+ LK.showYouWin();
+ return true;
+ }
+ }
+ return false;
+}
+function checkGameOver() {
+ // Check if grid is full
+ var fullGrid = true;
+ for (var i = 0; i < gridSize; i++) {
+ for (var j = 0; j < gridSize; j++) {
+ if (grid[i][j] === null) {
+ fullGrid = false;
+ break;
+ }
+ }
+ if (!fullGrid) break;
+ }
+ if (!fullGrid) return false;
+ // Check for possible moves
+ for (var i = 0; i < gridSize; i++) {
+ for (var j = 0; j < gridSize; j++) {
+ var currentValue = grid[i][j].value;
+ // Check right
+ if (j < gridSize - 1 && grid[i][j + 1].value === currentValue) {
+ return false;
+ }
+ // Check down
+ if (i < gridSize - 1 && grid[i + 1][j].value === currentValue) {
+ return false;
+ }
+ }
+ }
+ gameOver = true;
+ LK.showGameOver();
+ return true;
+}
+function moveTiles(direction) {
+ if (isMoving || gameOver || gameWon) return false;
+ var moved = false;
+ var score = 0;
+ // Reset merge flags
+ for (var i = 0; i < tiles.length; i++) {
+ tiles[i].hasMerged = false;
+ }
+ // Create new grid state
+ var newGrid = [];
+ for (var i = 0; i < gridSize; i++) {
+ newGrid[i] = [];
+ for (var j = 0; j < gridSize; j++) {
+ newGrid[i][j] = null;
+ }
+ }
+ if (direction === 'left') {
+ for (var i = 0; i < gridSize; i++) {
+ var row = [];
+ // Collect non-null tiles
+ for (var j = 0; j < gridSize; j++) {
+ if (grid[i][j] !== null) {
+ row.push(grid[i][j]);
+ }
+ }
+ // Merge tiles
+ for (var k = 0; k < row.length - 1; k++) {
+ if (row[k].value === row[k + 1].value && !row[k].hasMerged && !row[k + 1].hasMerged) {
+ row[k].setValue(row[k].value * 2);
+ row[k].hasMerged = true;
+ score += row[k].value;
+ // Remove merged tile
+ game.removeChild(row[k + 1]);
+ tiles.splice(tiles.indexOf(row[k + 1]), 1);
+ row.splice(k + 1, 1);
+ LK.getSound('merge').play();
+ }
+ }
+ // Place tiles in new positions
+ for (var k = 0; k < row.length; k++) {
+ if (row[k].gridX !== k || row[k].gridY !== i) {
+ moved = true;
+ }
+ row[k].gridX = k;
+ row[k].gridY = i;
+ newGrid[i][k] = row[k];
+ row[k].updatePosition();
+ }
+ }
+ } else if (direction === 'right') {
+ for (var i = 0; i < gridSize; i++) {
+ var row = [];
+ // Collect non-null tiles
+ for (var j = gridSize - 1; j >= 0; j--) {
+ if (grid[i][j] !== null) {
+ row.push(grid[i][j]);
+ }
+ }
+ // Merge tiles
+ for (var k = 0; k < row.length - 1; k++) {
+ if (row[k].value === row[k + 1].value && !row[k].hasMerged && !row[k + 1].hasMerged) {
+ row[k].setValue(row[k].value * 2);
+ row[k].hasMerged = true;
+ score += row[k].value;
+ // Remove merged tile
+ game.removeChild(row[k + 1]);
+ tiles.splice(tiles.indexOf(row[k + 1]), 1);
+ row.splice(k + 1, 1);
+ LK.getSound('merge').play();
+ }
+ }
+ // Place tiles in new positions
+ for (var k = 0; k < row.length; k++) {
+ var newX = gridSize - 1 - k;
+ if (row[k].gridX !== newX || row[k].gridY !== i) {
+ moved = true;
+ }
+ row[k].gridX = newX;
+ row[k].gridY = i;
+ newGrid[i][newX] = row[k];
+ row[k].updatePosition();
+ }
+ }
+ } else if (direction === 'up') {
+ for (var j = 0; j < gridSize; j++) {
+ var column = [];
+ // Collect non-null tiles
+ for (var i = 0; i < gridSize; i++) {
+ if (grid[i][j] !== null) {
+ column.push(grid[i][j]);
+ }
+ }
+ // Merge tiles
+ for (var k = 0; k < column.length - 1; k++) {
+ if (column[k].value === column[k + 1].value && !column[k].hasMerged && !column[k + 1].hasMerged) {
+ column[k].setValue(column[k].value * 2);
+ column[k].hasMerged = true;
+ score += column[k].value;
+ // Remove merged tile
+ game.removeChild(column[k + 1]);
+ tiles.splice(tiles.indexOf(column[k + 1]), 1);
+ column.splice(k + 1, 1);
+ LK.getSound('merge').play();
+ }
+ }
+ // Place tiles in new positions
+ for (var k = 0; k < column.length; k++) {
+ if (column[k].gridX !== j || column[k].gridY !== k) {
+ moved = true;
+ }
+ column[k].gridX = j;
+ column[k].gridY = k;
+ newGrid[k][j] = column[k];
+ column[k].updatePosition();
+ }
+ }
+ } else if (direction === 'down') {
+ for (var j = 0; j < gridSize; j++) {
+ var column = [];
+ // Collect non-null tiles
+ for (var i = gridSize - 1; i >= 0; i--) {
+ if (grid[i][j] !== null) {
+ column.push(grid[i][j]);
+ }
+ }
+ // Merge tiles
+ for (var k = 0; k < column.length - 1; k++) {
+ if (column[k].value === column[k + 1].value && !column[k].hasMerged && !column[k + 1].hasMerged) {
+ column[k].setValue(column[k].value * 2);
+ column[k].hasMerged = true;
+ score += column[k].value;
+ // Remove merged tile
+ game.removeChild(column[k + 1]);
+ tiles.splice(tiles.indexOf(column[k + 1]), 1);
+ column.splice(k + 1, 1);
+ LK.getSound('merge').play();
+ }
+ }
+ // Place tiles in new positions
+ for (var k = 0; k < column.length; k++) {
+ var newY = gridSize - 1 - k;
+ if (column[k].gridX !== j || column[k].gridY !== newY) {
+ moved = true;
+ }
+ column[k].gridX = j;
+ column[k].gridY = newY;
+ newGrid[newY][j] = column[k];
+ column[k].updatePosition();
+ }
+ }
+ }
+ grid = newGrid;
+ if (moved) {
+ LK.setScore(LK.getScore() + score);
+ scoreTxt.setText(LK.getScore());
+ LK.getSound('move').play();
+ isMoving = true;
+ LK.setTimeout(function () {
+ addRandomTile();
+ isMoving = false;
+ if (!checkGameWon()) {
+ checkGameOver();
+ }
+ }, 200);
+ }
+ return moved;
+}
+// Touch controls
+var startX = 0;
+var startY = 0;
+var isDragging = false;
+game.down = function (x, y, obj) {
+ startX = x;
+ startY = y;
+ isDragging = true;
+};
+game.up = function (x, y, obj) {
+ if (!isDragging) return;
+ var deltaX = x - startX;
+ var deltaY = y - startY;
+ var minSwipeDistance = 50;
+ if (Math.abs(deltaX) > minSwipeDistance || Math.abs(deltaY) > minSwipeDistance) {
+ if (Math.abs(deltaX) > Math.abs(deltaY)) {
+ // Horizontal swipe
+ if (deltaX > 0) {
+ moveTiles('right');
+ } else {
+ moveTiles('left');
+ }
+ } else {
+ // Vertical swipe
+ if (deltaY > 0) {
+ moveTiles('down');
+ } else {
+ moveTiles('up');
+ }
+ }
+ }
+ isDragging = false;
+};
+// Add initial tiles
+addRandomTile();
+addRandomTile();
+game.update = function () {
+ scoreTxt.setText(LK.getScore());
+};
\ No newline at end of file