User prompt
Направи така че да може да се движи свободно напред по пътищата
User prompt
Направи така че да може да се движи свободно по пътищата
User prompt
Направи вдясно барче зареждащо се два пъти по бързо от точките и ако има най-малко пет да може да се скочи и когато скочиш да се махат пет точки от барчето
User prompt
Направи вдясно барче зареждащо се на заедно с точките и ако има най-малко пет да може да се скочи и когато скочиш да се махат пет точки от барчето
User prompt
Спри увеличаването на точките при скок
User prompt
Направи на всеки 10 точки скороста на колите да се увеличава с 10%
User prompt
Направи на всеки 10 точки скороста на колите да се увеличава с 5%
User prompt
Промени играта така че колите да не преминават през камионите
User prompt
Slightly reduc the number of cars and add trucks
User prompt
Make the best score chancing during the game ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make the best score change during the game ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make the best score visible during the game
User prompt
Add best score ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make the speed of different car colors different
User prompt
If possible, differentiate the lanes better.
User prompt
Make Info button
User prompt
Make it so I can move in the air when I jump ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'ReferenceError: scoreTxt is not defined' in or related to this line: 'scoreTxt.setText(LK.getScore());' Line Number: 332
User prompt
Make main menu
User prompt
Atlamayı iki kat uzun yap ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
F1 Highway Rush
Initial prompt
F1 oyunu uç yol ,trafik akımı bize karşı ve biz araçlara çarpmamaya çalışıyoruz , ileri geri sağ sol hareketleri var ve atlama ,ama atlama beş puanlık
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var F1Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('f1Car', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1; // 0 = left, 1 = center, 2 = right
self.isJumping = false;
self.jumpStartY = 0;
self.moveToLane = function (targetLane) {
if (targetLane < 0 || targetLane > 2) {
return;
}
self.lane = targetLane;
var targetX = lanePositions[targetLane];
tween(self, {
x: targetX
}, {
duration: 200,
easing: tween.easeOut
});
};
self.jump = function () {
if (self.isJumping || jumpPower < 5) {
return;
}
self.isJumping = true;
self.jumpStartY = self.y;
// Consume 5 jump power points
jumpPower -= 5;
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
// Move player car to front (above other cars) when jumping
self.parent.addChild(self);
// Jump animation
tween(self, {
y: self.jumpStartY - 25,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 450,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.jumpStartY,
scaleX: 1,
scaleY: 1
}, {
duration: 450,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isJumping = false;
}
});
}
});
// Play sound only (no points awarded)
LK.getSound('jump').play();
};
return self;
});
var SportsCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('sportsCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12; // Faster than regular traffic
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TrafficCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('trafficCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Truck = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('truck', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1; // Slower than regular traffic
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Game state management
var gameState = "menu"; // "menu", "playing"
// Lane positions
var lanePositions = [2048 / 2 - 300, 2048 / 2, 2048 / 2 + 300];
// Global game variables
var roadBg;
var leftLane;
var rightLane;
var playerCar;
var trafficCars;
var trees;
var spawnTimer;
var gameSpeed;
var difficultyTimer;
var scoreTxt;
var levelTxt;
var currentLevel;
var dragStartX;
var dragStartY;
var isDragging;
var lastMoveTime;
var jumpPowerBarBg;
var jumpPowerBar;
var jumpPower = 0;
// Main menu elements
var menuContainer;
var titleText;
var playButton;
var playButtonText;
function createMainMenu() {
menuContainer = game.addChild(new Container());
// Game title
titleText = new Text2('F1 HIGHWAY RUSH', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 800;
menuContainer.addChild(titleText);
// Best score display
var bestScore = storage.bestScore || 0;
var bestScoreText = new Text2('BEST: ' + bestScore, {
size: 60,
fill: 0xFFD700
});
bestScoreText.anchor.set(0.5, 0.5);
bestScoreText.x = 2048 / 2;
bestScoreText.y = 950;
menuContainer.addChild(bestScoreText);
// Play button background
playButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1400,
scaleX: 0.4,
scaleY: 0.3
}));
// Play button text
playButtonText = new Text2('TAP TO PLAY', {
size: 80,
fill: 0xFFFFFF
});
playButtonText.anchor.set(0.5, 0.5);
playButtonText.x = 2048 / 2;
playButtonText.y = 1400;
menuContainer.addChild(playButtonText);
// Info button background
var infoButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1600,
scaleX: 0.3,
scaleY: 0.25
}));
// Info button text
var infoButtonText = new Text2('INFO', {
size: 60,
fill: 0xFFFFFF
});
infoButtonText.anchor.set(0.5, 0.5);
infoButtonText.x = 2048 / 2;
infoButtonText.y = 1600;
menuContainer.addChild(infoButtonText);
// Info button press effect
infoButton.down = function (x, y, obj) {
tween(infoButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
infoButton.up = function (x, y, obj) {
tween(infoButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
showInfoScreen();
}
});
};
// Button press effect
playButton.down = function (x, y, obj) {
tween(playButton, {
scaleX: 0.35,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut
});
};
playButton.up = function (x, y, obj) {
tween(playButton, {
scaleX: 0.4,
scaleY: 0.3
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
startGame();
}
});
};
}
function startGame() {
gameState = "playing";
menuContainer.destroy();
initializeGameplay();
}
function showInfoScreen() {
menuContainer.visible = false;
infoContainer = game.addChild(new Container());
// Info title
var infoTitle = new Text2('HOW TO PLAY', {
size: 100,
fill: 0xFFFFFF
});
infoTitle.anchor.set(0.5, 0.5);
infoTitle.x = 2048 / 2;
infoTitle.y = 400;
infoContainer.addChild(infoTitle);
// Instructions
var instructions = ['Avoid the cars!', 'Swipe left/right to change lanes', 'Drag up/down to move freely', 'Tap to jump over cars', 'Jump uses 5 power points', 'Power recharges over time', 'Survive as long as possible!'];
for (var i = 0; i < instructions.length; i++) {
var instructionText = new Text2(instructions[i], {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 700 + i * 100;
infoContainer.addChild(instructionText);
}
// Back button
var backButton = infoContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1800,
scaleX: 0.3,
scaleY: 0.25
}));
var backButtonText = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButtonText.anchor.set(0.5, 0.5);
backButtonText.x = 2048 / 2;
backButtonText.y = 1800;
infoContainer.addChild(backButtonText);
// Back button press effect
backButton.down = function (x, y, obj) {
tween(backButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
backButton.up = function (x, y, obj) {
tween(backButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
infoContainer.destroy();
menuContainer.visible = true;
}
});
};
}
function initializeGameplay() {
// Initialize game variables
// Create road background
roadBg = game.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 0,
scaleY: 10
}));
// Add grass on the left side of the road
var leftGrass = game.addChild(LK.getAsset('grass', {
anchorX: 1,
anchorY: 0,
x: lanePositions[0] - 300,
y: 0,
scaleX: 0.5
}));
// Add grass on the right side of the road
var rightGrass = game.addChild(LK.getAsset('grass', {
anchorX: 0,
anchorY: 0,
x: lanePositions[2] + 300,
y: 0,
scaleX: 0.5
}));
// Create lane dividers - make road corners more visible
leftLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[0] + 150,
y: 0
}));
rightLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[1] + 150,
y: 0
}));
// Add outer lane boundaries to make road edges more visible
var leftBoundary = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[0] - 150,
y: 0,
scaleX: 2
}));
var rightBoundary = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[2] + 150,
y: 0,
scaleX: 2
}));
// Create player car
playerCar = game.addChild(new F1Car());
playerCar.x = lanePositions[1];
playerCar.y = 2200;
// Traffic management
trafficCars = [];
trees = [];
spawnTimer = 0;
gameSpeed = 1;
difficultyTimer = 0;
currentLevel = 0;
// Score display - centered at top with larger size
scoreTxt = new Text2('SCORE: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.x = 0;
scoreTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
// Level display - orange color, positioned below score
levelTxt = new Text2('LEVEL 0', {
size: 60,
fill: 0xFF8C00
});
levelTxt.anchor.set(0.5, 0);
levelTxt.x = 0;
levelTxt.y = 110;
LK.gui.top.addChild(levelTxt);
// Best score display - gold color, positioned below level
var bestScoreGameTxt = new Text2('BEST: ' + (storage.bestScore || 0), {
size: 50,
fill: 0xFFD700
});
bestScoreGameTxt.anchor.set(0.5, 0);
bestScoreGameTxt.x = 0;
bestScoreGameTxt.y = 180;
LK.gui.top.addChild(bestScoreGameTxt);
// Jump power bar background
jumpPowerBarBg = game.addChild(LK.getAsset('jumpPowerBarBg', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 100,
y: 2400
}));
// Jump power bar fill
jumpPowerBar = game.addChild(LK.getAsset('jumpPowerBar', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 100,
y: 2400,
scaleY: 0
}));
// Control variables
dragStartX = 0;
dragStartY = 0;
isDragging = false;
lastMoveTime = 0;
}
// Touch controls
game.down = function (x, y, obj) {
if (gameState !== "playing") {
return;
}
dragStartX = x;
dragStartY = y;
isDragging = true;
lastMoveTime = Date.now();
};
game.move = function (x, y, obj) {
if (gameState !== "playing" || !isDragging) {
return;
}
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var currentTime = Date.now();
// Lane switching (horizontal swipe)
if (Math.abs(deltaX) > 150 && Math.abs(deltaX) > Math.abs(deltaY)) {
if (deltaX > 0 && playerCar.lane < 2) {
playerCar.moveToLane(playerCar.lane + 1);
} else if (deltaX < 0 && playerCar.lane > 0) {
playerCar.moveToLane(playerCar.lane - 1);
}
isDragging = false;
return;
}
// Free movement - follow drag position for vertical movement
if (isDragging) {
// Calculate new Y position based on drag
var newY = playerCar.y + deltaY * 0.5; // Scale factor for smooth movement
// Constrain movement within road boundaries
newY = Math.max(Math.min(newY, 2500), 200);
// Update player position
playerCar.y = newY;
if (playerCar.isJumping) {
// If jumping, update jump start position to maintain relative jump height
playerCar.jumpStartY = newY;
}
// Update drag start position for continuous movement
dragStartY = y;
}
};
game.up = function (x, y, obj) {
if (gameState !== "playing" || !isDragging) {
return;
}
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var swipeDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// Tap for jump (small movement distance indicates a tap)
if (swipeDistance < 30) {
playerCar.jump();
}
isDragging = false;
};
// Spawn traffic
function spawnTree() {
// Create tree container
var tree = new Container();
// Add trunk
var trunk = tree.attachAsset('treeTrunk', {
anchorX: 0.5,
anchorY: 1
});
// Position tree on either left or right grass area
var side = Math.random() < 0.5 ? 'left' : 'right';
if (side === 'left') {
tree.x = lanePositions[0] - 300 - Math.random() * 400; // Left grass area
} else {
tree.x = lanePositions[2] + 300 + Math.random() * 400; // Right grass area
}
tree.y = -100; // Start above screen
tree.speed = 8 + gameSpeed * 2; // Same speed as traffic
// Add update method for tree movement
tree.update = function () {
tree.y += tree.speed;
};
trees.push(tree);
game.addChild(tree);
}
function spawnTraffic() {
var lane = Math.floor(Math.random() * 3);
var traffic;
var carType = Math.random();
// 33% regular cars, 33% sports cars, 33% trucks
if (carType < 0.33) {
traffic = new TrafficCar();
traffic.speed = 8 + gameSpeed * 2;
} else if (carType < 0.66) {
traffic = new SportsCar();
traffic.speed = 12 + gameSpeed * 2;
} else {
traffic = new Truck();
traffic.speed = 6 + gameSpeed * 2;
}
traffic.x = lanePositions[lane];
traffic.y = -100;
traffic.lane = lane;
trafficCars.push(traffic);
game.addChild(traffic);
}
// Check collisions
function checkCollisions() {
for (var i = trafficCars.length - 1; i >= 0; i--) {
var traffic = trafficCars[i];
// Check collision with player (only if not jumping)
if (!playerCar.isJumping && traffic.lane === playerCar.lane) {
var distance = Math.abs(traffic.y - playerCar.y);
// Different collision distances based on car type
var collisionDistance = 150; // Default for TrafficCar
if (traffic instanceof SportsCar) {
collisionDistance = 125; // Smaller sports car
} else if (traffic instanceof Truck) {
collisionDistance = 175; // Larger truck
}
if (distance < collisionDistance) {
// Collision detected
LK.getSound('crash').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
}
// Remove off-screen traffic
if (traffic.y > 2800) {
traffic.destroy();
trafficCars.splice(i, 1);
}
}
}
// Initialize main menu
createMainMenu();
// Main game loop
game.update = function () {
if (gameState !== "playing") {
return;
}
// Update score display
scoreTxt.setText('SCORE: ' + LK.getScore());
// Spawn traffic
spawnTimer++;
var spawnRate = Math.max(30 - Math.floor(gameSpeed * 3), 15);
if (spawnTimer >= spawnRate) {
spawnTimer = 0;
spawnTraffic();
}
// Spawn trees occasionally
if (LK.ticks % 180 === 0) {
// Every 3 seconds
spawnTree();
}
// Update and cleanup trees
for (var t = trees.length - 1; t >= 0; t--) {
var tree = trees[t];
// Remove off-screen trees
if (tree.y > 2800) {
tree.destroy();
trees.splice(t, 1);
}
}
// Increase difficulty over time
difficultyTimer++;
if (difficultyTimer >= 300) {
// Every 5 seconds
difficultyTimer = 0;
gameSpeed += 0.1;
}
// Increase car speed by 10% every 10 points
var currentScore = LK.getScore();
var speedMultiplier = 1.2 + Math.floor(currentScore / 10) * 0.1;
for (var i = 0; i < trafficCars.length; i++) {
trafficCars[i].speed = (8 + gameSpeed * 2) * speedMultiplier;
}
// Check collisions
checkCollisions();
// Add survival points
if (LK.ticks % 60 === 0) {
// Every second
LK.setScore(LK.getScore() + 1);
}
// Check for level progression (every 10 points = new level)
var newLevel = Math.floor(LK.getScore() / 10);
if (newLevel > currentLevel) {
currentLevel = newLevel;
levelTxt.setText('LEVEL ' + currentLevel);
// Flash level text to indicate level up
LK.effects.flashObject(levelTxt, 0xFFD700, 1000);
}
// Update jump power (recharges slower)
if (LK.ticks % 60 === 0) {
// Every second
jumpPower = Math.min(jumpPower + 1.5, 20); // Max 20 power points
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var F1Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('f1Car', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1; // 0 = left, 1 = center, 2 = right
self.isJumping = false;
self.jumpStartY = 0;
self.moveToLane = function (targetLane) {
if (targetLane < 0 || targetLane > 2) {
return;
}
self.lane = targetLane;
var targetX = lanePositions[targetLane];
tween(self, {
x: targetX
}, {
duration: 200,
easing: tween.easeOut
});
};
self.jump = function () {
if (self.isJumping || jumpPower < 5) {
return;
}
self.isJumping = true;
self.jumpStartY = self.y;
// Consume 5 jump power points
jumpPower -= 5;
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
// Move player car to front (above other cars) when jumping
self.parent.addChild(self);
// Jump animation
tween(self, {
y: self.jumpStartY - 25,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 450,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.jumpStartY,
scaleX: 1,
scaleY: 1
}, {
duration: 450,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isJumping = false;
}
});
}
});
// Play sound only (no points awarded)
LK.getSound('jump').play();
};
return self;
});
var SportsCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('sportsCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12; // Faster than regular traffic
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TrafficCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('trafficCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Truck = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('truck', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1; // Slower than regular traffic
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Game state management
var gameState = "menu"; // "menu", "playing"
// Lane positions
var lanePositions = [2048 / 2 - 300, 2048 / 2, 2048 / 2 + 300];
// Global game variables
var roadBg;
var leftLane;
var rightLane;
var playerCar;
var trafficCars;
var trees;
var spawnTimer;
var gameSpeed;
var difficultyTimer;
var scoreTxt;
var levelTxt;
var currentLevel;
var dragStartX;
var dragStartY;
var isDragging;
var lastMoveTime;
var jumpPowerBarBg;
var jumpPowerBar;
var jumpPower = 0;
// Main menu elements
var menuContainer;
var titleText;
var playButton;
var playButtonText;
function createMainMenu() {
menuContainer = game.addChild(new Container());
// Game title
titleText = new Text2('F1 HIGHWAY RUSH', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 800;
menuContainer.addChild(titleText);
// Best score display
var bestScore = storage.bestScore || 0;
var bestScoreText = new Text2('BEST: ' + bestScore, {
size: 60,
fill: 0xFFD700
});
bestScoreText.anchor.set(0.5, 0.5);
bestScoreText.x = 2048 / 2;
bestScoreText.y = 950;
menuContainer.addChild(bestScoreText);
// Play button background
playButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1400,
scaleX: 0.4,
scaleY: 0.3
}));
// Play button text
playButtonText = new Text2('TAP TO PLAY', {
size: 80,
fill: 0xFFFFFF
});
playButtonText.anchor.set(0.5, 0.5);
playButtonText.x = 2048 / 2;
playButtonText.y = 1400;
menuContainer.addChild(playButtonText);
// Info button background
var infoButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1600,
scaleX: 0.3,
scaleY: 0.25
}));
// Info button text
var infoButtonText = new Text2('INFO', {
size: 60,
fill: 0xFFFFFF
});
infoButtonText.anchor.set(0.5, 0.5);
infoButtonText.x = 2048 / 2;
infoButtonText.y = 1600;
menuContainer.addChild(infoButtonText);
// Info button press effect
infoButton.down = function (x, y, obj) {
tween(infoButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
infoButton.up = function (x, y, obj) {
tween(infoButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
showInfoScreen();
}
});
};
// Button press effect
playButton.down = function (x, y, obj) {
tween(playButton, {
scaleX: 0.35,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut
});
};
playButton.up = function (x, y, obj) {
tween(playButton, {
scaleX: 0.4,
scaleY: 0.3
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
startGame();
}
});
};
}
function startGame() {
gameState = "playing";
menuContainer.destroy();
initializeGameplay();
}
function showInfoScreen() {
menuContainer.visible = false;
infoContainer = game.addChild(new Container());
// Info title
var infoTitle = new Text2('HOW TO PLAY', {
size: 100,
fill: 0xFFFFFF
});
infoTitle.anchor.set(0.5, 0.5);
infoTitle.x = 2048 / 2;
infoTitle.y = 400;
infoContainer.addChild(infoTitle);
// Instructions
var instructions = ['Avoid the cars!', 'Swipe left/right to change lanes', 'Drag up/down to move freely', 'Tap to jump over cars', 'Jump uses 5 power points', 'Power recharges over time', 'Survive as long as possible!'];
for (var i = 0; i < instructions.length; i++) {
var instructionText = new Text2(instructions[i], {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 700 + i * 100;
infoContainer.addChild(instructionText);
}
// Back button
var backButton = infoContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1800,
scaleX: 0.3,
scaleY: 0.25
}));
var backButtonText = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButtonText.anchor.set(0.5, 0.5);
backButtonText.x = 2048 / 2;
backButtonText.y = 1800;
infoContainer.addChild(backButtonText);
// Back button press effect
backButton.down = function (x, y, obj) {
tween(backButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
backButton.up = function (x, y, obj) {
tween(backButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
infoContainer.destroy();
menuContainer.visible = true;
}
});
};
}
function initializeGameplay() {
// Initialize game variables
// Create road background
roadBg = game.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 0,
scaleY: 10
}));
// Add grass on the left side of the road
var leftGrass = game.addChild(LK.getAsset('grass', {
anchorX: 1,
anchorY: 0,
x: lanePositions[0] - 300,
y: 0,
scaleX: 0.5
}));
// Add grass on the right side of the road
var rightGrass = game.addChild(LK.getAsset('grass', {
anchorX: 0,
anchorY: 0,
x: lanePositions[2] + 300,
y: 0,
scaleX: 0.5
}));
// Create lane dividers - make road corners more visible
leftLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[0] + 150,
y: 0
}));
rightLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[1] + 150,
y: 0
}));
// Add outer lane boundaries to make road edges more visible
var leftBoundary = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[0] - 150,
y: 0,
scaleX: 2
}));
var rightBoundary = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[2] + 150,
y: 0,
scaleX: 2
}));
// Create player car
playerCar = game.addChild(new F1Car());
playerCar.x = lanePositions[1];
playerCar.y = 2200;
// Traffic management
trafficCars = [];
trees = [];
spawnTimer = 0;
gameSpeed = 1;
difficultyTimer = 0;
currentLevel = 0;
// Score display - centered at top with larger size
scoreTxt = new Text2('SCORE: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.x = 0;
scoreTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
// Level display - orange color, positioned below score
levelTxt = new Text2('LEVEL 0', {
size: 60,
fill: 0xFF8C00
});
levelTxt.anchor.set(0.5, 0);
levelTxt.x = 0;
levelTxt.y = 110;
LK.gui.top.addChild(levelTxt);
// Best score display - gold color, positioned below level
var bestScoreGameTxt = new Text2('BEST: ' + (storage.bestScore || 0), {
size: 50,
fill: 0xFFD700
});
bestScoreGameTxt.anchor.set(0.5, 0);
bestScoreGameTxt.x = 0;
bestScoreGameTxt.y = 180;
LK.gui.top.addChild(bestScoreGameTxt);
// Jump power bar background
jumpPowerBarBg = game.addChild(LK.getAsset('jumpPowerBarBg', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 100,
y: 2400
}));
// Jump power bar fill
jumpPowerBar = game.addChild(LK.getAsset('jumpPowerBar', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 100,
y: 2400,
scaleY: 0
}));
// Control variables
dragStartX = 0;
dragStartY = 0;
isDragging = false;
lastMoveTime = 0;
}
// Touch controls
game.down = function (x, y, obj) {
if (gameState !== "playing") {
return;
}
dragStartX = x;
dragStartY = y;
isDragging = true;
lastMoveTime = Date.now();
};
game.move = function (x, y, obj) {
if (gameState !== "playing" || !isDragging) {
return;
}
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var currentTime = Date.now();
// Lane switching (horizontal swipe)
if (Math.abs(deltaX) > 150 && Math.abs(deltaX) > Math.abs(deltaY)) {
if (deltaX > 0 && playerCar.lane < 2) {
playerCar.moveToLane(playerCar.lane + 1);
} else if (deltaX < 0 && playerCar.lane > 0) {
playerCar.moveToLane(playerCar.lane - 1);
}
isDragging = false;
return;
}
// Free movement - follow drag position for vertical movement
if (isDragging) {
// Calculate new Y position based on drag
var newY = playerCar.y + deltaY * 0.5; // Scale factor for smooth movement
// Constrain movement within road boundaries
newY = Math.max(Math.min(newY, 2500), 200);
// Update player position
playerCar.y = newY;
if (playerCar.isJumping) {
// If jumping, update jump start position to maintain relative jump height
playerCar.jumpStartY = newY;
}
// Update drag start position for continuous movement
dragStartY = y;
}
};
game.up = function (x, y, obj) {
if (gameState !== "playing" || !isDragging) {
return;
}
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var swipeDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// Tap for jump (small movement distance indicates a tap)
if (swipeDistance < 30) {
playerCar.jump();
}
isDragging = false;
};
// Spawn traffic
function spawnTree() {
// Create tree container
var tree = new Container();
// Add trunk
var trunk = tree.attachAsset('treeTrunk', {
anchorX: 0.5,
anchorY: 1
});
// Position tree on either left or right grass area
var side = Math.random() < 0.5 ? 'left' : 'right';
if (side === 'left') {
tree.x = lanePositions[0] - 300 - Math.random() * 400; // Left grass area
} else {
tree.x = lanePositions[2] + 300 + Math.random() * 400; // Right grass area
}
tree.y = -100; // Start above screen
tree.speed = 8 + gameSpeed * 2; // Same speed as traffic
// Add update method for tree movement
tree.update = function () {
tree.y += tree.speed;
};
trees.push(tree);
game.addChild(tree);
}
function spawnTraffic() {
var lane = Math.floor(Math.random() * 3);
var traffic;
var carType = Math.random();
// 33% regular cars, 33% sports cars, 33% trucks
if (carType < 0.33) {
traffic = new TrafficCar();
traffic.speed = 8 + gameSpeed * 2;
} else if (carType < 0.66) {
traffic = new SportsCar();
traffic.speed = 12 + gameSpeed * 2;
} else {
traffic = new Truck();
traffic.speed = 6 + gameSpeed * 2;
}
traffic.x = lanePositions[lane];
traffic.y = -100;
traffic.lane = lane;
trafficCars.push(traffic);
game.addChild(traffic);
}
// Check collisions
function checkCollisions() {
for (var i = trafficCars.length - 1; i >= 0; i--) {
var traffic = trafficCars[i];
// Check collision with player (only if not jumping)
if (!playerCar.isJumping && traffic.lane === playerCar.lane) {
var distance = Math.abs(traffic.y - playerCar.y);
// Different collision distances based on car type
var collisionDistance = 150; // Default for TrafficCar
if (traffic instanceof SportsCar) {
collisionDistance = 125; // Smaller sports car
} else if (traffic instanceof Truck) {
collisionDistance = 175; // Larger truck
}
if (distance < collisionDistance) {
// Collision detected
LK.getSound('crash').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
}
// Remove off-screen traffic
if (traffic.y > 2800) {
traffic.destroy();
trafficCars.splice(i, 1);
}
}
}
// Initialize main menu
createMainMenu();
// Main game loop
game.update = function () {
if (gameState !== "playing") {
return;
}
// Update score display
scoreTxt.setText('SCORE: ' + LK.getScore());
// Spawn traffic
spawnTimer++;
var spawnRate = Math.max(30 - Math.floor(gameSpeed * 3), 15);
if (spawnTimer >= spawnRate) {
spawnTimer = 0;
spawnTraffic();
}
// Spawn trees occasionally
if (LK.ticks % 180 === 0) {
// Every 3 seconds
spawnTree();
}
// Update and cleanup trees
for (var t = trees.length - 1; t >= 0; t--) {
var tree = trees[t];
// Remove off-screen trees
if (tree.y > 2800) {
tree.destroy();
trees.splice(t, 1);
}
}
// Increase difficulty over time
difficultyTimer++;
if (difficultyTimer >= 300) {
// Every 5 seconds
difficultyTimer = 0;
gameSpeed += 0.1;
}
// Increase car speed by 10% every 10 points
var currentScore = LK.getScore();
var speedMultiplier = 1.2 + Math.floor(currentScore / 10) * 0.1;
for (var i = 0; i < trafficCars.length; i++) {
trafficCars[i].speed = (8 + gameSpeed * 2) * speedMultiplier;
}
// Check collisions
checkCollisions();
// Add survival points
if (LK.ticks % 60 === 0) {
// Every second
LK.setScore(LK.getScore() + 1);
}
// Check for level progression (every 10 points = new level)
var newLevel = Math.floor(LK.getScore() / 10);
if (newLevel > currentLevel) {
currentLevel = newLevel;
levelTxt.setText('LEVEL ' + currentLevel);
// Flash level text to indicate level up
LK.effects.flashObject(levelTxt, 0xFFD700, 1000);
}
// Update jump power (recharges slower)
if (LK.ticks % 60 === 0) {
// Every second
jumpPower = Math.min(jumpPower + 1.5, 20); // Max 20 power points
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
}
};
F1 from a bird's eye view. In-Game asset. High contrast. No shadows
car bird's eye view. In-Game asset. 2d. High contrast. No shadows
Red car bird's eye view. In-Game asset. 2d. High contrast. No shadows
Yellow car bird's eye view. In-Game asset. 2d. High contrast. No shadows
Tree 2d. In-Game asset. 2d. High contrast. No shadows
Blue F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows
Green F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows
Purple F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows
Yellow F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows