/**** * Classes ****/ var Dot = Container.expand(function () { var self = Container.call(this); var dotGraphics = self.attachAsset('dot', { anchorX: 0.5, anchorY: 0.5 }); self.eaten = false; }); var Level = Container.expand(function () { var self = Container.call(this); self.targetScore = 10; self.currentLevel = 1; self.levelUp = function () { self.currentLevel++; self.targetScore += 10; }; }); var Snake = Container.expand(function () { var self = Container.call(this); var gridSize = 100; var snakeGraphics = self.attachAsset('snake', { anchorX: 0.5, anchorY: 0.5 }); self.length = 1; self.direction = 'right'; self.body = []; self._move_migrated = function () { var gridSize = 100; var oldHeadPosition = { x: snakeGraphics.x, y: snakeGraphics.y }; var marginX = 2048 % gridSize / 2; var marginY = 2732 % gridSize / 2; switch (self.direction) { case 'right': snakeGraphics.x = Math.round((snakeGraphics.x + gridSize - marginX) / gridSize) * gridSize + marginX; break; case 'left': snakeGraphics.x = Math.round((snakeGraphics.x - gridSize - marginX) / gridSize) * gridSize + marginX; break; case 'down': snakeGraphics.y = Math.round((snakeGraphics.y + gridSize - marginY) / gridSize) * gridSize + marginY; break; case 'up': snakeGraphics.y = Math.round((snakeGraphics.y - gridSize - marginY) / gridSize) * gridSize + marginY; break; } for (var i = self.body.length - 1; i > 0; i--) { self.body[i].x = self.body[i - 1].x; self.body[i].y = self.body[i - 1].y; } if (self.body.length > 0) { self.body[0].x = oldHeadPosition.x; self.body[0].y = oldHeadPosition.y; } }; self.eat = function (dot) { self.length++; var newSegment = self.attachAsset('snakeBody', { anchorX: 0.5, anchorY: 0.5 }); self.body.push(newSegment); self.addChild(newSegment); if (self.body.length > 1) { var lastSegment = self.body[self.body.length - 2]; newSegment.x = lastSegment.x; newSegment.y = lastSegment.y; } }; self.checkCollision = function () { var maxX = 2000; var maxY = 2700; var marginX = 2048 % gridSize / 2; var marginY = 2732 % gridSize / 2; if (snakeGraphics.x <= marginX) { snakeGraphics.x = maxX - gridSize + marginX; } if (snakeGraphics.x >= maxX + marginX) { snakeGraphics.x = marginX; } if (snakeGraphics.y <= marginY) { snakeGraphics.y = maxY - gridSize + marginY; } if (snakeGraphics.y >= maxY + marginY) { snakeGraphics.y = marginY; } for (var i = 0; i < self.body.length; i++) { if (snakeGraphics.x === self.body[i].x && snakeGraphics.y === self.body[i].y) { LK.showGameOver(); break; } } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var gridSize = 100; var marginX = 2048 % gridSize / 2; var marginY = 2732 % gridSize / 2; var background = game.attachAsset('background', {}); background.width = 2048 - 2048 % gridSize; background.height = 2732 - 2732 % gridSize; background.x = marginX; background.y = marginY; game.addChild(background); game.x = marginX; game.y = marginY; var dots = []; var spawnFoodCount = 1; var snake = game.addChild(new Snake()); var level = game.addChild(new Level()); var score = 0; var scoreTxt = new Text2(score.toString(), { size: 150, fill: "#1a2314", font: "'Courier New', monospace" }); scoreTxt.anchor.set(.5, 0); LK.gui.top.addChild(scoreTxt); var isGameOver = false; var tickCounter = 0; var moveFrequency = 8; LK.on('tick', function () { tickCounter++; if (tickCounter % moveFrequency == 0) { snake._move_migrated(); snake.checkCollision(); } if (isGameOver) { LK.showGameOver(); } for (var i = 0; i < dots.length; i++) { if (snake.intersects(dots[i]) && !dots[i].eaten) { snake.eat(dots[i]); dots[i].eaten = true; score++; if (score >= level.targetScore) { level.levelUp(); moveFrequency = Math.max(1, moveFrequency - 1); spawnDot(); score = 0; } scoreTxt.setText('Score: ' + score + ' Level: ' + level.currentLevel); scoreTxt.setText(score.toString()); game.removeChild(dots[i]); dots.splice(i, 1); spawnDot(); } } }); var startSwipePos = null; game.on('down', function (x, y, obj) { startSwipePos = game.toLocal(obj.global); }); game.on('up', function (x, y, obj) { if (!startSwipePos) { return; } var endSwipePos = game.toLocal(obj.global); var dx = endSwipePos.x - startSwipePos.x; var dy = endSwipePos.y - startSwipePos.y; if (Math.abs(dx) > Math.abs(dy)) { if (snake.direction !== 'up' && snake.direction !== 'down') { return; } snake.direction = dx > 0 ? 'right' : 'left'; } else { if (snake.direction !== 'right' && snake.direction !== 'left') { return; } snake.direction = dy > 0 ? 'down' : 'up'; } startSwipePos = null; }); var gridSize = 100; var spawnDot = function spawnDot() { for (var i = 0; i < spawnFoodCount; i++) { var dot = new Dot(); dot.x = Math.floor(Math.random() * ((2048 - 2 * marginX - gridSize) / gridSize)) * gridSize + marginX + gridSize; dot.y = Math.floor(Math.random() * ((2732 - 2 * marginY - gridSize) / gridSize)) * gridSize + marginY + gridSize; dots.push(dot); game.addChild(dot); } }; spawnDot();
/****
* Classes
****/
var Dot = Container.expand(function () {
var self = Container.call(this);
var dotGraphics = self.attachAsset('dot', {
anchorX: 0.5,
anchorY: 0.5
});
self.eaten = false;
});
var Level = Container.expand(function () {
var self = Container.call(this);
self.targetScore = 10;
self.currentLevel = 1;
self.levelUp = function () {
self.currentLevel++;
self.targetScore += 10;
};
});
var Snake = Container.expand(function () {
var self = Container.call(this);
var gridSize = 100;
var snakeGraphics = self.attachAsset('snake', {
anchorX: 0.5,
anchorY: 0.5
});
self.length = 1;
self.direction = 'right';
self.body = [];
self._move_migrated = function () {
var gridSize = 100;
var oldHeadPosition = {
x: snakeGraphics.x,
y: snakeGraphics.y
};
var marginX = 2048 % gridSize / 2;
var marginY = 2732 % gridSize / 2;
switch (self.direction) {
case 'right':
snakeGraphics.x = Math.round((snakeGraphics.x + gridSize - marginX) / gridSize) * gridSize + marginX;
break;
case 'left':
snakeGraphics.x = Math.round((snakeGraphics.x - gridSize - marginX) / gridSize) * gridSize + marginX;
break;
case 'down':
snakeGraphics.y = Math.round((snakeGraphics.y + gridSize - marginY) / gridSize) * gridSize + marginY;
break;
case 'up':
snakeGraphics.y = Math.round((snakeGraphics.y - gridSize - marginY) / gridSize) * gridSize + marginY;
break;
}
for (var i = self.body.length - 1; i > 0; i--) {
self.body[i].x = self.body[i - 1].x;
self.body[i].y = self.body[i - 1].y;
}
if (self.body.length > 0) {
self.body[0].x = oldHeadPosition.x;
self.body[0].y = oldHeadPosition.y;
}
};
self.eat = function (dot) {
self.length++;
var newSegment = self.attachAsset('snakeBody', {
anchorX: 0.5,
anchorY: 0.5
});
self.body.push(newSegment);
self.addChild(newSegment);
if (self.body.length > 1) {
var lastSegment = self.body[self.body.length - 2];
newSegment.x = lastSegment.x;
newSegment.y = lastSegment.y;
}
};
self.checkCollision = function () {
var maxX = 2000;
var maxY = 2700;
var marginX = 2048 % gridSize / 2;
var marginY = 2732 % gridSize / 2;
if (snakeGraphics.x <= marginX) {
snakeGraphics.x = maxX - gridSize + marginX;
}
if (snakeGraphics.x >= maxX + marginX) {
snakeGraphics.x = marginX;
}
if (snakeGraphics.y <= marginY) {
snakeGraphics.y = maxY - gridSize + marginY;
}
if (snakeGraphics.y >= maxY + marginY) {
snakeGraphics.y = marginY;
}
for (var i = 0; i < self.body.length; i++) {
if (snakeGraphics.x === self.body[i].x && snakeGraphics.y === self.body[i].y) {
LK.showGameOver();
break;
}
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var gridSize = 100;
var marginX = 2048 % gridSize / 2;
var marginY = 2732 % gridSize / 2;
var background = game.attachAsset('background', {});
background.width = 2048 - 2048 % gridSize;
background.height = 2732 - 2732 % gridSize;
background.x = marginX;
background.y = marginY;
game.addChild(background);
game.x = marginX;
game.y = marginY;
var dots = [];
var spawnFoodCount = 1;
var snake = game.addChild(new Snake());
var level = game.addChild(new Level());
var score = 0;
var scoreTxt = new Text2(score.toString(), {
size: 150,
fill: "#1a2314",
font: "'Courier New', monospace"
});
scoreTxt.anchor.set(.5, 0);
LK.gui.top.addChild(scoreTxt);
var isGameOver = false;
var tickCounter = 0;
var moveFrequency = 8;
LK.on('tick', function () {
tickCounter++;
if (tickCounter % moveFrequency == 0) {
snake._move_migrated();
snake.checkCollision();
}
if (isGameOver) {
LK.showGameOver();
}
for (var i = 0; i < dots.length; i++) {
if (snake.intersects(dots[i]) && !dots[i].eaten) {
snake.eat(dots[i]);
dots[i].eaten = true;
score++;
if (score >= level.targetScore) {
level.levelUp();
moveFrequency = Math.max(1, moveFrequency - 1);
spawnDot();
score = 0;
}
scoreTxt.setText('Score: ' + score + ' Level: ' + level.currentLevel);
scoreTxt.setText(score.toString());
game.removeChild(dots[i]);
dots.splice(i, 1);
spawnDot();
}
}
});
var startSwipePos = null;
game.on('down', function (x, y, obj) {
startSwipePos = game.toLocal(obj.global);
});
game.on('up', function (x, y, obj) {
if (!startSwipePos) {
return;
}
var endSwipePos = game.toLocal(obj.global);
var dx = endSwipePos.x - startSwipePos.x;
var dy = endSwipePos.y - startSwipePos.y;
if (Math.abs(dx) > Math.abs(dy)) {
if (snake.direction !== 'up' && snake.direction !== 'down') {
return;
}
snake.direction = dx > 0 ? 'right' : 'left';
} else {
if (snake.direction !== 'right' && snake.direction !== 'left') {
return;
}
snake.direction = dy > 0 ? 'down' : 'up';
}
startSwipePos = null;
});
var gridSize = 100;
var spawnDot = function spawnDot() {
for (var i = 0; i < spawnFoodCount; i++) {
var dot = new Dot();
dot.x = Math.floor(Math.random() * ((2048 - 2 * marginX - gridSize) / gridSize)) * gridSize + marginX + gridSize;
dot.y = Math.floor(Math.random() * ((2732 - 2 * marginY - gridSize) / gridSize)) * gridSize + marginY + gridSize;
dots.push(dot);
game.addChild(dot);
}
};
spawnDot();