/****
* 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);
}); ===================================================================
--- original.js
+++ change.js