/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Food = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('food', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'speed';
var assetName = 'powerUpSpeed';
if (type === 'shield') assetName = 'powerUpShield';else if (type === 'multiplier') assetName = 'powerUpMultiplier';else if (type === 'shrink') assetName = 'powerUpShrink';
var graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.rotation += 0.1;
};
return self;
});
var SnakeHead = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('snakeHead', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var SnakeSegment = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('snakeSegment', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
var GRID_SIZE = 40;
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var COLS = Math.floor(GAME_WIDTH / GRID_SIZE);
var ROWS = Math.floor(GAME_HEIGHT / GRID_SIZE);
var snake = [];
var direction = {
x: 1,
y: 0
};
var nextDirection = {
x: 1,
y: 0
};
var food = null;
var powerUps = [];
var gameSpeed = 150;
var baseSpeed = 150;
var lastMoveTime = 0;
var score = 0;
var highScore = storage.highScore || 0;
var multiplier = 1;
var shieldActive = false;
var speedBoostActive = false;
var powerUpTimers = {};
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 120;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var highScoreTxt = new Text2('Best: ' + highScore, {
size: 40,
fill: 0xCCCCCC
});
highScoreTxt.anchor.set(0, 0);
highScoreTxt.x = 120;
highScoreTxt.y = 120;
LK.gui.topLeft.addChild(highScoreTxt);
var multiplierTxt = new Text2('', {
size: 50,
fill: 0xFFD700
});
multiplierTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(multiplierTxt);
// Initialize snake
function initializeSnake() {
// Clear existing snake
for (var i = 0; i < snake.length; i++) {
if (snake[i]) {
snake[i].destroy();
}
}
snake = [];
// Create initial snake
var startX = Math.floor(COLS / 2);
var startY = Math.floor(ROWS / 2);
for (var i = 0; i < 3; i++) {
var segment;
if (i === 0) {
segment = new SnakeHead();
} else {
segment = new SnakeSegment();
}
segment.gridX = startX - i;
segment.gridY = startY;
segment.x = segment.gridX * GRID_SIZE + GRID_SIZE / 2;
segment.y = segment.gridY * GRID_SIZE + GRID_SIZE / 2;
snake.push(segment);
game.addChild(segment);
}
}
function spawnFood() {
if (food) {
food.destroy();
}
var validPositions = [];
for (var x = 0; x < COLS; x++) {
for (var y = 0; y < ROWS; y++) {
var occupied = false;
for (var i = 0; i < snake.length; i++) {
if (snake[i].gridX === x && snake[i].gridY === y) {
occupied = true;
break;
}
}
if (!occupied) {
validPositions.push({
x: x,
y: y
});
}
}
}
if (validPositions.length > 0) {
var pos = validPositions[Math.floor(Math.random() * validPositions.length)];
food = new Food();
food.gridX = pos.x;
food.gridY = pos.y;
food.x = pos.x * GRID_SIZE + GRID_SIZE / 2;
food.y = pos.y * GRID_SIZE + GRID_SIZE / 2;
game.addChild(food);
}
}
function spawnPowerUp() {
if (Math.random() < 0.3) {
var types = ['speed', 'shield', 'multiplier', 'shrink'];
var type = types[Math.floor(Math.random() * types.length)];
var validPositions = [];
for (var x = 0; x < COLS; x++) {
for (var y = 0; y < ROWS; y++) {
var occupied = false;
for (var i = 0; i < snake.length; i++) {
if (snake[i].gridX === x && snake[i].gridY === y) {
occupied = true;
break;
}
}
if (!occupied && !(food && food.gridX === x && food.gridY === y)) {
validPositions.push({
x: x,
y: y
});
}
}
}
if (validPositions.length > 0) {
var pos = validPositions[Math.floor(Math.random() * validPositions.length)];
var powerUp = new PowerUp(type);
powerUp.gridX = pos.x;
powerUp.gridY = pos.y;
powerUp.x = pos.x * GRID_SIZE + GRID_SIZE / 2;
powerUp.y = pos.y * GRID_SIZE + GRID_SIZE / 2;
powerUps.push(powerUp);
game.addChild(powerUp);
}
}
}
function moveSnake() {
direction = {
x: nextDirection.x,
y: nextDirection.y
};
var head = snake[0];
var newX = head.gridX + direction.x;
var newY = head.gridY + direction.y;
// Check wall collision
if (newX < 0 || newX >= COLS || newY < 0 || newY >= ROWS) {
if (!shieldActive) {
gameOver();
return;
}
}
// Check self collision
for (var i = 1; i < snake.length; i++) {
if (snake[i].gridX === newX && snake[i].gridY === newY) {
if (!shieldActive) {
gameOver();
return;
}
}
}
// Wrap around if shield is active
if (shieldActive) {
if (newX < 0) newX = COLS - 1;
if (newX >= COLS) newX = 0;
if (newY < 0) newY = ROWS - 1;
if (newY >= ROWS) newY = 0;
}
// Check food collision
var ateFood = false;
if (food && newX === food.gridX && newY === food.gridY) {
ateFood = true;
score += 10 * multiplier;
updateScore();
LK.getSound('eat').play();
spawnFood();
spawnPowerUp();
}
// Check power-up collision
for (var p = powerUps.length - 1; p >= 0; p--) {
var powerUp = powerUps[p];
if (powerUp.gridX === newX && powerUp.gridY === newY) {
activatePowerUp(powerUp.type);
powerUp.destroy();
powerUps.splice(p, 1);
LK.getSound('powerup').play();
break;
}
}
// Move snake
if (!ateFood) {
var tail = snake.pop();
tail.destroy();
}
var newHead = new SnakeHead();
newHead.gridX = newX;
newHead.gridY = newY;
newHead.x = newX * GRID_SIZE + GRID_SIZE / 2;
newHead.y = newY * GRID_SIZE + GRID_SIZE / 2;
// Convert old head to body segment
if (snake.length > 0) {
var oldHead = snake[0];
oldHead.removeChildren();
oldHead.attachAsset('snakeSegment', {
anchorX: 0.5,
anchorY: 0.5
});
}
snake.unshift(newHead);
game.addChild(newHead);
// Update speed based on score
var speedLevel = Math.floor(score / 100);
gameSpeed = Math.max(80, baseSpeed - speedLevel * 10);
if (speedBoostActive) {
gameSpeed = Math.floor(gameSpeed * 0.6);
}
}
function activatePowerUp(type) {
if (type === 'speed') {
speedBoostActive = true;
if (powerUpTimers.speed) {
LK.clearTimeout(powerUpTimers.speed);
}
powerUpTimers.speed = LK.setTimeout(function () {
speedBoostActive = false;
}, 5000);
} else if (type === 'shield') {
shieldActive = true;
snake[0].tint = 0xffd700;
if (powerUpTimers.shield) {
LK.clearTimeout(powerUpTimers.shield);
}
powerUpTimers.shield = LK.setTimeout(function () {
shieldActive = false;
snake[0].tint = 0xffffff;
}, 3000);
} else if (type === 'multiplier') {
multiplier = 2;
multiplierTxt.setText('x2 MULTIPLIER!');
if (powerUpTimers.multiplier) {
LK.clearTimeout(powerUpTimers.multiplier);
}
powerUpTimers.multiplier = LK.setTimeout(function () {
multiplier = 1;
multiplierTxt.setText('');
}, 8000);
} else if (type === 'shrink') {
if (snake.length > 3) {
var segmentsToRemove = Math.min(3, snake.length - 3);
for (var i = 0; i < segmentsToRemove; i++) {
var tail = snake.pop();
tail.destroy();
}
}
}
}
function updateScore() {
scoreTxt.setText('Score: ' + score);
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText('Best: ' + highScore);
}
}
function gameOver() {
LK.getSound('gameover').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
function getDirectionFromInput(inputX, inputY) {
var headX = snake[0].x;
var headY = snake[0].y;
var deltaX = inputX - headX;
var deltaY = inputY - headY;
if (Math.abs(deltaX) > Math.abs(deltaY)) {
return deltaX > 0 ? {
x: 1,
y: 0
} : {
x: -1,
y: 0
};
} else {
return deltaY > 0 ? {
x: 0,
y: 1
} : {
x: 0,
y: -1
};
}
}
// Initialize game
initializeSnake();
spawnFood();
// Input handling
game.down = function (x, y, obj) {
var newDir = getDirectionFromInput(x, y);
// Prevent reverse direction
if (newDir.x !== -direction.x || newDir.y !== -direction.y) {
nextDirection = newDir;
}
};
// Game loop
game.update = function () {
var currentTime = Date.now();
if (currentTime - lastMoveTime >= gameSpeed) {
moveSnake();
lastMoveTime = currentTime;
}
// Clean up old power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
// Remove power-ups after 10 seconds
if (!powerUps[i].spawnTime) {
powerUps[i].spawnTime = currentTime;
}
if (currentTime - powerUps[i].spawnTime > 10000) {
powerUps[i].destroy();
powerUps.splice(i, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,384 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Food = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('food', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+var PowerUp = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'speed';
+ var assetName = 'powerUpSpeed';
+ if (type === 'shield') assetName = 'powerUpShield';else if (type === 'multiplier') assetName = 'powerUpMultiplier';else if (type === 'shrink') assetName = 'powerUpShrink';
+ var graphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ self.rotation += 0.1;
+ };
+ return self;
+});
+var SnakeHead = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('snakeHead', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+var SnakeSegment = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('snakeSegment', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x001122
+});
+
+/****
+* Game Code
+****/
+var GRID_SIZE = 40;
+var GAME_WIDTH = 2048;
+var GAME_HEIGHT = 2732;
+var COLS = Math.floor(GAME_WIDTH / GRID_SIZE);
+var ROWS = Math.floor(GAME_HEIGHT / GRID_SIZE);
+var snake = [];
+var direction = {
+ x: 1,
+ y: 0
+};
+var nextDirection = {
+ x: 1,
+ y: 0
+};
+var food = null;
+var powerUps = [];
+var gameSpeed = 150;
+var baseSpeed = 150;
+var lastMoveTime = 0;
+var score = 0;
+var highScore = storage.highScore || 0;
+var multiplier = 1;
+var shieldActive = false;
+var speedBoostActive = false;
+var powerUpTimers = {};
+// UI Elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+scoreTxt.x = 120;
+scoreTxt.y = 50;
+LK.gui.topLeft.addChild(scoreTxt);
+var highScoreTxt = new Text2('Best: ' + highScore, {
+ size: 40,
+ fill: 0xCCCCCC
+});
+highScoreTxt.anchor.set(0, 0);
+highScoreTxt.x = 120;
+highScoreTxt.y = 120;
+LK.gui.topLeft.addChild(highScoreTxt);
+var multiplierTxt = new Text2('', {
+ size: 50,
+ fill: 0xFFD700
+});
+multiplierTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(multiplierTxt);
+// Initialize snake
+function initializeSnake() {
+ // Clear existing snake
+ for (var i = 0; i < snake.length; i++) {
+ if (snake[i]) {
+ snake[i].destroy();
+ }
+ }
+ snake = [];
+ // Create initial snake
+ var startX = Math.floor(COLS / 2);
+ var startY = Math.floor(ROWS / 2);
+ for (var i = 0; i < 3; i++) {
+ var segment;
+ if (i === 0) {
+ segment = new SnakeHead();
+ } else {
+ segment = new SnakeSegment();
+ }
+ segment.gridX = startX - i;
+ segment.gridY = startY;
+ segment.x = segment.gridX * GRID_SIZE + GRID_SIZE / 2;
+ segment.y = segment.gridY * GRID_SIZE + GRID_SIZE / 2;
+ snake.push(segment);
+ game.addChild(segment);
+ }
+}
+function spawnFood() {
+ if (food) {
+ food.destroy();
+ }
+ var validPositions = [];
+ for (var x = 0; x < COLS; x++) {
+ for (var y = 0; y < ROWS; y++) {
+ var occupied = false;
+ for (var i = 0; i < snake.length; i++) {
+ if (snake[i].gridX === x && snake[i].gridY === y) {
+ occupied = true;
+ break;
+ }
+ }
+ if (!occupied) {
+ validPositions.push({
+ x: x,
+ y: y
+ });
+ }
+ }
+ }
+ if (validPositions.length > 0) {
+ var pos = validPositions[Math.floor(Math.random() * validPositions.length)];
+ food = new Food();
+ food.gridX = pos.x;
+ food.gridY = pos.y;
+ food.x = pos.x * GRID_SIZE + GRID_SIZE / 2;
+ food.y = pos.y * GRID_SIZE + GRID_SIZE / 2;
+ game.addChild(food);
+ }
+}
+function spawnPowerUp() {
+ if (Math.random() < 0.3) {
+ var types = ['speed', 'shield', 'multiplier', 'shrink'];
+ var type = types[Math.floor(Math.random() * types.length)];
+ var validPositions = [];
+ for (var x = 0; x < COLS; x++) {
+ for (var y = 0; y < ROWS; y++) {
+ var occupied = false;
+ for (var i = 0; i < snake.length; i++) {
+ if (snake[i].gridX === x && snake[i].gridY === y) {
+ occupied = true;
+ break;
+ }
+ }
+ if (!occupied && !(food && food.gridX === x && food.gridY === y)) {
+ validPositions.push({
+ x: x,
+ y: y
+ });
+ }
+ }
+ }
+ if (validPositions.length > 0) {
+ var pos = validPositions[Math.floor(Math.random() * validPositions.length)];
+ var powerUp = new PowerUp(type);
+ powerUp.gridX = pos.x;
+ powerUp.gridY = pos.y;
+ powerUp.x = pos.x * GRID_SIZE + GRID_SIZE / 2;
+ powerUp.y = pos.y * GRID_SIZE + GRID_SIZE / 2;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+ }
+ }
+}
+function moveSnake() {
+ direction = {
+ x: nextDirection.x,
+ y: nextDirection.y
+ };
+ var head = snake[0];
+ var newX = head.gridX + direction.x;
+ var newY = head.gridY + direction.y;
+ // Check wall collision
+ if (newX < 0 || newX >= COLS || newY < 0 || newY >= ROWS) {
+ if (!shieldActive) {
+ gameOver();
+ return;
+ }
+ }
+ // Check self collision
+ for (var i = 1; i < snake.length; i++) {
+ if (snake[i].gridX === newX && snake[i].gridY === newY) {
+ if (!shieldActive) {
+ gameOver();
+ return;
+ }
+ }
+ }
+ // Wrap around if shield is active
+ if (shieldActive) {
+ if (newX < 0) newX = COLS - 1;
+ if (newX >= COLS) newX = 0;
+ if (newY < 0) newY = ROWS - 1;
+ if (newY >= ROWS) newY = 0;
+ }
+ // Check food collision
+ var ateFood = false;
+ if (food && newX === food.gridX && newY === food.gridY) {
+ ateFood = true;
+ score += 10 * multiplier;
+ updateScore();
+ LK.getSound('eat').play();
+ spawnFood();
+ spawnPowerUp();
+ }
+ // Check power-up collision
+ for (var p = powerUps.length - 1; p >= 0; p--) {
+ var powerUp = powerUps[p];
+ if (powerUp.gridX === newX && powerUp.gridY === newY) {
+ activatePowerUp(powerUp.type);
+ powerUp.destroy();
+ powerUps.splice(p, 1);
+ LK.getSound('powerup').play();
+ break;
+ }
+ }
+ // Move snake
+ if (!ateFood) {
+ var tail = snake.pop();
+ tail.destroy();
+ }
+ var newHead = new SnakeHead();
+ newHead.gridX = newX;
+ newHead.gridY = newY;
+ newHead.x = newX * GRID_SIZE + GRID_SIZE / 2;
+ newHead.y = newY * GRID_SIZE + GRID_SIZE / 2;
+ // Convert old head to body segment
+ if (snake.length > 0) {
+ var oldHead = snake[0];
+ oldHead.removeChildren();
+ oldHead.attachAsset('snakeSegment', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ }
+ snake.unshift(newHead);
+ game.addChild(newHead);
+ // Update speed based on score
+ var speedLevel = Math.floor(score / 100);
+ gameSpeed = Math.max(80, baseSpeed - speedLevel * 10);
+ if (speedBoostActive) {
+ gameSpeed = Math.floor(gameSpeed * 0.6);
+ }
+}
+function activatePowerUp(type) {
+ if (type === 'speed') {
+ speedBoostActive = true;
+ if (powerUpTimers.speed) {
+ LK.clearTimeout(powerUpTimers.speed);
+ }
+ powerUpTimers.speed = LK.setTimeout(function () {
+ speedBoostActive = false;
+ }, 5000);
+ } else if (type === 'shield') {
+ shieldActive = true;
+ snake[0].tint = 0xffd700;
+ if (powerUpTimers.shield) {
+ LK.clearTimeout(powerUpTimers.shield);
+ }
+ powerUpTimers.shield = LK.setTimeout(function () {
+ shieldActive = false;
+ snake[0].tint = 0xffffff;
+ }, 3000);
+ } else if (type === 'multiplier') {
+ multiplier = 2;
+ multiplierTxt.setText('x2 MULTIPLIER!');
+ if (powerUpTimers.multiplier) {
+ LK.clearTimeout(powerUpTimers.multiplier);
+ }
+ powerUpTimers.multiplier = LK.setTimeout(function () {
+ multiplier = 1;
+ multiplierTxt.setText('');
+ }, 8000);
+ } else if (type === 'shrink') {
+ if (snake.length > 3) {
+ var segmentsToRemove = Math.min(3, snake.length - 3);
+ for (var i = 0; i < segmentsToRemove; i++) {
+ var tail = snake.pop();
+ tail.destroy();
+ }
+ }
+ }
+}
+function updateScore() {
+ scoreTxt.setText('Score: ' + score);
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ highScoreTxt.setText('Best: ' + highScore);
+ }
+}
+function gameOver() {
+ LK.getSound('gameover').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+}
+function getDirectionFromInput(inputX, inputY) {
+ var headX = snake[0].x;
+ var headY = snake[0].y;
+ var deltaX = inputX - headX;
+ var deltaY = inputY - headY;
+ if (Math.abs(deltaX) > Math.abs(deltaY)) {
+ return deltaX > 0 ? {
+ x: 1,
+ y: 0
+ } : {
+ x: -1,
+ y: 0
+ };
+ } else {
+ return deltaY > 0 ? {
+ x: 0,
+ y: 1
+ } : {
+ x: 0,
+ y: -1
+ };
+ }
+}
+// Initialize game
+initializeSnake();
+spawnFood();
+// Input handling
+game.down = function (x, y, obj) {
+ var newDir = getDirectionFromInput(x, y);
+ // Prevent reverse direction
+ if (newDir.x !== -direction.x || newDir.y !== -direction.y) {
+ nextDirection = newDir;
+ }
+};
+// Game loop
+game.update = function () {
+ var currentTime = Date.now();
+ if (currentTime - lastMoveTime >= gameSpeed) {
+ moveSnake();
+ lastMoveTime = currentTime;
+ }
+ // Clean up old power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ // Remove power-ups after 10 seconds
+ if (!powerUps[i].spawnTime) {
+ powerUps[i].spawnTime = currentTime;
+ }
+ if (currentTime - powerUps[i].spawnTime > 10000) {
+ powerUps[i].destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+};
\ No newline at end of file