User prompt
play the sounds crash when you crash
User prompt
Put the best score in the game instead of the menu.
User prompt
change the color of the best score text to red or something
User prompt
Add a best score. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
can you get rid of the green flash when you don't die
User prompt
The speed thing doesn't work.
User prompt
The road lines go through my car.
User prompt
Make the road nicer.
User prompt
Add a whole menu, then you can click play or tutorial.
Code edit (1 edits merged)
Please save this source code
User prompt
Highway Dash
Initial prompt
Make a game where you can drive a car, and you have to dodge the other cars.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.maxSpeed = 8;
self.acceleration = 0.3;
self.deceleration = 0.2;
self.update = function () {
// Apply speed limits
if (self.speed > self.maxSpeed) self.speed = self.maxSpeed;
if (self.speed < -self.maxSpeed) self.speed = -self.maxSpeed;
// Apply deceleration when no input
if (self.speed > 0) {
self.speed -= self.deceleration;
if (self.speed < 0) self.speed = 0;
} else if (self.speed < 0) {
self.speed += self.deceleration;
if (self.speed > 0) self.speed = 0;
}
self.x += self.speed;
// Keep player car within screen bounds
if (self.x < 60) self.x = 60;
if (self.x > 1988) self.x = 1988;
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += gameSpeed;
};
return self;
});
var TrafficCar = Container.expand(function (carType) {
var self = Container.call(this);
var assetId = carType || 'enemyCar';
var carGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8 + Math.random() * 4;
self.type = carType;
self.update = function () {
self.y += self.speed + gameSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
var playerCar = null;
var trafficCars = [];
var roadLines = [];
var gameSpeed = 6;
var spawnTimer = 0;
var lineSpawnTimer = 0;
var speedIncreaseTimer = 0;
var distanceScore = 0;
var nearMissScore = 0;
var lanes = [400, 650, 900, 1150, 1400];
var dragNode = null;
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create speed display
var speedTxt = new Text2('Speed: 6', {
size: 60,
fill: 0xFFFFFF
});
speedTxt.anchor.set(1, 0);
speedTxt.y = 100;
LK.gui.topRight.addChild(speedTxt);
// Initialize player car
playerCar = game.addChild(new PlayerCar());
playerCar.x = 1024;
playerCar.y = 2200;
// Create initial road lines
for (var i = 0; i < 8; i++) {
for (var lane = 1; lane < lanes.length; lane++) {
var roadLine = new RoadLine();
roadLine.x = lanes[lane] - 75;
roadLine.y = i * 200;
roadLines.push(roadLine);
game.addChild(roadLine);
}
}
function spawnTrafficCar() {
var carType = Math.random() < 0.3 ? 'truck' : 'enemyCar';
var trafficCar = new TrafficCar(carType);
var laneIndex = Math.floor(Math.random() * lanes.length);
trafficCar.x = lanes[laneIndex];
trafficCar.y = -100;
trafficCars.push(trafficCar);
game.addChild(trafficCar);
}
function checkNearMiss(car) {
var distance = Math.sqrt(Math.pow(playerCar.x - car.x, 2) + Math.pow(playerCar.y - car.y, 2));
if (distance < 200 && distance > 120) {
if (!car.nearMissTriggered) {
car.nearMissTriggered = true;
nearMissScore += 10;
LK.getSound('whoosh').play();
// Flash effect for near miss
tween(car, {
tint: 0xffff00
}, {
duration: 100,
onFinish: function onFinish() {
tween(car, {
tint: 0xffffff
}, {
duration: 100
});
}
});
}
}
}
function handleMove(x, y, obj) {
if (dragNode) {
var deltaX = x - dragNode.lastX;
dragNode.lastX = x;
// Move player car based on drag
if (deltaX > 0) {
playerCar.speed += playerCar.acceleration;
} else if (deltaX < 0) {
playerCar.speed -= playerCar.acceleration;
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = {
lastX: x
};
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
// Update distance score
distanceScore += 1;
var totalScore = distanceScore + nearMissScore;
LK.setScore(totalScore);
scoreTxt.setText('Score: ' + totalScore);
speedTxt.setText('Speed: ' + Math.floor(gameSpeed));
// Increase game speed over time
speedIncreaseTimer++;
if (speedIncreaseTimer > 300) {
// Every 5 seconds at 60fps
gameSpeed += 0.2;
speedIncreaseTimer = 0;
}
// Spawn traffic cars
spawnTimer++;
var spawnRate = Math.max(60 - Math.floor(gameSpeed), 30);
if (spawnTimer > spawnRate) {
spawnTrafficCar();
spawnTimer = 0;
}
// Spawn road lines
lineSpawnTimer++;
if (lineSpawnTimer > 50) {
for (var lane = 1; lane < lanes.length; lane++) {
var roadLine = new RoadLine();
roadLine.x = lanes[lane] - 75;
roadLine.y = -30;
roadLines.push(roadLine);
game.addChild(roadLine);
}
lineSpawnTimer = 0;
}
// Update and check traffic cars
for (var i = trafficCars.length - 1; i >= 0; i--) {
var car = trafficCars[i];
// Check for collision
if (playerCar.intersects(car)) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
// Check for near miss
checkNearMiss(car);
// Remove cars that are off screen
if (car.y > 2800) {
car.destroy();
trafficCars.splice(i, 1);
}
}
// Update and remove road lines
for (var j = roadLines.length - 1; j >= 0; j--) {
var line = roadLines[j];
if (line.y > 2800) {
line.destroy();
roadLines.splice(j, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,227 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var PlayerCar = Container.expand(function () {
+ var self = Container.call(this);
+ var carGraphics = self.attachAsset('playerCar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0;
+ self.maxSpeed = 8;
+ self.acceleration = 0.3;
+ self.deceleration = 0.2;
+ self.update = function () {
+ // Apply speed limits
+ if (self.speed > self.maxSpeed) self.speed = self.maxSpeed;
+ if (self.speed < -self.maxSpeed) self.speed = -self.maxSpeed;
+ // Apply deceleration when no input
+ if (self.speed > 0) {
+ self.speed -= self.deceleration;
+ if (self.speed < 0) self.speed = 0;
+ } else if (self.speed < 0) {
+ self.speed += self.deceleration;
+ if (self.speed > 0) self.speed = 0;
+ }
+ self.x += self.speed;
+ // Keep player car within screen bounds
+ if (self.x < 60) self.x = 60;
+ if (self.x > 1988) self.x = 1988;
+ };
+ return self;
+});
+var RoadLine = Container.expand(function () {
+ var self = Container.call(this);
+ var lineGraphics = self.attachAsset('roadLine', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ self.y += gameSpeed;
+ };
+ return self;
+});
+var TrafficCar = Container.expand(function (carType) {
+ var self = Container.call(this);
+ var assetId = carType || 'enemyCar';
+ var carGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8 + Math.random() * 4;
+ self.type = carType;
+ self.update = function () {
+ self.y += self.speed + gameSpeed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2c3e50
+});
+
+/****
+* Game Code
+****/
+var playerCar = null;
+var trafficCars = [];
+var roadLines = [];
+var gameSpeed = 6;
+var spawnTimer = 0;
+var lineSpawnTimer = 0;
+var speedIncreaseTimer = 0;
+var distanceScore = 0;
+var nearMissScore = 0;
+var lanes = [400, 650, 900, 1150, 1400];
+var dragNode = null;
+// Create score display
+var scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Create speed display
+var speedTxt = new Text2('Speed: 6', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+speedTxt.anchor.set(1, 0);
+speedTxt.y = 100;
+LK.gui.topRight.addChild(speedTxt);
+// Initialize player car
+playerCar = game.addChild(new PlayerCar());
+playerCar.x = 1024;
+playerCar.y = 2200;
+// Create initial road lines
+for (var i = 0; i < 8; i++) {
+ for (var lane = 1; lane < lanes.length; lane++) {
+ var roadLine = new RoadLine();
+ roadLine.x = lanes[lane] - 75;
+ roadLine.y = i * 200;
+ roadLines.push(roadLine);
+ game.addChild(roadLine);
+ }
+}
+function spawnTrafficCar() {
+ var carType = Math.random() < 0.3 ? 'truck' : 'enemyCar';
+ var trafficCar = new TrafficCar(carType);
+ var laneIndex = Math.floor(Math.random() * lanes.length);
+ trafficCar.x = lanes[laneIndex];
+ trafficCar.y = -100;
+ trafficCars.push(trafficCar);
+ game.addChild(trafficCar);
+}
+function checkNearMiss(car) {
+ var distance = Math.sqrt(Math.pow(playerCar.x - car.x, 2) + Math.pow(playerCar.y - car.y, 2));
+ if (distance < 200 && distance > 120) {
+ if (!car.nearMissTriggered) {
+ car.nearMissTriggered = true;
+ nearMissScore += 10;
+ LK.getSound('whoosh').play();
+ // Flash effect for near miss
+ tween(car, {
+ tint: 0xffff00
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(car, {
+ tint: 0xffffff
+ }, {
+ duration: 100
+ });
+ }
+ });
+ }
+ }
+}
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ var deltaX = x - dragNode.lastX;
+ dragNode.lastX = x;
+ // Move player car based on drag
+ if (deltaX > 0) {
+ playerCar.speed += playerCar.acceleration;
+ } else if (deltaX < 0) {
+ playerCar.speed -= playerCar.acceleration;
+ }
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = {
+ lastX: x
+ };
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+game.update = function () {
+ // Update distance score
+ distanceScore += 1;
+ var totalScore = distanceScore + nearMissScore;
+ LK.setScore(totalScore);
+ scoreTxt.setText('Score: ' + totalScore);
+ speedTxt.setText('Speed: ' + Math.floor(gameSpeed));
+ // Increase game speed over time
+ speedIncreaseTimer++;
+ if (speedIncreaseTimer > 300) {
+ // Every 5 seconds at 60fps
+ gameSpeed += 0.2;
+ speedIncreaseTimer = 0;
+ }
+ // Spawn traffic cars
+ spawnTimer++;
+ var spawnRate = Math.max(60 - Math.floor(gameSpeed), 30);
+ if (spawnTimer > spawnRate) {
+ spawnTrafficCar();
+ spawnTimer = 0;
+ }
+ // Spawn road lines
+ lineSpawnTimer++;
+ if (lineSpawnTimer > 50) {
+ for (var lane = 1; lane < lanes.length; lane++) {
+ var roadLine = new RoadLine();
+ roadLine.x = lanes[lane] - 75;
+ roadLine.y = -30;
+ roadLines.push(roadLine);
+ game.addChild(roadLine);
+ }
+ lineSpawnTimer = 0;
+ }
+ // Update and check traffic cars
+ for (var i = trafficCars.length - 1; i >= 0; i--) {
+ var car = trafficCars[i];
+ // Check for collision
+ if (playerCar.intersects(car)) {
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ // Check for near miss
+ checkNearMiss(car);
+ // Remove cars that are off screen
+ if (car.y > 2800) {
+ car.destroy();
+ trafficCars.splice(i, 1);
+ }
+ }
+ // Update and remove road lines
+ for (var j = roadLines.length - 1; j >= 0; j--) {
+ var line = roadLines[j];
+ if (line.y > 2800) {
+ line.destroy();
+ roadLines.splice(j, 1);
+ }
+ }
+};
\ No newline at end of file