/**** * 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