var Snake = Container.expand(function (assetId, speed, directionX, directionY) {
var self = Container.call(this);
var snakeGraphics = self.createAsset(assetId, 'Snake Graphics', .5, .5);
self.speed = speed;
self.direction = {
x: directionX,
y: directionY
};
self.targetDirection = {
x: directionX,
y: directionY
};
self.turningSpeed = 0.2;
self.move = function () {
var targetAngle = Math.atan2(self.targetDirection.y, self.targetDirection.x);
var currentAngle = Math.atan2(self.direction.y, self.direction.x);
var deltaAngle = targetAngle - currentAngle;
if (deltaAngle > Math.PI) deltaAngle -= 2 * Math.PI;
if (deltaAngle < -Math.PI) deltaAngle += 2 * Math.PI;
if (Math.abs(deltaAngle) < self.turningSpeed) {
currentAngle = targetAngle;
} else {
currentAngle += Math.sign(deltaAngle) * self.turningSpeed;
}
self.rotation = currentAngle;
self.direction.x = Math.cos(currentAngle);
self.direction.y = Math.sin(currentAngle);
self.x = (self.x + self.speed * self.direction.x + 2048) % 2048;
self.y = (self.y + self.speed * self.direction.y + 2732) % 2732;
};
self.grow = function () {};
});
var Food = Container.expand(function () {
var self = Container.call(this);
var foodGraphics = self.createAsset('food', 'Food Graphics', .5, .5);
self.spawn = function () {};
});
var EnemySnake = Snake.expand(function () {
var self = this;
Snake.call(self, 'enemySnake', 15, -1, 0);
self.moveTowardsFood = function (foods) {
var closestFood = null;
var closestDistance = Infinity;
for (var i = 0; i < foods.length; i++) {
var dx = foods[i].x - self.x;
var dy = foods[i].y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestFood = foods[i];
}
}
if (closestFood) {
self.targetDirection.x = closestFood.x - self.x;
self.targetDirection.y = closestFood.y - self.y;
var magnitude = Math.sqrt(self.targetDirection.x * self.targetDirection.x + self.targetDirection.y * self.targetDirection.y);
self.targetDirection.x /= magnitude;
self.targetDirection.y /= magnitude;
}
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
var snakes = [];
var foods = [];
var enemySnakes = [];
var score = 0;
var scoreTxt = new Text2('0', {
size: 150,
fill: '#ffffff'
});
LK.gui.topCenter.addChild(scoreTxt);
var snake = self.addChild(new Snake('playerSnake', 20, 1, 0));
snake.x = 2048 / 2;
snake.y = 2732 / 2;
var food = self.addChild(new Food());
food.x = Math.random() * 2048;
food.y = Math.random() * 2732;
var enemySnake = self.addChild(new EnemySnake());
enemySnake.x = Math.random() * 2048;
enemySnake.y = Math.random() * 2732;
snakes.push(snake);
foods.push(food);
enemySnakes.push(enemySnake);
var dragNode = null;
stage.on('down', function (obj) {
dragNode = snake;
});
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(self);
if (dragNode) {
dragNode.targetDirection.x = pos.x - dragNode.x;
dragNode.targetDirection.y = pos.y - dragNode.y;
var magnitude = Math.sqrt(dragNode.targetDirection.x * dragNode.targetDirection.x + dragNode.targetDirection.y * dragNode.targetDirection.y);
dragNode.targetDirection.x /= magnitude;
dragNode.targetDirection.y /= magnitude;
}
}
stage.on('move', handleMove);
stage.on('up', function (obj) {
dragNode = null;
});
LK.on('tick', function () {
for (var i = 0; i < snakes.length; i++) {
snakes[i].move();
}
for (var i = 0; i < enemySnakes.length; i++) {
enemySnakes[i].moveTowardsFood(foods);
enemySnakes[i].move();
}
for (var i = 0; i < foods.length; i++) {
for (var j = 0; j < snakes.length; j++) {
if (snakes[j].intersects(foods[i])) {
snakes[j].grow();
foods[i].destroy();
foods.splice(i, 1);
var newFood = new Food();
newFood.x = Math.random() * 2048;
newFood.y = Math.random() * 2732;
foods.push(newFood);
self.addChild(newFood);
score++;
scoreTxt.setText(score);
break;
}
}
for (var j = 0; j < enemySnakes.length; j++) {
if (enemySnakes[j].intersects(foods[i])) {
enemySnakes[j].grow();
foods[i].destroy();
foods.splice(i, 1);
var newFood = new Food();
newFood.x = Math.random() * 2048;
newFood.y = Math.random() * 2732;
foods.push(newFood);
self.addChild(newFood);
score--;
scoreTxt.setText(score);
break;
}
}
}
for (var i = 0; i < enemySnakes.length; i++) {
if (snake.intersects(enemySnakes[i])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
});
});
var Snake = Container.expand(function (assetId, speed, directionX, directionY) {
var self = Container.call(this);
var snakeGraphics = self.createAsset(assetId, 'Snake Graphics', .5, .5);
self.speed = speed;
self.direction = {
x: directionX,
y: directionY
};
self.targetDirection = {
x: directionX,
y: directionY
};
self.turningSpeed = 0.2;
self.move = function () {
var targetAngle = Math.atan2(self.targetDirection.y, self.targetDirection.x);
var currentAngle = Math.atan2(self.direction.y, self.direction.x);
var deltaAngle = targetAngle - currentAngle;
if (deltaAngle > Math.PI) deltaAngle -= 2 * Math.PI;
if (deltaAngle < -Math.PI) deltaAngle += 2 * Math.PI;
if (Math.abs(deltaAngle) < self.turningSpeed) {
currentAngle = targetAngle;
} else {
currentAngle += Math.sign(deltaAngle) * self.turningSpeed;
}
self.rotation = currentAngle;
self.direction.x = Math.cos(currentAngle);
self.direction.y = Math.sin(currentAngle);
self.x = (self.x + self.speed * self.direction.x + 2048) % 2048;
self.y = (self.y + self.speed * self.direction.y + 2732) % 2732;
};
self.grow = function () {};
});
var Food = Container.expand(function () {
var self = Container.call(this);
var foodGraphics = self.createAsset('food', 'Food Graphics', .5, .5);
self.spawn = function () {};
});
var EnemySnake = Snake.expand(function () {
var self = this;
Snake.call(self, 'enemySnake', 15, -1, 0);
self.moveTowardsFood = function (foods) {
var closestFood = null;
var closestDistance = Infinity;
for (var i = 0; i < foods.length; i++) {
var dx = foods[i].x - self.x;
var dy = foods[i].y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestFood = foods[i];
}
}
if (closestFood) {
self.targetDirection.x = closestFood.x - self.x;
self.targetDirection.y = closestFood.y - self.y;
var magnitude = Math.sqrt(self.targetDirection.x * self.targetDirection.x + self.targetDirection.y * self.targetDirection.y);
self.targetDirection.x /= magnitude;
self.targetDirection.y /= magnitude;
}
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
var snakes = [];
var foods = [];
var enemySnakes = [];
var score = 0;
var scoreTxt = new Text2('0', {
size: 150,
fill: '#ffffff'
});
LK.gui.topCenter.addChild(scoreTxt);
var snake = self.addChild(new Snake('playerSnake', 20, 1, 0));
snake.x = 2048 / 2;
snake.y = 2732 / 2;
var food = self.addChild(new Food());
food.x = Math.random() * 2048;
food.y = Math.random() * 2732;
var enemySnake = self.addChild(new EnemySnake());
enemySnake.x = Math.random() * 2048;
enemySnake.y = Math.random() * 2732;
snakes.push(snake);
foods.push(food);
enemySnakes.push(enemySnake);
var dragNode = null;
stage.on('down', function (obj) {
dragNode = snake;
});
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(self);
if (dragNode) {
dragNode.targetDirection.x = pos.x - dragNode.x;
dragNode.targetDirection.y = pos.y - dragNode.y;
var magnitude = Math.sqrt(dragNode.targetDirection.x * dragNode.targetDirection.x + dragNode.targetDirection.y * dragNode.targetDirection.y);
dragNode.targetDirection.x /= magnitude;
dragNode.targetDirection.y /= magnitude;
}
}
stage.on('move', handleMove);
stage.on('up', function (obj) {
dragNode = null;
});
LK.on('tick', function () {
for (var i = 0; i < snakes.length; i++) {
snakes[i].move();
}
for (var i = 0; i < enemySnakes.length; i++) {
enemySnakes[i].moveTowardsFood(foods);
enemySnakes[i].move();
}
for (var i = 0; i < foods.length; i++) {
for (var j = 0; j < snakes.length; j++) {
if (snakes[j].intersects(foods[i])) {
snakes[j].grow();
foods[i].destroy();
foods.splice(i, 1);
var newFood = new Food();
newFood.x = Math.random() * 2048;
newFood.y = Math.random() * 2732;
foods.push(newFood);
self.addChild(newFood);
score++;
scoreTxt.setText(score);
break;
}
}
for (var j = 0; j < enemySnakes.length; j++) {
if (enemySnakes[j].intersects(foods[i])) {
enemySnakes[j].grow();
foods[i].destroy();
foods.splice(i, 1);
var newFood = new Food();
newFood.x = Math.random() * 2048;
newFood.y = Math.random() * 2732;
foods.push(newFood);
self.addChild(newFood);
score--;
scoreTxt.setText(score);
break;
}
}
}
for (var i = 0; i < enemySnakes.length; i++) {
if (snake.intersects(enemySnakes[i])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
});
});