/****
* 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
@@ -1,6 +1,300 @@
-/****
+/****
+* 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: 0x000000
+ 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);
});
\ No newline at end of file