User prompt
Make a good and realistic graphic game but good
User prompt
Make a realistic bike driving game ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Create a game like a free city and our character a man can explore the full city and drive every vehicle and trains in the game
User prompt
Create a game like minecraft
Code edit (1 edits merged)
Please save this source code
User prompt
Bubble Pop Frenzy
Initial prompt
Make a game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bike = Container.expand(function () {
var self = Container.call(this);
var bikeGraphics = self.attachAsset('bike', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.maxSpeed = 15;
self.acceleration = 0.3;
self.deceleration = 0.2;
self.turnSpeed = 3;
self.angle = 0;
self.isAccelerating = false;
self.isBraking = false;
self.lastY = self.y;
self.lastSpeed = self.speed;
return self;
});
var PowerUp = Container.expand(function (type, x, y) {
var self = Container.call(this);
self.powerType = type || 'speed';
self.lastIntersecting = false;
self.collected = false;
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
return self;
});
var RoadObstacle = Container.expand(function (type, x, y) {
var self = Container.call(this);
self.obstacleType = type || 'obstacle';
self.lastIntersecting = false;
var assetName = type === 'powerup' ? 'powerup' : 'obstacle';
var obstacleGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228b22
});
/****
* Game Code
****/
var obstacles = [];
var powerups = [];
var roadElements = [];
var raceDistance = 0;
var targetDistance = 10000;
var gameSpeed = 2;
var isGameRunning = true;
// Bike
var bike = new Bike();
bike.x = 1024;
bike.y = 2200;
game.addChild(bike);
// UI Elements
var speedText = new Text2('0 KM/H', {
size: 40,
fill: 0xFFFFFF
});
speedText.anchor.set(0, 0);
speedText.x = 50;
speedText.y = 50;
LK.gui.topLeft.addChild(speedText);
var distanceText = new Text2('DISTANCE: 0M', {
size: 35,
fill: 0xFFFFFF
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
var controlText = new Text2('TAP TO ACCELERATE', {
size: 30,
fill: 0xFFFFFF
});
controlText.anchor.set(0.5, 1);
controlText.y = -20;
LK.gui.bottom.addChild(controlText);
// Initialize racing track
function generateTrack() {
// Create road segments
for (var i = 0; i < 30; i++) {
var roadSegment = LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5
});
roadSegment.x = 1024;
roadSegment.y = -200 - i * 150;
roadElements.push(roadSegment);
game.addChild(roadSegment);
}
// Spawn initial obstacles and powerups
spawnObstacles();
}
function spawnObstacles() {
// Spawn obstacles
for (var i = 0; i < 15; i++) {
var obstacle = new RoadObstacle('obstacle');
obstacle.x = 700 + Math.random() * 648; // Keep on road
obstacle.y = -500 - i * 300;
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Spawn powerups
for (var i = 0; i < 5; i++) {
var powerup = new PowerUp('speed');
powerup.x = 700 + Math.random() * 648;
powerup.y = -800 - i * 800;
powerups.push(powerup);
game.addChild(powerup);
}
}
function updateBikePhysics() {
// Handle acceleration and deceleration
if (bike.isAccelerating) {
bike.speed = Math.min(bike.speed + bike.acceleration, bike.maxSpeed);
} else {
bike.speed = Math.max(bike.speed - bike.deceleration, 0);
}
// Update speedometer with smooth tween
var displaySpeed = Math.round(bike.speed * 10);
speedText.setText(displaySpeed + ' KM/H');
// Apply engine sound based on speed
if (bike.speed > 0) {
LK.getSound('bikeEngine').play();
}
}
function spawnNewObstacles() {
// Spawn new obstacles ahead of the bike
if (Math.random() < 0.3) {
var obstacle = new RoadObstacle('obstacle');
obstacle.x = 700 + Math.random() * 648;
obstacle.y = -100;
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Spawn powerups occasionally
if (Math.random() < 0.1) {
var powerup = new PowerUp('speed');
powerup.x = 700 + Math.random() * 648;
powerup.y = -100;
powerups.push(powerup);
game.addChild(powerup);
}
}
function checkCollisions() {
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
var currentIntersecting = bike.intersects(obstacle);
if (!obstacle.lastIntersecting && currentIntersecting) {
// Collision detected - crash bike
LK.getSound('crash').play();
tween(bike, {
speed: 0
}, {
duration: 500,
easing: tween.easeOut
});
LK.effects.flashScreen(0xff0000, 500);
bike.speed = 0;
}
obstacle.lastIntersecting = currentIntersecting;
}
// Check powerup collection
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
var currentIntersecting = bike.intersects(powerup);
if (!powerup.lastIntersecting && currentIntersecting && !powerup.collected) {
// Powerup collected
powerup.collected = true;
LK.getSound('powerup').play();
bike.maxSpeed += 3;
tween(powerup, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
powerup.destroy();
powerups.splice(i, 1);
}
});
LK.setScore(LK.getScore() + 50);
}
powerup.lastIntersecting = currentIntersecting;
}
}
generateTrack();
game.down = function (x, y, obj) {
// Start accelerating
bike.isAccelerating = true;
};
game.up = function (x, y, obj) {
// Stop accelerating
bike.isAccelerating = false;
};
game.move = function (x, y, obj) {
// Steer bike left and right
var deltaX = x - bike.x;
if (Math.abs(deltaX) > 20) {
bike.x += deltaX * 0.05;
// Keep bike on track
bike.x = Math.max(700, Math.min(1348, bike.x));
}
};
game.update = function () {
if (!isGameRunning) return;
// Update bike physics
updateBikePhysics();
// Move world elements down based on bike speed
var worldSpeed = gameSpeed + bike.speed * 0.5;
// Move road segments
for (var i = 0; i < roadElements.length; i++) {
var road = roadElements[i];
road.y += worldSpeed;
if (road.y > 2832) {
road.y = roadElements[(i - 1 + roadElements.length) % roadElements.length].y - 150;
}
}
// Move obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.y += worldSpeed;
if (obstacle.y > 2832) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
// Move powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
powerup.y += worldSpeed;
if (powerup.y > 2832) {
powerup.destroy();
powerups.splice(i, 1);
}
}
// Update race progress
raceDistance += worldSpeed * 0.1;
distanceText.setText('DISTANCE: ' + Math.round(raceDistance) + 'M');
// Check win condition
if (raceDistance >= targetDistance) {
isGameRunning = false;
LK.showYouWin();
}
// Spawn new obstacles and powerups
if (LK.ticks % 60 === 0) {
spawnNewObstacles();
}
// Check collisions
checkCollisions();
// Keep bike in racing bounds
bike.x = Math.max(700, Math.min(1348, bike.x));
}; ===================================================================
--- original.js
+++ change.js
@@ -5,274 +5,271 @@
/****
* Classes
****/
-var Character = Container.expand(function () {
+var Bike = Container.expand(function () {
var self = Container.call(this);
- var characterGraphics = self.attachAsset('character', {
+ var bikeGraphics = self.attachAsset('bike', {
anchorX: 0.5,
- anchorY: 1
+ anchorY: 0.5
});
- self.speed = 5;
- self.isInVehicle = false;
- self.currentVehicle = null;
+ self.speed = 0;
+ self.maxSpeed = 15;
+ self.acceleration = 0.3;
+ self.deceleration = 0.2;
+ self.turnSpeed = 3;
+ self.angle = 0;
+ self.isAccelerating = false;
+ self.isBraking = false;
+ self.lastY = self.y;
+ self.lastSpeed = self.speed;
return self;
});
-var CityElement = Container.expand(function (type, gridX, gridY) {
+var PowerUp = Container.expand(function (type, x, y) {
var self = Container.call(this);
- self.elementType = type || 'road';
- self.gridX = gridX;
- self.gridY = gridY;
- var assetName = 'road';
- if (self.elementType === 'building') {
- assetName = 'building';
- } else if (self.elementType === 'park') {
- assetName = 'park';
- } else if (self.elementType === 'road') {
- assetName = 'road';
- }
- var elementGraphics = self.attachAsset(assetName, {
- anchorX: 0,
- anchorY: 0
+ self.powerType = type || 'speed';
+ self.lastIntersecting = false;
+ self.collected = false;
+ var powerupGraphics = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
});
- self.down = function (x, y, obj) {
- // Interact with city element
- console.log('Interacted with', self.elementType);
- };
+ self.x = x;
+ self.y = y;
return self;
});
-var Vehicle = Container.expand(function (type, x, y) {
+var RoadObstacle = Container.expand(function (type, x, y) {
var self = Container.call(this);
- self.vehicleType = type || 'car';
- self.speed = type === 'train' ? 8 : type === 'bus' ? 4 : 6;
- self.occupied = false;
- var assetName = type;
- var vehicleGraphics = self.attachAsset(assetName, {
+ self.obstacleType = type || 'obstacle';
+ self.lastIntersecting = false;
+ var assetName = type === 'powerup' ? 'powerup' : 'obstacle';
+ var obstacleGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
- self.down = function (x, y, obj) {
- if (!self.occupied && !character.isInVehicle) {
- // Enter vehicle
- character.isInVehicle = true;
- character.currentVehicle = self;
- self.occupied = true;
- character.x = self.x;
- character.y = self.y;
- if (self.vehicleType === 'car') {
- LK.getSound('carEngine').play();
- } else if (self.vehicleType === 'train') {
- LK.getSound('trainHorn').play();
- }
- }
- };
+ self.x = x;
+ self.y = y;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x87CEEB
+ backgroundColor: 0x228b22
});
/****
* Game Code
****/
-var cityMap = [];
-var cityWidth = 25;
-var cityHeight = 20;
-var tileSize = 100;
-var cameraX = 0;
-var cameraY = 0;
-var vehicles = [];
-var explorationMode = true;
-// Character
-var character = new Character();
-character.x = 1024;
-character.y = 1366;
-game.addChild(character);
+var obstacles = [];
+var powerups = [];
+var roadElements = [];
+var raceDistance = 0;
+var targetDistance = 10000;
+var gameSpeed = 2;
+var isGameRunning = true;
+// Bike
+var bike = new Bike();
+bike.x = 1024;
+bike.y = 2200;
+game.addChild(bike);
// UI Elements
-var statusText = new Text2('EXPLORING CITY', {
- size: 50,
+var speedText = new Text2('0 KM/H', {
+ size: 40,
fill: 0xFFFFFF
});
-statusText.anchor.set(0.5, 0);
-LK.gui.top.addChild(statusText);
-var minimap = LK.getAsset('minimap', {
- anchorX: 1,
- anchorY: 0
-});
-LK.gui.topRight.addChild(minimap);
-var vehicleText = new Text2('ON FOOT', {
+speedText.anchor.set(0, 0);
+speedText.x = 50;
+speedText.y = 50;
+LK.gui.topLeft.addChild(speedText);
+var distanceText = new Text2('DISTANCE: 0M', {
size: 35,
fill: 0xFFFFFF
});
-vehicleText.anchor.set(0.5, 1);
-vehicleText.y = -20;
-LK.gui.bottom.addChild(vehicleText);
-// Initialize city layout
-function generateCity() {
- for (var x = 0; x < cityWidth; x++) {
- cityMap[x] = [];
- for (var y = 0; y < cityHeight; y++) {
- cityMap[x][y] = null;
- // Generate city layout
- var elementType = 'road'; // Default roads
- // Create building blocks
- if ((x % 4 === 1 || x % 4 === 2) && (y % 4 === 1 || y % 4 === 2)) {
- elementType = 'building';
- }
- // Add parks occasionally
- if (x % 8 === 0 && y % 8 === 0) {
- elementType = 'park';
- }
- var cityElement = new CityElement(elementType, x, y);
- cityElement.x = x * tileSize;
- cityElement.y = y * tileSize;
- cityMap[x][y] = cityElement;
- game.addChild(cityElement);
- }
+distanceText.anchor.set(0.5, 0);
+LK.gui.top.addChild(distanceText);
+var controlText = new Text2('TAP TO ACCELERATE', {
+ size: 30,
+ fill: 0xFFFFFF
+});
+controlText.anchor.set(0.5, 1);
+controlText.y = -20;
+LK.gui.bottom.addChild(controlText);
+// Initialize racing track
+function generateTrack() {
+ // Create road segments
+ for (var i = 0; i < 30; i++) {
+ var roadSegment = LK.getAsset('road', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ roadSegment.x = 1024;
+ roadSegment.y = -200 - i * 150;
+ roadElements.push(roadSegment);
+ game.addChild(roadSegment);
}
- // Spawn vehicles around the city
- spawnVehicles();
+ // Spawn initial obstacles and powerups
+ spawnObstacles();
}
-function spawnVehicles() {
- // Spawn cars on roads
- for (var i = 0; i < 8; i++) {
- var car = new Vehicle('car');
- car.x = Math.random() * 2048;
- car.y = Math.random() * 2732;
- vehicles.push(car);
- game.addChild(car);
+function spawnObstacles() {
+ // Spawn obstacles
+ for (var i = 0; i < 15; i++) {
+ var obstacle = new RoadObstacle('obstacle');
+ obstacle.x = 700 + Math.random() * 648; // Keep on road
+ obstacle.y = -500 - i * 300;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
}
- // Spawn buses
- for (var i = 0; i < 3; i++) {
- var bus = new Vehicle('bus');
- bus.x = Math.random() * 2048;
- bus.y = Math.random() * 2732;
- vehicles.push(bus);
- game.addChild(bus);
+ // Spawn powerups
+ for (var i = 0; i < 5; i++) {
+ var powerup = new PowerUp('speed');
+ powerup.x = 700 + Math.random() * 648;
+ powerup.y = -800 - i * 800;
+ powerups.push(powerup);
+ game.addChild(powerup);
}
- // Spawn trains
- for (var i = 0; i < 2; i++) {
- var train = new Vehicle('train');
- train.x = 200 + i * 800;
- train.y = 300;
- vehicles.push(train);
- game.addChild(train);
- }
}
-function getGridPosition(worldX, worldY) {
- return {
- x: Math.floor(worldX / tileSize),
- y: Math.floor(worldY / tileSize)
- };
-}
-function exitVehicle() {
- if (character.isInVehicle && character.currentVehicle) {
- character.currentVehicle.occupied = false;
- character.isInVehicle = false;
- character.currentVehicle = null;
- vehicleText.setText('ON FOOT');
- LK.getSound('footsteps').play();
+function updateBikePhysics() {
+ // Handle acceleration and deceleration
+ if (bike.isAccelerating) {
+ bike.speed = Math.min(bike.speed + bike.acceleration, bike.maxSpeed);
+ } else {
+ bike.speed = Math.max(bike.speed - bike.deceleration, 0);
}
-}
-function updateVehicleMovement() {
- // Move trains along tracks
- for (var i = 0; i < vehicles.length; i++) {
- var vehicle = vehicles[i];
- if (vehicle.vehicleType === 'train' && !vehicle.occupied) {
- vehicle.x += 2;
- if (vehicle.x > 2148) {
- vehicle.x = -100;
- }
- }
+ // Update speedometer with smooth tween
+ var displaySpeed = Math.round(bike.speed * 10);
+ speedText.setText(displaySpeed + ' KM/H');
+ // Apply engine sound based on speed
+ if (bike.speed > 0) {
+ LK.getSound('bikeEngine').play();
}
}
-function updateVehicleStatus() {
- if (character.isInVehicle && character.currentVehicle) {
- var vehicleType = character.currentVehicle.vehicleType;
- vehicleText.setText('DRIVING ' + vehicleType.toUpperCase());
- statusText.setText('DRIVING IN CITY');
- } else {
- vehicleText.setText('ON FOOT');
- statusText.setText('EXPLORING CITY');
+function spawnNewObstacles() {
+ // Spawn new obstacles ahead of the bike
+ if (Math.random() < 0.3) {
+ var obstacle = new RoadObstacle('obstacle');
+ obstacle.x = 700 + Math.random() * 648;
+ obstacle.y = -100;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
}
+ // Spawn powerups occasionally
+ if (Math.random() < 0.1) {
+ var powerup = new PowerUp('speed');
+ powerup.x = 700 + Math.random() * 648;
+ powerup.y = -100;
+ powerups.push(powerup);
+ game.addChild(powerup);
+ }
}
-function moveCharacterInVehicle(x, y) {
- if (character.isInVehicle && character.currentVehicle) {
- var vehicle = character.currentVehicle;
- var speed = vehicle.speed;
- var deltaX = x - vehicle.x;
- var deltaY = y - vehicle.y;
- var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
- if (distance > 5) {
- vehicle.x += deltaX / distance * speed;
- vehicle.y += deltaY / distance * speed;
- character.x = vehicle.x;
- character.y = vehicle.y;
+function checkCollisions() {
+ // Check obstacle collisions
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ var currentIntersecting = bike.intersects(obstacle);
+ if (!obstacle.lastIntersecting && currentIntersecting) {
+ // Collision detected - crash bike
+ LK.getSound('crash').play();
+ tween(bike, {
+ speed: 0
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ LK.effects.flashScreen(0xff0000, 500);
+ bike.speed = 0;
}
+ obstacle.lastIntersecting = currentIntersecting;
}
+ // Check powerup collection
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var powerup = powerups[i];
+ var currentIntersecting = bike.intersects(powerup);
+ if (!powerup.lastIntersecting && currentIntersecting && !powerup.collected) {
+ // Powerup collected
+ powerup.collected = true;
+ LK.getSound('powerup').play();
+ bike.maxSpeed += 3;
+ tween(powerup, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ powerup.destroy();
+ powerups.splice(i, 1);
+ }
+ });
+ LK.setScore(LK.getScore() + 50);
+ }
+ powerup.lastIntersecting = currentIntersecting;
+ }
}
-generateCity();
+generateTrack();
game.down = function (x, y, obj) {
- // Move character to touch position when on foot
- if (!character.isInVehicle) {
- character.targetX = x;
- character.targetY = y;
- }
+ // Start accelerating
+ bike.isAccelerating = true;
};
game.up = function (x, y, obj) {
- // Double tap to exit vehicle
- var currentTime = Date.now();
- if (currentTime - (game.lastTapTime || 0) < 300) {
- if (character.isInVehicle) {
- exitVehicle();
- }
- }
- game.lastTapTime = currentTime;
+ // Stop accelerating
+ bike.isAccelerating = false;
};
game.move = function (x, y, obj) {
- if (character.isInVehicle) {
- moveCharacterInVehicle(x, y);
- } else {
- // Move character on foot
- var deltaX = x - character.x;
- var deltaY = y - character.y;
- var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
- if (distance > 5) {
- character.x += deltaX / distance * character.speed;
- character.y += deltaY / distance * character.speed;
- LK.getSound('footsteps').play();
- }
+ // Steer bike left and right
+ var deltaX = x - bike.x;
+ if (Math.abs(deltaX) > 20) {
+ bike.x += deltaX * 0.05;
+ // Keep bike on track
+ bike.x = Math.max(700, Math.min(1348, bike.x));
}
};
game.update = function () {
- // Keep character in city bounds
- if (character.x < 20) character.x = 20;
- if (character.x > 2028) character.x = 2028;
- if (character.y < 30) character.y = 30;
- if (character.y > 2702) character.y = 2702;
- // Update vehicle movements
- updateVehicleMovement();
- updateVehicleStatus();
- // Move character towards target when on foot
- if (!character.isInVehicle && character.targetX !== undefined) {
- var deltaX = character.targetX - character.x;
- var deltaY = character.targetY - character.y;
- var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
- if (distance > 10) {
- character.x += deltaX / distance * character.speed;
- character.y += deltaY / distance * character.speed;
- } else {
- character.targetX = undefined;
- character.targetY = undefined;
+ if (!isGameRunning) return;
+ // Update bike physics
+ updateBikePhysics();
+ // Move world elements down based on bike speed
+ var worldSpeed = gameSpeed + bike.speed * 0.5;
+ // Move road segments
+ for (var i = 0; i < roadElements.length; i++) {
+ var road = roadElements[i];
+ road.y += worldSpeed;
+ if (road.y > 2832) {
+ road.y = roadElements[(i - 1 + roadElements.length) % roadElements.length].y - 150;
}
}
- // Keep vehicle and character together
- if (character.isInVehicle && character.currentVehicle) {
- // Keep character position synced with vehicle
- character.x = character.currentVehicle.x;
- character.y = character.currentVehicle.y;
+ // Move obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ obstacle.y += worldSpeed;
+ if (obstacle.y > 2832) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ }
}
+ // Move powerups
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var powerup = powerups[i];
+ powerup.y += worldSpeed;
+ if (powerup.y > 2832) {
+ powerup.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ // Update race progress
+ raceDistance += worldSpeed * 0.1;
+ distanceText.setText('DISTANCE: ' + Math.round(raceDistance) + 'M');
+ // Check win condition
+ if (raceDistance >= targetDistance) {
+ isGameRunning = false;
+ LK.showYouWin();
+ }
+ // Spawn new obstacles and powerups
+ if (LK.ticks % 60 === 0) {
+ spawnNewObstacles();
+ }
+ // Check collisions
+ checkCollisions();
+ // Keep bike in racing bounds
+ bike.x = Math.max(700, Math.min(1348, bike.x));
};
\ No newline at end of file