/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Bonus class var Bonus = Container.expand(function () { var self = Container.call(this); // Attach bonus asset (yellow ellipse, centered) var bonusAsset = self.attachAsset('bonus', { anchorX: 0.5, anchorY: 0.5 }); bonusAsset.width = 120; bonusAsset.height = 120; // For collision self.getBounds = function () { return { x: self.x - bonusAsset.width / 2, y: self.y - bonusAsset.height / 2, width: bonusAsset.width, height: bonusAsset.height }; }; return self; }); // Car (Player) class var Car = Container.expand(function () { var self = Container.call(this); // Attach car asset (red box, centered) var carAsset = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); // Set initial size (proportional to road) carAsset.width = 180; carAsset.height = 320; // For collision self.getBounds = function () { return { x: self.x - carAsset.width / 2, y: self.y - carAsset.height / 2, width: carAsset.width, height: carAsset.height }; }; return self; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); // Attach obstacle asset (gray box, centered) var obsAsset = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); obsAsset.width = 180; obsAsset.height = 180; // For collision self.getBounds = function () { return { x: self.x - obsAsset.width / 2, y: self.y - obsAsset.height / 2, width: obsAsset.width, height: obsAsset.height }; }; return self; }); // Road line class (for visual effect) var RoadLine = Container.expand(function () { var self = Container.call(this); var lineAsset = self.attachAsset('roadLine', { anchorX: 0.5, anchorY: 0.5 }); lineAsset.width = 40; lineAsset.height = 180; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // --- Game Constants --- // --- Asset Initialization --- var ROAD_WIDTH = 900; var ROAD_X = 2048 / 2; var ROAD_Y = 2732 / 2; var ROAD_TOP = 0; var ROAD_BOTTOM = 2732; var ROAD_LEFT = ROAD_X - ROAD_WIDTH / 2; var ROAD_RIGHT = ROAD_X + ROAD_WIDTH / 2; var CAR_START_Y = 2732 - 400; var CAR_MIN_X = ROAD_LEFT + 120; var CAR_MAX_X = ROAD_RIGHT - 120; var OBSTACLE_MIN_Y = -200; var OBSTACLE_MAX_Y = -100; var OBSTACLE_MIN_X = ROAD_LEFT + 120; var OBSTACLE_MAX_X = ROAD_RIGHT - 120; var BONUS_MIN_X = ROAD_LEFT + 120; var BONUS_MAX_X = ROAD_RIGHT - 120; // --- Game State --- var car; var obstacles = []; var bonuses = []; var roadLines = []; var score = 0; var bestScore = storage.bestScore || 0; var speed = 18; // Initial speed (pixels per frame) var speedIncrease = 0.002; // Speed increases per tick var ticks = 0; var dragNode = null; var dragOffsetX = 0; // --- UI --- var scoreTxt = new Text2('0', { size: 120, fill: 0xFFF700 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var bestScoreTxt = new Text2('En İyi: ' + bestScore, { size: 60, fill: 0xFFFFFF }); bestScoreTxt.anchor.set(0.5, 0); bestScoreTxt.y = 120; LK.gui.top.addChild(bestScoreTxt); // --- Road Lines (for visual movement) --- for (var i = 0; i < 8; i++) { var line = new RoadLine(); line.x = ROAD_X; line.y = i * 400 + 100; roadLines.push(line); game.addChild(line); } // --- Car --- car = new Car(); car.x = ROAD_X; car.y = CAR_START_Y; game.addChild(car); // --- Touch/Drag Controls --- function clamp(val, min, max) { return val < min ? min : val > max ? max : val; } function handleMove(x, y, obj) { if (dragNode) { // Clamp car within road dragNode.x = clamp(x, CAR_MIN_X, CAR_MAX_X); } } game.move = handleMove; game.down = function (x, y, obj) { // Only start drag if touch is on car or below it if (x >= car.x - 120 && x <= car.x + 120 && y >= car.y - 180 && y <= car.y + 180) { dragNode = car; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // --- Obstacle & Bonus Spawning --- function spawnObstacle() { var obs = new Obstacle(); obs.x = Math.floor(Math.random() * (OBSTACLE_MAX_X - OBSTACLE_MIN_X)) + OBSTACLE_MIN_X; obs.y = Math.floor(Math.random() * (OBSTACLE_MAX_Y - OBSTACLE_MIN_Y)) + OBSTACLE_MIN_Y; obstacles.push(obs); game.addChild(obs); } function spawnBonus() { var bonus = new Bonus(); bonus.x = Math.floor(Math.random() * (BONUS_MAX_X - BONUS_MIN_X)) + BONUS_MIN_X; bonus.y = -150; bonuses.push(bonus); game.addChild(bonus); } // --- Collision Detection --- function rectsIntersect(a, b) { return !(a.x + a.width < b.x || a.x > b.x + b.width || a.y + a.height < b.y || a.y > b.y + b.height); } // --- Game Update Loop --- game.update = function () { ticks++; // --- Speed up over time --- speed += speedIncrease; // --- Move road lines for effect --- for (var i = 0; i < roadLines.length; i++) { var line = roadLines[i]; line.y += speed; if (line.y > 2732 + 100) { line.y -= 8 * 400; } } // --- Spawn obstacles --- if (ticks % 45 === 0) { spawnObstacle(); } // --- Spawn bonuses --- if (ticks % 120 === 0) { if (Math.random() < 0.6) { spawnBonus(); } } // --- Move obstacles --- for (var i = obstacles.length - 1; i >= 0; i--) { var obs = obstacles[i]; obs.y += speed; // Remove if off screen if (obs.y > 2732 + 200) { obs.destroy(); obstacles.splice(i, 1); continue; } // Collision with car if (rectsIntersect(car.getBounds(), obs.getBounds())) { // Flash screen red LK.effects.flashScreen(0xff0000, 800); // Save best score if (score > bestScore) { bestScore = score; storage.bestScore = bestScore; } // Show game over LK.showGameOver(); return; } } // --- Move bonuses --- for (var j = bonuses.length - 1; j >= 0; j--) { var bonus = bonuses[j]; bonus.y += speed; // Remove if off screen if (bonus.y > 2732 + 200) { bonus.destroy(); bonuses.splice(j, 1); continue; } // Collision with car if (rectsIntersect(car.getBounds(), bonus.getBounds())) { score += 5; scoreTxt.setText(score); bonus.destroy(); bonuses.splice(j, 1); // Flash car yellow LK.effects.flashObject(car, 0xffe066, 400); } } // --- Score increases with time --- if (ticks % 15 === 0) { score++; scoreTxt.setText(score); if (score > bestScore) { bestScoreTxt.setText('En İyi: ' + score); } } }; // --- Reset on Game Over --- LK.on('gameover', function () { // Save best score if (score > bestScore) { bestScore = score; storage.bestScore = bestScore; } // Reset state for (var i = 0; i < obstacles.length; i++) { obstacles[i].destroy(); } for (var j = 0; j < bonuses.length; j++) { bonuses[j].destroy(); } obstacles = []; bonuses = []; score = 0; speed = 18; ticks = 0; scoreTxt.setText('0'); bestScoreTxt.setText('En İyi: ' + bestScore); car.x = ROAD_X; car.y = CAR_START_Y; }); // --- Optional: Show best score on win as well --- LK.on('youwin', function () { if (score > bestScore) { bestScore = score; storage.bestScore = bestScore; } bestScoreTxt.setText('En İyi: ' + bestScore); });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Bonus class
var Bonus = Container.expand(function () {
var self = Container.call(this);
// Attach bonus asset (yellow ellipse, centered)
var bonusAsset = self.attachAsset('bonus', {
anchorX: 0.5,
anchorY: 0.5
});
bonusAsset.width = 120;
bonusAsset.height = 120;
// For collision
self.getBounds = function () {
return {
x: self.x - bonusAsset.width / 2,
y: self.y - bonusAsset.height / 2,
width: bonusAsset.width,
height: bonusAsset.height
};
};
return self;
});
// Car (Player) class
var Car = Container.expand(function () {
var self = Container.call(this);
// Attach car asset (red box, centered)
var carAsset = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
// Set initial size (proportional to road)
carAsset.width = 180;
carAsset.height = 320;
// For collision
self.getBounds = function () {
return {
x: self.x - carAsset.width / 2,
y: self.y - carAsset.height / 2,
width: carAsset.width,
height: carAsset.height
};
};
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
// Attach obstacle asset (gray box, centered)
var obsAsset = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
obsAsset.width = 180;
obsAsset.height = 180;
// For collision
self.getBounds = function () {
return {
x: self.x - obsAsset.width / 2,
y: self.y - obsAsset.height / 2,
width: obsAsset.width,
height: obsAsset.height
};
};
return self;
});
// Road line class (for visual effect)
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineAsset = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
lineAsset.width = 40;
lineAsset.height = 180;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// --- Game Constants ---
// --- Asset Initialization ---
var ROAD_WIDTH = 900;
var ROAD_X = 2048 / 2;
var ROAD_Y = 2732 / 2;
var ROAD_TOP = 0;
var ROAD_BOTTOM = 2732;
var ROAD_LEFT = ROAD_X - ROAD_WIDTH / 2;
var ROAD_RIGHT = ROAD_X + ROAD_WIDTH / 2;
var CAR_START_Y = 2732 - 400;
var CAR_MIN_X = ROAD_LEFT + 120;
var CAR_MAX_X = ROAD_RIGHT - 120;
var OBSTACLE_MIN_Y = -200;
var OBSTACLE_MAX_Y = -100;
var OBSTACLE_MIN_X = ROAD_LEFT + 120;
var OBSTACLE_MAX_X = ROAD_RIGHT - 120;
var BONUS_MIN_X = ROAD_LEFT + 120;
var BONUS_MAX_X = ROAD_RIGHT - 120;
// --- Game State ---
var car;
var obstacles = [];
var bonuses = [];
var roadLines = [];
var score = 0;
var bestScore = storage.bestScore || 0;
var speed = 18; // Initial speed (pixels per frame)
var speedIncrease = 0.002; // Speed increases per tick
var ticks = 0;
var dragNode = null;
var dragOffsetX = 0;
// --- UI ---
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFF700
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bestScoreTxt = new Text2('En İyi: ' + bestScore, {
size: 60,
fill: 0xFFFFFF
});
bestScoreTxt.anchor.set(0.5, 0);
bestScoreTxt.y = 120;
LK.gui.top.addChild(bestScoreTxt);
// --- Road Lines (for visual movement) ---
for (var i = 0; i < 8; i++) {
var line = new RoadLine();
line.x = ROAD_X;
line.y = i * 400 + 100;
roadLines.push(line);
game.addChild(line);
}
// --- Car ---
car = new Car();
car.x = ROAD_X;
car.y = CAR_START_Y;
game.addChild(car);
// --- Touch/Drag Controls ---
function clamp(val, min, max) {
return val < min ? min : val > max ? max : val;
}
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp car within road
dragNode.x = clamp(x, CAR_MIN_X, CAR_MAX_X);
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch is on car or below it
if (x >= car.x - 120 && x <= car.x + 120 && y >= car.y - 180 && y <= car.y + 180) {
dragNode = car;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// --- Obstacle & Bonus Spawning ---
function spawnObstacle() {
var obs = new Obstacle();
obs.x = Math.floor(Math.random() * (OBSTACLE_MAX_X - OBSTACLE_MIN_X)) + OBSTACLE_MIN_X;
obs.y = Math.floor(Math.random() * (OBSTACLE_MAX_Y - OBSTACLE_MIN_Y)) + OBSTACLE_MIN_Y;
obstacles.push(obs);
game.addChild(obs);
}
function spawnBonus() {
var bonus = new Bonus();
bonus.x = Math.floor(Math.random() * (BONUS_MAX_X - BONUS_MIN_X)) + BONUS_MIN_X;
bonus.y = -150;
bonuses.push(bonus);
game.addChild(bonus);
}
// --- Collision Detection ---
function rectsIntersect(a, b) {
return !(a.x + a.width < b.x || a.x > b.x + b.width || a.y + a.height < b.y || a.y > b.y + b.height);
}
// --- Game Update Loop ---
game.update = function () {
ticks++;
// --- Speed up over time ---
speed += speedIncrease;
// --- Move road lines for effect ---
for (var i = 0; i < roadLines.length; i++) {
var line = roadLines[i];
line.y += speed;
if (line.y > 2732 + 100) {
line.y -= 8 * 400;
}
}
// --- Spawn obstacles ---
if (ticks % 45 === 0) {
spawnObstacle();
}
// --- Spawn bonuses ---
if (ticks % 120 === 0) {
if (Math.random() < 0.6) {
spawnBonus();
}
}
// --- Move obstacles ---
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.y += speed;
// Remove if off screen
if (obs.y > 2732 + 200) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with car
if (rectsIntersect(car.getBounds(), obs.getBounds())) {
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Save best score
if (score > bestScore) {
bestScore = score;
storage.bestScore = bestScore;
}
// Show game over
LK.showGameOver();
return;
}
}
// --- Move bonuses ---
for (var j = bonuses.length - 1; j >= 0; j--) {
var bonus = bonuses[j];
bonus.y += speed;
// Remove if off screen
if (bonus.y > 2732 + 200) {
bonus.destroy();
bonuses.splice(j, 1);
continue;
}
// Collision with car
if (rectsIntersect(car.getBounds(), bonus.getBounds())) {
score += 5;
scoreTxt.setText(score);
bonus.destroy();
bonuses.splice(j, 1);
// Flash car yellow
LK.effects.flashObject(car, 0xffe066, 400);
}
}
// --- Score increases with time ---
if (ticks % 15 === 0) {
score++;
scoreTxt.setText(score);
if (score > bestScore) {
bestScoreTxt.setText('En İyi: ' + score);
}
}
};
// --- Reset on Game Over ---
LK.on('gameover', function () {
// Save best score
if (score > bestScore) {
bestScore = score;
storage.bestScore = bestScore;
}
// Reset state
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].destroy();
}
for (var j = 0; j < bonuses.length; j++) {
bonuses[j].destroy();
}
obstacles = [];
bonuses = [];
score = 0;
speed = 18;
ticks = 0;
scoreTxt.setText('0');
bestScoreTxt.setText('En İyi: ' + bestScore);
car.x = ROAD_X;
car.y = CAR_START_Y;
});
// --- Optional: Show best score on win as well ---
LK.on('youwin', function () {
if (score > bestScore) {
bestScore = score;
storage.bestScore = bestScore;
}
bestScoreTxt.setText('En İyi: ' + bestScore);
});