Code edit (1 edits merged)
Please save this source code
User prompt
move score 10 pixels left
User prompt
move score 10 pixels left
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in this line: 'scoreTxt.x = gridContainer.x + totalGridWidth / 2;' Line Number: 99
User prompt
aligns score inthe same y but centered with grid on the x axis
User prompt
moves core 5 pixels right
User prompt
moves score 10 pixels right
User prompt
move score 20 pixels left
Code edit (6 edits merged)
Please save this source code
User prompt
moves score 100 pixels right
User prompt
dont show the word score on score in the game. only show the number
Code edit (1 edits merged)
Please save this source code
User prompt
moves score 100 pixels to the left
User prompt
show score in the top center of the game on tick
User prompt
change score color to black
User prompt
create an asset for color background. color backrodung should be white
User prompt
add LK.setScore(score);
Code edit (1 edits merged)
Please save this source code
User prompt
add score to the game. score will be 10 per exploded cell
Code edit (2 edits merged)
Please save this source code
User prompt
add check to always explode the needed cells on up event
Code edit (4 edits merged)
Please save this source code
User prompt
do not allow obliqutos connections
User prompt
reduce in 1 the diferent cell colors
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'y')' in this line: 'scoreTxt.y = gridContainer.y - scoreTxt.height / 2;' Line Number: 95
var Particle = Container.expand(function (tint) {
var self = Container.call(this);
self.tint = tint;
var particleGraphics = self.createAsset('particle', 'Particle Graphics', 0.5, 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();
};
});
var Cell = Container.expand(function (type) {
var self = Container.call(this);
var cellGraphics = self.createAsset('cell', 'Grid Cell', .5, .5);
self.targetX = 0;
self.targetY = 0;
self.isMoving = false;
self.totalTypes = 5;
self.type = type || Math.floor(Math.random() * self.totalTypes);
var hue = self.type / self.totalTypes;
var color = hsvToRgb(hue, 1, 1);
cellGraphics.tint = color;
self.move = function (x, y, instant) {
self.targetX = x;
self.targetY = y;
if (instant) {
self.x = x;
self.y = y;
}
};
self.tick = function () {
var acceleration = 1;
self.speedX = self.speedX || 0;
self.speedY = self.speedY || 0;
var threshold = 1;
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
if (Math.abs(dx) < threshold && Math.abs(dy) < threshold) {
self.x = self.targetX;
self.y = self.targetY;
self.isMoving = false;
self.speedX = 0;
self.speedY = 0;
} else {
if (dx !== 0) {
self.speedX += dx > 0 ? acceleration : -acceleration;
}
if (dy !== 0) {
self.speedY += dy > 0 ? acceleration : -acceleration;
}
var nextX = self.x + self.speedX;
var nextY = self.y + self.speedY;
if (self.speedX > 0 && nextX > self.targetX || self.speedX < 0 && nextX < self.targetX) {
nextX = self.targetX;
self.speedX = 0;
}
if (self.speedY > 0 && nextY > self.targetY || self.speedY < 0 && nextY < self.targetY) {
nextY = self.targetY;
self.speedY = 0;
}
self.x = nextX;
self.y = nextY;
self.isMoving = self.x !== self.targetX || self.y !== self.targetY;
}
};
});
function hsvToRgb(h, s, v) {
var i = Math.floor(h * 6), f = h * 6 - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s), mod = i % 6, r = [v, q, p, p, t, v][mod], g = [t, v, v, q, p, p][mod], b = [p, p, t, v, v, q][mod];
return (r * 255 << 16) + (g * 255 << 8) + b * 255;
}
var Game = Container.expand(function () {
var self = Container.call(this);
LK.stageContainer.setBackgroundColor(0xFFFFFF);
var selectedCells = [];
var score = 0;
var scoreTxt = new Text2(score.toString(), {
size: 150,
fill: "#000000",
anchor: {
x: 0.5,
y: 0
}
});
scoreTxt.x = 2048 / 2;
if (gridContainer) {
scoreTxt.y = gridContainer.y - scoreTxt.height / 2;
} else {
scoreTxt.y = 2732 / 2 - scoreTxt.height / 2;
}
self.addChild(scoreTxt);
var selectedCellsCountTxt = new Text2('Selected Cells: 0', {
size: 150,
fill: "#ffffff",
anchor: {
x: 0.5,
y: 0
}
});
self.particles = [];
self.spawnParticles = function (x, y, color) {
for (var i = 0; i < 10; i++) {
var particle = new Particle(color);
particle.x = gridContainer.x + x;
particle.y = gridContainer.y + y;
particle.tint = color;
self.particles.push(particle);
self.addChild(particle);
}
};
self.checkMovesAllowed = function () {
for (var i = 0; i < gridWidth; i++) {
for (var j = 0; j < gridHeight; j++) {
var cell = grid[i][j];
if (cell) {
var neighbors = self.findConnectedNeighbors(cell);
if (neighbors.length > 1) {
return true;
}
}
}
}
return false;
};
var gridWidth = 5;
var gridHeight = 5;
var gridSpacing = 8;
var tempCell = new Cell();
var cellWidth = tempCell.width;
var cellHeight = tempCell.height;
tempCell.destroy();
var gridContainer = new Container();
self.addChild(gridContainer);
var totalGridWidth = gridWidth * (cellWidth + gridSpacing) - gridSpacing;
var totalGridHeight = gridHeight * (cellHeight + gridSpacing) - gridSpacing;
gridContainer.x = (2048 - totalGridWidth) / 2 + cellWidth / 2;
gridContainer.y = (2732 - totalGridHeight) / 2 + cellHeight / 2;
self.calculateTargetPosition = function (col, row) {
return {
x: col * (cellWidth + gridSpacing),
y: row * (cellHeight + gridSpacing)
};
};
self.findConnectedNeighbors = function (cell, connectedNeighbors) {
connectedNeighbors = connectedNeighbors || [];
if (!cell) return [];
var cellType = cell.type;
var cellColRow = self.findCellColRow(cell);
if (cellColRow) {
var directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
directions.forEach(function (dir) {
var newRow = cellColRow.row + dir[0];
var newCol = cellColRow.col + dir[1];
if (newRow >= 0 && newRow < gridHeight && newCol >= 0 && newCol < gridWidth) {
var neighborCell = grid[newCol][newRow];
if (neighborCell && neighborCell.type === cellType && connectedNeighbors.indexOf(neighborCell) === -1) {
connectedNeighbors.push(neighborCell);
self.findConnectedNeighbors(neighborCell, connectedNeighbors);
}
}
});
}
return connectedNeighbors;
};
self.findCellColRow = function (cell) {
for (var col = 0; col < gridWidth; col++) {
for (var row = 0; row < gridHeight; row++) {
if (grid[col][row] === cell) {
return {
col: col,
row: row
};
}
}
}
return null;
};
self.deleteCell = function (cell) {
var colRow = self.findCellColRow(cell);
if (colRow) {
grid[colRow.col][colRow.row] = null;
var hue = cell.type / cell.totalTypes;
var color = hsvToRgb(hue, 1, 1);
self.spawnParticles(cell.x, cell.y, color);
cell.destroy();
self.moveToEmptySpace();
}
};
self.attachCellListeners = function (cell) {
var dragStartCell = null;
self.resetSelectedCells = function () {
selectedCells.forEach(function (cell) {
cell.alpha = 1;
});
self.resetSelectedCells = function () {
selectedCells.forEach(function (cell) {
cell.alpha = 1;
});
selectedCells = [];
};
selectedCells = [];
};
cell.on('down', function (obj) {
dragStartCell = cell;
selectedCells.push(cell);
cell.alpha = 0.5;
});
cell.on('move', function (obj) {
if (dragStartCell) {
var pos = obj.event.getLocalPosition(gridContainer);
var col = Math.floor((pos.x + cellWidth / 2) / (cellWidth + gridSpacing));
var row = Math.floor((pos.y + cellHeight / 2) / (cellHeight + gridSpacing));
if (col >= 0 && col < gridWidth && row >= 0 && row < gridHeight) {
var targetCell = grid[col][row];
if (targetCell && selectedCells.indexOf(targetCell) === -1) {
var lastCell = selectedCells[selectedCells.length - 1];
var lastCellPos = self.findCellColRow(lastCell);
var targetCellPos = self.findCellColRow(targetCell);
if (Math.abs(lastCellPos.col - targetCellPos.col) + Math.abs(lastCellPos.row - targetCellPos.row) === 1) {
if (targetCell.type === dragStartCell.type) {
targetCell.alpha = 0.5;
selectedCells.push(targetCell);
} else {
self.resetSelectedCells();
dragStartCell = null;
}
}
}
}
}
});
cell.on('up', function (obj) {
if (selectedCells.length >= 4) {
var targetType = dragStartCell ? dragStartCell.type : null;
for (var col = 0; col < gridWidth; col++) {
for (var row = 0; row < gridHeight; row++) {
var cell = grid[col][row];
if (cell && cell.type === targetType) {
self.deleteCell(cell);
}
}
}
} else if (selectedCells.length > 1) {
selectedCells.forEach(function (cell) {
self.deleteCell(cell);
});
}
selectedCells.forEach(function (cell) {
cell.alpha = 1;
});
selectedCells = [];
dragStartCell = null;
});
};
var grid = [];
for (var i = 0; i < gridWidth; i++) {
grid[i] = [];
for (var j = 0; j < gridHeight; j++) {
var cell = new Cell();
var targetPos = self.calculateTargetPosition(i, j);
cell.move(targetPos.x, targetPos.y, true);
self.attachCellListeners(cell);
grid[i][j] = cell;
gridContainer.addChild(cell);
}
}
self.moveToEmptySpace = function () {
var moved;
do {
moved = false;
for (var col = 0; col < gridWidth; col++) {
for (var row = gridHeight - 2; row >= 0; row--) {
if (grid[col][row] && !grid[col][row + 1]) {
var targetCell = grid[col][row];
var targetPos = self.calculateTargetPosition(col, row + 1);
targetCell.move(targetPos.x, targetPos.y);
grid[col][row + 1] = targetCell;
grid[col][row] = null;
moved = true;
}
}
}
} while (moved);
for (var col = 0; col < gridWidth; col++) {
if (!grid[col][0]) {
var newCell = new Cell();
var targetPos = self.calculateTargetPosition(col, 0);
newCell.x = targetPos.x;
newCell.y = targetPos.y - cellHeight - 200;
newCell.move(targetPos.x, targetPos.y);
self.attachCellListeners(newCell);
grid[col][0] = newCell;
gridContainer.addChildAt(newCell, 0);
self.moveToEmptySpace();
}
}
};
LK.on('tick', function () {
for (var i = 0; i < gridWidth; i++) {
for (var j = 0; j < gridHeight; j++) {
if (grid[i][j]) grid[i][j].tick();
}
}
for (var i = self.particles.length - 1; i >= 0; i--) {
var particle = self.particles[i];
particle.tick();
if (particle.lifeSpan <= 0) {
particle.destroy();
self.particles.splice(i, 1);
}
}
selectedCellsCountTxt.setText('Selected Cells: ' + selectedCells.length);
if (!self.checkMovesAllowed()) {
if (!self.gameOverTimeout) {
self.gameOverTimeout = LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
} else {
if (self.gameOverTimeout) {
LK.clearTimeout(self.gameOverTimeout);
self.gameOverTimeout = null;
}
}
});
});