/****
* Classes
****/
// Snake segment class
var SnakeSegment = Container.expand(function () {
var self = Container.call(this);
var segmentGraphic = self.createAsset('snakeSegment', 'Snake Segment', 0.5, 0.5);
});
// Food class
var Food = Container.expand(function () {
var self = Container.call(this);
var foodGraphic = self.createAsset('food', 'Food', 0.5, 0.5);
self.x = Math.random() * (2048 - foodGraphic.width) + foodGraphic.width / 2;
self.y = Math.random() * (2732 - foodGraphic.height) + foodGraphic.height / 2;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Game variables
var snake = [];
var food;
var direction = {
x: 0,
y: 0
};
var nextDirection = {
x: 0,
y: 0
};
var snakeSpeed = 5;
var updateInterval = 1000 / 60;
var lastUpdateTime = 0;
var isGameOver = false;
// Initialize snake
function initSnake() {
var initialLength = 5;
for (var i = 0; i < initialLength; i++) {
var segment = new SnakeSegment();
segment.x = 1024;
segment.y = 1366 + i * segment.height;
snake.push(segment);
game.addChild(segment);
}
direction = {
x: 0,
y: -1
};
}
// Initialize food
function initFood() {
food = new Food();
game.addChild(food);
}
// Check collision with food
function checkFoodCollision() {
var head = snake[0];
if (head.intersects(food)) {
food.destroy();
addSnakeSegment();
initFood();
}
}
// Add new segment to snake
function addSnakeSegment() {
var tail = snake[snake.length - 1];
var newSegment = new SnakeSegment();
newSegment.x = tail.x;
newSegment.y = tail.y;
snake.push(newSegment);
game.addChild(newSegment);
}
// Check self collision
function checkSelfCollision() {
var head = snake[0];
for (var i = 1; i < snake.length; i++) {
if (head.intersects(snake[i])) {
isGameOver = true;
break;
}
}
}
// Update snake position
function updateSnakePosition() {
var head = snake[0];
var newHead = new SnakeSegment();
newHead.x = head.x + direction.x * head.width;
newHead.y = head.y + direction.y * head.height;
snake.unshift(newHead);
game.addChild(newHead);
var oldTail = snake.pop();
oldTail.destroy();
}
// Handle touch input for direction change
function handleTouchInput(obj) {
var touchPos = obj.event.getLocalPosition(game);
var head = snake[0];
var diffX = touchPos.x - head.x;
var diffY = touchPos.y - head.y;
if (Math.abs(diffX) > Math.abs(diffY)) {
nextDirection = {
x: diffX > 0 ? 1 : -1,
y: 0
};
} else {
nextDirection = {
x: 0,
y: diffY > 0 ? 1 : -1
};
}
}
// Game tick update
LK.on('tick', function () {
if (isGameOver) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
var currentTime = Date.now();
if (currentTime - lastUpdateTime > updateInterval) {
if (direction.x !== -nextDirection.x || direction.y !== -nextDirection.y) {
direction = nextDirection;
}
updateSnakePosition();
checkFoodCollision();
checkSelfCollision();
lastUpdateTime = currentTime;
}
});
// Touch input listener
game.on('down', handleTouchInput);
// Initialize game elements
initSnake();
initFood(); /****
* Classes
****/
// Snake segment class
var SnakeSegment = Container.expand(function () {
var self = Container.call(this);
var segmentGraphic = self.createAsset('snakeSegment', 'Snake Segment', 0.5, 0.5);
});
// Food class
var Food = Container.expand(function () {
var self = Container.call(this);
var foodGraphic = self.createAsset('food', 'Food', 0.5, 0.5);
self.x = Math.random() * (2048 - foodGraphic.width) + foodGraphic.width / 2;
self.y = Math.random() * (2732 - foodGraphic.height) + foodGraphic.height / 2;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Game variables
var snake = [];
var food;
var direction = {
x: 0,
y: 0
};
var nextDirection = {
x: 0,
y: 0
};
var snakeSpeed = 5;
var updateInterval = 1000 / 60;
var lastUpdateTime = 0;
var isGameOver = false;
// Initialize snake
function initSnake() {
var initialLength = 5;
for (var i = 0; i < initialLength; i++) {
var segment = new SnakeSegment();
segment.x = 1024;
segment.y = 1366 + i * segment.height;
snake.push(segment);
game.addChild(segment);
}
direction = {
x: 0,
y: -1
};
}
// Initialize food
function initFood() {
food = new Food();
game.addChild(food);
}
// Check collision with food
function checkFoodCollision() {
var head = snake[0];
if (head.intersects(food)) {
food.destroy();
addSnakeSegment();
initFood();
}
}
// Add new segment to snake
function addSnakeSegment() {
var tail = snake[snake.length - 1];
var newSegment = new SnakeSegment();
newSegment.x = tail.x;
newSegment.y = tail.y;
snake.push(newSegment);
game.addChild(newSegment);
}
// Check self collision
function checkSelfCollision() {
var head = snake[0];
for (var i = 1; i < snake.length; i++) {
if (head.intersects(snake[i])) {
isGameOver = true;
break;
}
}
}
// Update snake position
function updateSnakePosition() {
var head = snake[0];
var newHead = new SnakeSegment();
newHead.x = head.x + direction.x * head.width;
newHead.y = head.y + direction.y * head.height;
snake.unshift(newHead);
game.addChild(newHead);
var oldTail = snake.pop();
oldTail.destroy();
}
// Handle touch input for direction change
function handleTouchInput(obj) {
var touchPos = obj.event.getLocalPosition(game);
var head = snake[0];
var diffX = touchPos.x - head.x;
var diffY = touchPos.y - head.y;
if (Math.abs(diffX) > Math.abs(diffY)) {
nextDirection = {
x: diffX > 0 ? 1 : -1,
y: 0
};
} else {
nextDirection = {
x: 0,
y: diffY > 0 ? 1 : -1
};
}
}
// Game tick update
LK.on('tick', function () {
if (isGameOver) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
var currentTime = Date.now();
if (currentTime - lastUpdateTime > updateInterval) {
if (direction.x !== -nextDirection.x || direction.y !== -nextDirection.y) {
direction = nextDirection;
}
updateSnakePosition();
checkFoodCollision();
checkSelfCollision();
lastUpdateTime = currentTime;
}
});
// Touch input listener
game.on('down', handleTouchInput);
// Initialize game elements
initSnake();
initFood();