/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Grid = Container.expand(function () {
var self = Container.call(this);
self.size = 4;
self.cellSize = 180;
self.gap = 15;
self.tiles = [];
// Initialize 2D array
for (var i = 0; i < self.size; i++) {
self.tiles[i] = [];
for (var j = 0; j < self.size; j++) {
self.tiles[i][j] = null;
}
}
var gridBackground = self.attachAsset('grid', {
anchorX: 0.5,
anchorY: 0.5
});
self.getCellPosition = function (x, y) {
var startX = -(self.size - 1) * (self.cellSize + self.gap) / 2;
var startY = -(self.size - 1) * (self.cellSize + self.gap) / 2;
return {
x: startX + x * (self.cellSize + self.gap),
y: startY + y * (self.cellSize + self.gap)
};
};
self.addTile = function (x, y, value) {
if (self.tiles[y][x] !== null) return null;
var tile = new Tile(value);
tile.gridX = x;
tile.gridY = y;
var pos = self.getCellPosition(x, y);
tile.x = pos.x;
tile.y = pos.y;
self.tiles[y][x] = tile;
self.addChild(tile);
return tile;
};
self.getEmptyCells = function () {
var emptyCells = [];
for (var y = 0; y < self.size; y++) {
for (var x = 0; x < self.size; x++) {
if (self.tiles[y][x] === null) {
emptyCells.push({
x: x,
y: y
});
}
}
}
return emptyCells;
};
self.addRandomTile = function () {
var emptyCells = self.getEmptyCells();
if (emptyCells.length === 0) return;
var randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)];
var value = Math.random() < 0.9 ? 2 : 4;
self.addTile(randomCell.x, randomCell.y, value);
};
self.canMove = function () {
// Check for empty cells
if (self.getEmptyCells().length > 0) return true;
// Check for possible merges
for (var y = 0; y < self.size; y++) {
for (var x = 0; x < self.size; x++) {
var tile = self.tiles[y][x];
if (tile !== null) {
// Check right
if (x < self.size - 1 && self.tiles[y][x + 1] !== null && self.tiles[y][x + 1].value === tile.value) {
return true;
}
// Check down
if (y < self.size - 1 && self.tiles[y + 1][x] !== null && self.tiles[y + 1][x].value === tile.value) {
return true;
}
}
}
}
return false;
};
self.moveTiles = function (direction) {
var moved = false;
var merged = [];
// Reset merged flags
for (var y = 0; y < self.size; y++) {
for (var x = 0; x < self.size; x++) {
if (self.tiles[y][x] !== null) {
self.tiles[y][x].merged = false;
}
}
}
if (direction === 'left') {
for (var y = 0; y < self.size; y++) {
for (var x = 1; x < self.size; x++) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newX = x;
// Move as far left as possible
while (newX > 0 && self.tiles[y][newX - 1] === null) {
newX--;
}
// Check for merge
if (newX > 0 && self.tiles[y][newX - 1] !== null && self.tiles[y][newX - 1].value === currentTile.value && !self.tiles[y][newX - 1].merged) {
// Merge
self.tiles[y][newX - 1].value *= 2;
self.tiles[y][newX - 1].merged = true;
self.tiles[y][newX - 1].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[y][newX - 1].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[y][newX - 1].value === 2048) {
hasWon = true;
}
} else if (newX !== x) {
// Just move
self.tiles[y][newX] = currentTile;
self.tiles[y][x] = null;
currentTile.gridX = newX;
var pos = self.getCellPosition(newX, y);
tween(currentTile, {
x: pos.x
}, {
duration: 150
});
moved = true;
}
}
}
}
} else if (direction === 'right') {
for (var y = 0; y < self.size; y++) {
for (var x = self.size - 2; x >= 0; x--) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newX = x;
while (newX < self.size - 1 && self.tiles[y][newX + 1] === null) {
newX++;
}
if (newX < self.size - 1 && self.tiles[y][newX + 1] !== null && self.tiles[y][newX + 1].value === currentTile.value && !self.tiles[y][newX + 1].merged) {
self.tiles[y][newX + 1].value *= 2;
self.tiles[y][newX + 1].merged = true;
self.tiles[y][newX + 1].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[y][newX + 1].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[y][newX + 1].value === 2048) {
hasWon = true;
}
} else if (newX !== x) {
self.tiles[y][newX] = currentTile;
self.tiles[y][x] = null;
currentTile.gridX = newX;
var pos = self.getCellPosition(newX, y);
tween(currentTile, {
x: pos.x
}, {
duration: 150
});
moved = true;
}
}
}
}
} else if (direction === 'up') {
for (var x = 0; x < self.size; x++) {
for (var y = 1; y < self.size; y++) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newY = y;
while (newY > 0 && self.tiles[newY - 1][x] === null) {
newY--;
}
if (newY > 0 && self.tiles[newY - 1][x] !== null && self.tiles[newY - 1][x].value === currentTile.value && !self.tiles[newY - 1][x].merged) {
self.tiles[newY - 1][x].value *= 2;
self.tiles[newY - 1][x].merged = true;
self.tiles[newY - 1][x].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[newY - 1][x].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[newY - 1][x].value === 2048) {
hasWon = true;
}
} else if (newY !== y) {
self.tiles[newY][x] = currentTile;
self.tiles[y][x] = null;
currentTile.gridY = newY;
var pos = self.getCellPosition(x, newY);
tween(currentTile, {
y: pos.y
}, {
duration: 150
});
moved = true;
}
}
}
}
} else if (direction === 'down') {
for (var x = 0; x < self.size; x++) {
for (var y = self.size - 2; y >= 0; y--) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newY = y;
while (newY < self.size - 1 && self.tiles[newY + 1][x] === null) {
newY++;
}
if (newY < self.size - 1 && self.tiles[newY + 1][x] !== null && self.tiles[newY + 1][x].value === currentTile.value && !self.tiles[newY + 1][x].merged) {
self.tiles[newY + 1][x].value *= 2;
self.tiles[newY + 1][x].merged = true;
self.tiles[newY + 1][x].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[newY + 1][x].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[newY + 1][x].value === 2048) {
hasWon = true;
}
} else if (newY !== y) {
self.tiles[newY][x] = currentTile;
self.tiles[y][x] = null;
currentTile.gridY = newY;
var pos = self.getCellPosition(x, newY);
tween(currentTile, {
y: pos.y
}, {
duration: 150
});
moved = true;
}
}
}
}
}
return moved;
};
return self;
});
var Tile = Container.expand(function (value) {
var self = Container.call(this);
self.value = value || 2;
self.gridX = 0;
self.gridY = 0;
self.merged = false;
var tileBackground = self.attachAsset('tile', {
anchorX: 0.5,
anchorY: 0.5
});
var valueText = new Text2(self.value.toString(), {
size: 90,
fill: 0x000000
});
valueText.anchor.set(0.5, 0.5);
// Add text outline for better readability
var outlineText = new Text2(self.value.toString(), {
size: 90,
fill: 0x000000,
stroke: 0xFFFFFF,
strokeThickness: 4
});
outlineText.anchor.set(0.5, 0.5);
outlineText.alpha = 0.7;
self.addChild(outlineText);
self.addChild(valueText);
// Store reference to outline text for updates
self.outlineText = outlineText;
self.updateAppearance = function () {
valueText.setText(self.value.toString());
if (self.outlineText) {
self.outlineText.setText(self.value.toString());
}
// Color based on value
var colors = {
2: 0xEEE4DA,
4: 0xEDE0C8,
8: 0xF2B179,
16: 0xF59563,
32: 0xF67C5F,
64: 0xF65E3B,
128: 0xEDCF72,
256: 0xEDCC61,
512: 0xEDC850,
1024: 0xEDC53F,
2048: 0xEDC22E
};
var color = colors[self.value] || 0x3C3A32;
tileBackground.tint = color;
if (self.value <= 4) {
valueText.fill = "#000000"; // Black for light tiles
} else if (self.value >= 8 && self.value < 128) {
valueText.fill = "#FFFFFF"; // White for medium tiles
} else {
valueText.fill = "#FFFFFF"; // White for dark tiles
}
};
self.updateAppearance();
return self;
});
var WoodenFloor = Container.expand(function () {
var self = Container.call(this);
var plankHeight = 120;
var totalPlanks = Math.ceil(2732 / plankHeight) + 1;
for (var i = 0; i < totalPlanks; i++) {
// Create main plank
var plank = self.attachAsset('woodPlank', {
anchorX: 0,
anchorY: 0
});
plank.x = 0;
plank.y = i * plankHeight;
// Alternate plank colors for variation
var plankColors = [0x8B4513, 0x964B00, 0xA0522D, 0x8B4513];
plank.tint = plankColors[i % plankColors.length];
// Add grain lines on each plank
for (var j = 0; j < 3; j++) {
var grain = self.attachAsset('woodGrain', {
anchorX: 0,
anchorY: 0
});
grain.x = 0;
grain.y = i * plankHeight + 20 + j * 30;
grain.alpha = 0.3;
}
// Add wood knots randomly
if (Math.random() < 0.4) {
var knot = self.attachAsset('woodKnot', {
anchorX: 0.5,
anchorY: 0.5
});
knot.x = Math.random() * 1800 + 124;
knot.y = i * plankHeight + plankHeight / 2;
knot.alpha = 0.6;
}
// Add plank separation line
if (i > 0) {
var separation = self.attachAsset('woodGrain', {
anchorX: 0,
anchorY: 0
});
separation.x = 0;
separation.y = i * plankHeight - 4;
separation.tint = 0x3E2723;
separation.alpha = 0.8;
}
}
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFAF8EF
});
/****
* Game Code
****/
var grid;
var scoreTxt;
var hasWon = false;
var gameOver = false;
var startX = 0;
var startY = 0;
var isDragging = false;
var minSwipeDistance = 50;
var woodenFloor;
// Create wooden floor background
woodenFloor = game.addChild(new WoodenFloor());
woodenFloor.x = 0;
woodenFloor.y = 0;
// Create grid
grid = game.addChild(new Grid());
grid.x = 2048 / 2;
grid.y = 2732 / 2 - 200;
// Create score display
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0x776E65
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 150;
// Add initial tiles
grid.addRandomTile();
grid.addRandomTile();
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
function handleSwipe(direction) {
if (gameOver) return;
var moved = grid.moveTiles(direction);
if (moved) {
updateScore();
LK.setTimeout(function () {
grid.addRandomTile();
if (hasWon) {
LK.showYouWin();
return;
}
if (!grid.canMove()) {
gameOver = true;
LK.showGameOver();
}
}, 200);
}
}
game.down = function (x, y, obj) {
startX = x;
startY = y;
isDragging = true;
};
game.up = function (x, y, obj) {
if (!isDragging) return;
isDragging = false;
var deltaX = x - startX;
var deltaY = y - startY;
var absX = Math.abs(deltaX);
var absY = Math.abs(deltaY);
if (Math.max(absX, absY) < minSwipeDistance) return;
if (absX > absY) {
// Horizontal swipe
if (deltaX > 0) {
handleSwipe('right');
} else {
handleSwipe('left');
}
} else {
// Vertical swipe
if (deltaY > 0) {
handleSwipe('down');
} else {
handleSwipe('up');
}
}
};
game.update = function () {
// Game loop runs here
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Grid = Container.expand(function () {
var self = Container.call(this);
self.size = 4;
self.cellSize = 180;
self.gap = 15;
self.tiles = [];
// Initialize 2D array
for (var i = 0; i < self.size; i++) {
self.tiles[i] = [];
for (var j = 0; j < self.size; j++) {
self.tiles[i][j] = null;
}
}
var gridBackground = self.attachAsset('grid', {
anchorX: 0.5,
anchorY: 0.5
});
self.getCellPosition = function (x, y) {
var startX = -(self.size - 1) * (self.cellSize + self.gap) / 2;
var startY = -(self.size - 1) * (self.cellSize + self.gap) / 2;
return {
x: startX + x * (self.cellSize + self.gap),
y: startY + y * (self.cellSize + self.gap)
};
};
self.addTile = function (x, y, value) {
if (self.tiles[y][x] !== null) return null;
var tile = new Tile(value);
tile.gridX = x;
tile.gridY = y;
var pos = self.getCellPosition(x, y);
tile.x = pos.x;
tile.y = pos.y;
self.tiles[y][x] = tile;
self.addChild(tile);
return tile;
};
self.getEmptyCells = function () {
var emptyCells = [];
for (var y = 0; y < self.size; y++) {
for (var x = 0; x < self.size; x++) {
if (self.tiles[y][x] === null) {
emptyCells.push({
x: x,
y: y
});
}
}
}
return emptyCells;
};
self.addRandomTile = function () {
var emptyCells = self.getEmptyCells();
if (emptyCells.length === 0) return;
var randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)];
var value = Math.random() < 0.9 ? 2 : 4;
self.addTile(randomCell.x, randomCell.y, value);
};
self.canMove = function () {
// Check for empty cells
if (self.getEmptyCells().length > 0) return true;
// Check for possible merges
for (var y = 0; y < self.size; y++) {
for (var x = 0; x < self.size; x++) {
var tile = self.tiles[y][x];
if (tile !== null) {
// Check right
if (x < self.size - 1 && self.tiles[y][x + 1] !== null && self.tiles[y][x + 1].value === tile.value) {
return true;
}
// Check down
if (y < self.size - 1 && self.tiles[y + 1][x] !== null && self.tiles[y + 1][x].value === tile.value) {
return true;
}
}
}
}
return false;
};
self.moveTiles = function (direction) {
var moved = false;
var merged = [];
// Reset merged flags
for (var y = 0; y < self.size; y++) {
for (var x = 0; x < self.size; x++) {
if (self.tiles[y][x] !== null) {
self.tiles[y][x].merged = false;
}
}
}
if (direction === 'left') {
for (var y = 0; y < self.size; y++) {
for (var x = 1; x < self.size; x++) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newX = x;
// Move as far left as possible
while (newX > 0 && self.tiles[y][newX - 1] === null) {
newX--;
}
// Check for merge
if (newX > 0 && self.tiles[y][newX - 1] !== null && self.tiles[y][newX - 1].value === currentTile.value && !self.tiles[y][newX - 1].merged) {
// Merge
self.tiles[y][newX - 1].value *= 2;
self.tiles[y][newX - 1].merged = true;
self.tiles[y][newX - 1].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[y][newX - 1].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[y][newX - 1].value === 2048) {
hasWon = true;
}
} else if (newX !== x) {
// Just move
self.tiles[y][newX] = currentTile;
self.tiles[y][x] = null;
currentTile.gridX = newX;
var pos = self.getCellPosition(newX, y);
tween(currentTile, {
x: pos.x
}, {
duration: 150
});
moved = true;
}
}
}
}
} else if (direction === 'right') {
for (var y = 0; y < self.size; y++) {
for (var x = self.size - 2; x >= 0; x--) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newX = x;
while (newX < self.size - 1 && self.tiles[y][newX + 1] === null) {
newX++;
}
if (newX < self.size - 1 && self.tiles[y][newX + 1] !== null && self.tiles[y][newX + 1].value === currentTile.value && !self.tiles[y][newX + 1].merged) {
self.tiles[y][newX + 1].value *= 2;
self.tiles[y][newX + 1].merged = true;
self.tiles[y][newX + 1].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[y][newX + 1].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[y][newX + 1].value === 2048) {
hasWon = true;
}
} else if (newX !== x) {
self.tiles[y][newX] = currentTile;
self.tiles[y][x] = null;
currentTile.gridX = newX;
var pos = self.getCellPosition(newX, y);
tween(currentTile, {
x: pos.x
}, {
duration: 150
});
moved = true;
}
}
}
}
} else if (direction === 'up') {
for (var x = 0; x < self.size; x++) {
for (var y = 1; y < self.size; y++) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newY = y;
while (newY > 0 && self.tiles[newY - 1][x] === null) {
newY--;
}
if (newY > 0 && self.tiles[newY - 1][x] !== null && self.tiles[newY - 1][x].value === currentTile.value && !self.tiles[newY - 1][x].merged) {
self.tiles[newY - 1][x].value *= 2;
self.tiles[newY - 1][x].merged = true;
self.tiles[newY - 1][x].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[newY - 1][x].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[newY - 1][x].value === 2048) {
hasWon = true;
}
} else if (newY !== y) {
self.tiles[newY][x] = currentTile;
self.tiles[y][x] = null;
currentTile.gridY = newY;
var pos = self.getCellPosition(x, newY);
tween(currentTile, {
y: pos.y
}, {
duration: 150
});
moved = true;
}
}
}
}
} else if (direction === 'down') {
for (var x = 0; x < self.size; x++) {
for (var y = self.size - 2; y >= 0; y--) {
if (self.tiles[y][x] !== null) {
var currentTile = self.tiles[y][x];
var newY = y;
while (newY < self.size - 1 && self.tiles[newY + 1][x] === null) {
newY++;
}
if (newY < self.size - 1 && self.tiles[newY + 1][x] !== null && self.tiles[newY + 1][x].value === currentTile.value && !self.tiles[newY + 1][x].merged) {
self.tiles[newY + 1][x].value *= 2;
self.tiles[newY + 1][x].merged = true;
self.tiles[newY + 1][x].updateAppearance();
LK.setScore(LK.getScore() + self.tiles[newY + 1][x].value);
currentTile.destroy();
self.tiles[y][x] = null;
moved = true;
if (self.tiles[newY + 1][x].value === 2048) {
hasWon = true;
}
} else if (newY !== y) {
self.tiles[newY][x] = currentTile;
self.tiles[y][x] = null;
currentTile.gridY = newY;
var pos = self.getCellPosition(x, newY);
tween(currentTile, {
y: pos.y
}, {
duration: 150
});
moved = true;
}
}
}
}
}
return moved;
};
return self;
});
var Tile = Container.expand(function (value) {
var self = Container.call(this);
self.value = value || 2;
self.gridX = 0;
self.gridY = 0;
self.merged = false;
var tileBackground = self.attachAsset('tile', {
anchorX: 0.5,
anchorY: 0.5
});
var valueText = new Text2(self.value.toString(), {
size: 90,
fill: 0x000000
});
valueText.anchor.set(0.5, 0.5);
// Add text outline for better readability
var outlineText = new Text2(self.value.toString(), {
size: 90,
fill: 0x000000,
stroke: 0xFFFFFF,
strokeThickness: 4
});
outlineText.anchor.set(0.5, 0.5);
outlineText.alpha = 0.7;
self.addChild(outlineText);
self.addChild(valueText);
// Store reference to outline text for updates
self.outlineText = outlineText;
self.updateAppearance = function () {
valueText.setText(self.value.toString());
if (self.outlineText) {
self.outlineText.setText(self.value.toString());
}
// Color based on value
var colors = {
2: 0xEEE4DA,
4: 0xEDE0C8,
8: 0xF2B179,
16: 0xF59563,
32: 0xF67C5F,
64: 0xF65E3B,
128: 0xEDCF72,
256: 0xEDCC61,
512: 0xEDC850,
1024: 0xEDC53F,
2048: 0xEDC22E
};
var color = colors[self.value] || 0x3C3A32;
tileBackground.tint = color;
if (self.value <= 4) {
valueText.fill = "#000000"; // Black for light tiles
} else if (self.value >= 8 && self.value < 128) {
valueText.fill = "#FFFFFF"; // White for medium tiles
} else {
valueText.fill = "#FFFFFF"; // White for dark tiles
}
};
self.updateAppearance();
return self;
});
var WoodenFloor = Container.expand(function () {
var self = Container.call(this);
var plankHeight = 120;
var totalPlanks = Math.ceil(2732 / plankHeight) + 1;
for (var i = 0; i < totalPlanks; i++) {
// Create main plank
var plank = self.attachAsset('woodPlank', {
anchorX: 0,
anchorY: 0
});
plank.x = 0;
plank.y = i * plankHeight;
// Alternate plank colors for variation
var plankColors = [0x8B4513, 0x964B00, 0xA0522D, 0x8B4513];
plank.tint = plankColors[i % plankColors.length];
// Add grain lines on each plank
for (var j = 0; j < 3; j++) {
var grain = self.attachAsset('woodGrain', {
anchorX: 0,
anchorY: 0
});
grain.x = 0;
grain.y = i * plankHeight + 20 + j * 30;
grain.alpha = 0.3;
}
// Add wood knots randomly
if (Math.random() < 0.4) {
var knot = self.attachAsset('woodKnot', {
anchorX: 0.5,
anchorY: 0.5
});
knot.x = Math.random() * 1800 + 124;
knot.y = i * plankHeight + plankHeight / 2;
knot.alpha = 0.6;
}
// Add plank separation line
if (i > 0) {
var separation = self.attachAsset('woodGrain', {
anchorX: 0,
anchorY: 0
});
separation.x = 0;
separation.y = i * plankHeight - 4;
separation.tint = 0x3E2723;
separation.alpha = 0.8;
}
}
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFAF8EF
});
/****
* Game Code
****/
var grid;
var scoreTxt;
var hasWon = false;
var gameOver = false;
var startX = 0;
var startY = 0;
var isDragging = false;
var minSwipeDistance = 50;
var woodenFloor;
// Create wooden floor background
woodenFloor = game.addChild(new WoodenFloor());
woodenFloor.x = 0;
woodenFloor.y = 0;
// Create grid
grid = game.addChild(new Grid());
grid.x = 2048 / 2;
grid.y = 2732 / 2 - 200;
// Create score display
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0x776E65
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 150;
// Add initial tiles
grid.addRandomTile();
grid.addRandomTile();
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
function handleSwipe(direction) {
if (gameOver) return;
var moved = grid.moveTiles(direction);
if (moved) {
updateScore();
LK.setTimeout(function () {
grid.addRandomTile();
if (hasWon) {
LK.showYouWin();
return;
}
if (!grid.canMove()) {
gameOver = true;
LK.showGameOver();
}
}, 200);
}
}
game.down = function (x, y, obj) {
startX = x;
startY = y;
isDragging = true;
};
game.up = function (x, y, obj) {
if (!isDragging) return;
isDragging = false;
var deltaX = x - startX;
var deltaY = y - startY;
var absX = Math.abs(deltaX);
var absY = Math.abs(deltaY);
if (Math.max(absX, absY) < minSwipeDistance) return;
if (absX > absY) {
// Horizontal swipe
if (deltaX > 0) {
handleSwipe('right');
} else {
handleSwipe('left');
}
} else {
// Vertical swipe
if (deltaY > 0) {
handleSwipe('down');
} else {
handleSwipe('up');
}
}
};
game.update = function () {
// Game loop runs here
};