/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Food class var Food = Container.expand(function (fruitType) { var self = Container.call(this); // Default to apple if not specified var type = fruitType || 'apple'; var assetId = 'food_' + type; var food = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.fruitType = type; return self; }); // Snake Head class var SnakeHead = Container.expand(function () { var self = Container.call(this); var head = self.attachAsset('snakeHead', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Snake Segment class var SnakeSegment = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('snakeBody', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Game constants // Snake head: green ellipse // Snake body: lighter green ellipse // Food: red ellipse // Fruit assets // Snake assets var GRID_SIZE = 80; // Each cell is 80x80 px var GRID_COLS = Math.floor(2048 / GRID_SIZE); var GRID_ROWS = Math.floor(2732 / GRID_SIZE); // Directions var DIR_UP = 0, DIR_RIGHT = 1, DIR_DOWN = 2, DIR_LEFT = 3; // Snake state var snake = []; var snakeDir = DIR_RIGHT; var nextDir = DIR_RIGHT; var pendingGrowth = 0; // Food state var food = null; // Score var score = 0; var level = 1; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); scoreTxt.y = 600; // Move score lower for better grouping at y=600 LK.gui.top.addChild(scoreTxt); var levelTxt = new Text2('Level 1', { size: 80, fill: 0xFFD700 }); levelTxt.anchor.set(0.5, 0); levelTxt.y = scoreTxt.y + scoreTxt.height + 10; // Place level just below score LK.gui.top.addChild(levelTxt); // Helper: get grid-aligned position function gridPos(col, row) { return { x: col * GRID_SIZE + GRID_SIZE / 2, y: row * GRID_SIZE + GRID_SIZE / 2 }; } // Helper: get random empty cell function getRandomEmptyCell() { var occupied = {}; for (var i = 0; i < snake.length; i++) { occupied[snake[i].col + ',' + snake[i].row] = true; } var empty = []; for (var c = 0; c < GRID_COLS; c++) { for (var r = 0; r < GRID_ROWS; r++) { if (!occupied[c + ',' + r]) empty.push({ col: c, row: r }); } } if (empty.length === 0) return null; var idx = Math.floor(Math.random() * empty.length); return empty[idx]; } // Initialize snake in center function resetSnake() { // Remove old snake for (var i = 0; i < snake.length; i++) { snake[i].destroy(); } snake = []; var startCol = Math.floor(GRID_COLS / 2); var startRow = Math.floor(GRID_ROWS / 2); // Head var head = new SnakeHead(); head.col = startCol; head.row = startRow; var pos = gridPos(startCol, startRow); head.x = pos.x; head.y = pos.y; game.addChild(head); snake.push(head); // 2 body segments for (var i = 1; i <= 2; i++) { var seg = new SnakeSegment(); seg.col = startCol - i; seg.row = startRow; var pos2 = gridPos(seg.col, seg.row); seg.x = pos2.x; seg.y = pos2.y; game.addChild(seg); snake.push(seg); } snakeDir = DIR_RIGHT; nextDir = DIR_RIGHT; pendingGrowth = 0; } // Place food at random empty cell function placeFood() { if (food) food.destroy(); var cell = getRandomEmptyCell(); if (!cell) return; // Pick a random fruit type var fruitTypes = ['apple', 'banana', 'grape', 'orange']; var idx = Math.floor(Math.random() * fruitTypes.length); var fruitType = fruitTypes[idx]; food = new Food(fruitType); food.col = cell.col; food.row = cell.row; var pos = gridPos(cell.col, cell.row); food.x = pos.x; food.y = pos.y; game.addChild(food); } // Check collision with self or wall function checkCollision(col, row) { // Wall if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return true; // Self for (var i = 0; i < snake.length; i++) { if (snake[i].col === col && snake[i].row === row) return true; } return false; } // Move snake one step function moveSnake() { // Compute new head position var head = snake[0]; var dcol = 0, drow = 0; if (snakeDir === DIR_UP) drow = -1;else if (snakeDir === DIR_DOWN) drow = 1;else if (snakeDir === DIR_LEFT) dcol = -1;else if (snakeDir === DIR_RIGHT) dcol = 1; var newCol = head.col + dcol; var newRow = head.row + drow; // Check collision for (var i = 0; i < snake.length; i++) { if (snake[i].col === newCol && snake[i].row === newRow) { // Collided with self LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } if (newCol < 0 || newCol >= GRID_COLS || newRow < 0 || newRow >= GRID_ROWS) { // Collided with wall LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } // Move body segments for (var i = snake.length - 1; i > 0; i--) { snake[i].col = snake[i - 1].col; snake[i].row = snake[i - 1].row; } head.col = newCol; head.row = newRow; // Animate movement for (var i = 0; i < snake.length; i++) { var pos = gridPos(snake[i].col, snake[i].row); tween(snake[i], { x: pos.x, y: pos.y }, { duration: 80, easing: tween.linear }); } // Check food collision if (food && head.col === food.col && head.row === food.row) { // Eat food pendingGrowth += 1; score += 1; LK.setScore(score); scoreTxt.setText(score); // Level up every 5 points var prevLevel = level; level = Math.floor(score / 5) + 1; if (level !== prevLevel) { levelTxt.setText('Level ' + level); // Optional: flash level text or add effect LK.effects.flashObject(levelTxt, 0xFFD700, 600); } placeFood(); } // Grow if needed if (pendingGrowth > 0) { var tail = snake[snake.length - 1]; var newSeg = new SnakeSegment(); newSeg.col = tail.col; newSeg.row = tail.row; var pos2 = gridPos(newSeg.col, newSeg.row); newSeg.x = pos2.x; newSeg.y = pos2.y; game.addChild(newSeg); snake.push(newSeg); pendingGrowth -= 1; } } // Touch controls: swipe to change direction var touchStartX = null, touchStartY = null; game.down = function (x, y, obj) { touchStartX = x; touchStartY = y; }; game.up = function (x, y, obj) { if (touchStartX === null || touchStartY === null) return; var dx = x - touchStartX; var dy = y - touchStartY; if (Math.abs(dx) > Math.abs(dy)) { // Horizontal swipe if (dx > 40 && snakeDir !== DIR_LEFT) nextDir = DIR_RIGHT;else if (dx < -40 && snakeDir !== DIR_RIGHT) nextDir = DIR_LEFT; } else { // Vertical swipe if (dy > 40 && snakeDir !== DIR_UP) nextDir = DIR_DOWN;else if (dy < -40 && snakeDir !== DIR_DOWN) nextDir = DIR_UP; } touchStartX = null; touchStartY = null; }; // Also allow tap on left/right/top/bottom of screen to change direction game.move = function (x, y, obj) { // No drag for snake }; // Game update: move snake every N ticks var MOVE_INTERVAL = 10; // Lower = faster var moveTick = 0; game.update = function () { if (snake.length === 0) { resetSnake(); score = 0; LK.setScore(0); scoreTxt.setText('0'); level = 1; levelTxt.setText('Level 1'); placeFood(); moveTick = 0; return; } moveTick++; if (moveTick >= MOVE_INTERVAL) { // Only allow 90-degree turns (no reverse) if (snakeDir === DIR_UP && nextDir !== DIR_DOWN || snakeDir === DIR_DOWN && nextDir !== DIR_UP || snakeDir === DIR_LEFT && nextDir !== DIR_RIGHT || snakeDir === DIR_RIGHT && nextDir !== DIR_LEFT) { snakeDir = nextDir; } moveSnake(); moveTick = 0; } }; // Center score text horizontally scoreTxt.setText('0'); scoreTxt.anchor.set(0.5, 0); // Initial setup resetSnake(); placeFood();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Food class
var Food = Container.expand(function (fruitType) {
var self = Container.call(this);
// Default to apple if not specified
var type = fruitType || 'apple';
var assetId = 'food_' + type;
var food = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.fruitType = type;
return self;
});
// Snake Head class
var SnakeHead = Container.expand(function () {
var self = Container.call(this);
var head = self.attachAsset('snakeHead', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Snake Segment class
var SnakeSegment = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('snakeBody', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Game constants
// Snake head: green ellipse
// Snake body: lighter green ellipse
// Food: red ellipse
// Fruit assets
// Snake assets
var GRID_SIZE = 80; // Each cell is 80x80 px
var GRID_COLS = Math.floor(2048 / GRID_SIZE);
var GRID_ROWS = Math.floor(2732 / GRID_SIZE);
// Directions
var DIR_UP = 0,
DIR_RIGHT = 1,
DIR_DOWN = 2,
DIR_LEFT = 3;
// Snake state
var snake = [];
var snakeDir = DIR_RIGHT;
var nextDir = DIR_RIGHT;
var pendingGrowth = 0;
// Food state
var food = null;
// Score
var score = 0;
var level = 1;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.y = 600; // Move score lower for better grouping at y=600
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Level 1', {
size: 80,
fill: 0xFFD700
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = scoreTxt.y + scoreTxt.height + 10; // Place level just below score
LK.gui.top.addChild(levelTxt);
// Helper: get grid-aligned position
function gridPos(col, row) {
return {
x: col * GRID_SIZE + GRID_SIZE / 2,
y: row * GRID_SIZE + GRID_SIZE / 2
};
}
// Helper: get random empty cell
function getRandomEmptyCell() {
var occupied = {};
for (var i = 0; i < snake.length; i++) {
occupied[snake[i].col + ',' + snake[i].row] = true;
}
var empty = [];
for (var c = 0; c < GRID_COLS; c++) {
for (var r = 0; r < GRID_ROWS; r++) {
if (!occupied[c + ',' + r]) empty.push({
col: c,
row: r
});
}
}
if (empty.length === 0) return null;
var idx = Math.floor(Math.random() * empty.length);
return empty[idx];
}
// Initialize snake in center
function resetSnake() {
// Remove old snake
for (var i = 0; i < snake.length; i++) {
snake[i].destroy();
}
snake = [];
var startCol = Math.floor(GRID_COLS / 2);
var startRow = Math.floor(GRID_ROWS / 2);
// Head
var head = new SnakeHead();
head.col = startCol;
head.row = startRow;
var pos = gridPos(startCol, startRow);
head.x = pos.x;
head.y = pos.y;
game.addChild(head);
snake.push(head);
// 2 body segments
for (var i = 1; i <= 2; i++) {
var seg = new SnakeSegment();
seg.col = startCol - i;
seg.row = startRow;
var pos2 = gridPos(seg.col, seg.row);
seg.x = pos2.x;
seg.y = pos2.y;
game.addChild(seg);
snake.push(seg);
}
snakeDir = DIR_RIGHT;
nextDir = DIR_RIGHT;
pendingGrowth = 0;
}
// Place food at random empty cell
function placeFood() {
if (food) food.destroy();
var cell = getRandomEmptyCell();
if (!cell) return;
// Pick a random fruit type
var fruitTypes = ['apple', 'banana', 'grape', 'orange'];
var idx = Math.floor(Math.random() * fruitTypes.length);
var fruitType = fruitTypes[idx];
food = new Food(fruitType);
food.col = cell.col;
food.row = cell.row;
var pos = gridPos(cell.col, cell.row);
food.x = pos.x;
food.y = pos.y;
game.addChild(food);
}
// Check collision with self or wall
function checkCollision(col, row) {
// Wall
if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return true;
// Self
for (var i = 0; i < snake.length; i++) {
if (snake[i].col === col && snake[i].row === row) return true;
}
return false;
}
// Move snake one step
function moveSnake() {
// Compute new head position
var head = snake[0];
var dcol = 0,
drow = 0;
if (snakeDir === DIR_UP) drow = -1;else if (snakeDir === DIR_DOWN) drow = 1;else if (snakeDir === DIR_LEFT) dcol = -1;else if (snakeDir === DIR_RIGHT) dcol = 1;
var newCol = head.col + dcol;
var newRow = head.row + drow;
// Check collision
for (var i = 0; i < snake.length; i++) {
if (snake[i].col === newCol && snake[i].row === newRow) {
// Collided with self
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
if (newCol < 0 || newCol >= GRID_COLS || newRow < 0 || newRow >= GRID_ROWS) {
// Collided with wall
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
// Move body segments
for (var i = snake.length - 1; i > 0; i--) {
snake[i].col = snake[i - 1].col;
snake[i].row = snake[i - 1].row;
}
head.col = newCol;
head.row = newRow;
// Animate movement
for (var i = 0; i < snake.length; i++) {
var pos = gridPos(snake[i].col, snake[i].row);
tween(snake[i], {
x: pos.x,
y: pos.y
}, {
duration: 80,
easing: tween.linear
});
}
// Check food collision
if (food && head.col === food.col && head.row === food.row) {
// Eat food
pendingGrowth += 1;
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
// Level up every 5 points
var prevLevel = level;
level = Math.floor(score / 5) + 1;
if (level !== prevLevel) {
levelTxt.setText('Level ' + level);
// Optional: flash level text or add effect
LK.effects.flashObject(levelTxt, 0xFFD700, 600);
}
placeFood();
}
// Grow if needed
if (pendingGrowth > 0) {
var tail = snake[snake.length - 1];
var newSeg = new SnakeSegment();
newSeg.col = tail.col;
newSeg.row = tail.row;
var pos2 = gridPos(newSeg.col, newSeg.row);
newSeg.x = pos2.x;
newSeg.y = pos2.y;
game.addChild(newSeg);
snake.push(newSeg);
pendingGrowth -= 1;
}
}
// Touch controls: swipe to change direction
var touchStartX = null,
touchStartY = null;
game.down = function (x, y, obj) {
touchStartX = x;
touchStartY = y;
};
game.up = function (x, y, obj) {
if (touchStartX === null || touchStartY === null) return;
var dx = x - touchStartX;
var dy = y - touchStartY;
if (Math.abs(dx) > Math.abs(dy)) {
// Horizontal swipe
if (dx > 40 && snakeDir !== DIR_LEFT) nextDir = DIR_RIGHT;else if (dx < -40 && snakeDir !== DIR_RIGHT) nextDir = DIR_LEFT;
} else {
// Vertical swipe
if (dy > 40 && snakeDir !== DIR_UP) nextDir = DIR_DOWN;else if (dy < -40 && snakeDir !== DIR_DOWN) nextDir = DIR_UP;
}
touchStartX = null;
touchStartY = null;
};
// Also allow tap on left/right/top/bottom of screen to change direction
game.move = function (x, y, obj) {
// No drag for snake
};
// Game update: move snake every N ticks
var MOVE_INTERVAL = 10; // Lower = faster
var moveTick = 0;
game.update = function () {
if (snake.length === 0) {
resetSnake();
score = 0;
LK.setScore(0);
scoreTxt.setText('0');
level = 1;
levelTxt.setText('Level 1');
placeFood();
moveTick = 0;
return;
}
moveTick++;
if (moveTick >= MOVE_INTERVAL) {
// Only allow 90-degree turns (no reverse)
if (snakeDir === DIR_UP && nextDir !== DIR_DOWN || snakeDir === DIR_DOWN && nextDir !== DIR_UP || snakeDir === DIR_LEFT && nextDir !== DIR_RIGHT || snakeDir === DIR_RIGHT && nextDir !== DIR_LEFT) {
snakeDir = nextDir;
}
moveSnake();
moveTick = 0;
}
};
// Center score text horizontally
scoreTxt.setText('0');
scoreTxt.anchor.set(0.5, 0);
// Initial setup
resetSnake();
placeFood();
yılan resmi. In-Game asset. 2d. High contrast. No shadows
yılan gövdesi. In-Game asset. 2d. High contrast. No shadows
portakal. In-Game asset. 2d. High contrast. No shadows
elma. In-Game asset. 2d. High contrast. No shadows
muz resmi. In-Game asset. 2d. High contrast. No shadows
üzüm resmi. In-Game asset. 2d. High contrast. No shadows