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();
}
}
});
});