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 Character = Container.expand(function () {
var self = Container.call(this);
var characterGraphics = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 1
});
self.speed = 5;
self.isInVehicle = false;
self.currentVehicle = null;
return self;
});
var CityElement = Container.expand(function (type, gridX, gridY) {
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.down = function (x, y, obj) {
// Interact with city element
console.log('Interacted with', self.elementType);
};
return self;
});
var Vehicle = 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, {
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();
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* 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);
// UI Elements
var statusText = new Text2('EXPLORING CITY', {
size: 50,
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', {
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);
}
}
// Spawn vehicles around the city
spawnVehicles();
}
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);
}
// 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 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 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;
}
}
}
}
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 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;
}
}
}
generateCity();
game.down = function (x, y, obj) {
// Move character to touch position when on foot
if (!character.isInVehicle) {
character.targetX = x;
character.targetY = y;
}
};
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;
};
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();
}
}
};
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;
}
}
// 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;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -5,42 +5,67 @@
/****
* Classes
****/
-var Block = Container.expand(function (type, gridX, gridY) {
+var Character = Container.expand(function () {
var self = Container.call(this);
- self.blockType = type || 'grass';
+ var characterGraphics = self.attachAsset('character', {
+ anchorX: 0.5,
+ anchorY: 1
+ });
+ self.speed = 5;
+ self.isInVehicle = false;
+ self.currentVehicle = null;
+ return self;
+});
+var CityElement = Container.expand(function (type, gridX, gridY) {
+ var self = Container.call(this);
+ self.elementType = type || 'road';
self.gridX = gridX;
self.gridY = gridY;
- var assetName = 'grassBlock';
- if (self.blockType === 'stone') {
- assetName = 'stoneBlock';
- } else if (self.blockType === 'wood') {
- assetName = 'woodBlock';
- } else if (self.blockType === 'dirt') {
- assetName = 'dirtBlock';
+ var assetName = 'road';
+ if (self.elementType === 'building') {
+ assetName = 'building';
+ } else if (self.elementType === 'park') {
+ assetName = 'park';
+ } else if (self.elementType === 'road') {
+ assetName = 'road';
}
- var blockGraphics = self.attachAsset(assetName, {
+ var elementGraphics = self.attachAsset(assetName, {
anchorX: 0,
anchorY: 0
});
self.down = function (x, y, obj) {
- if (miningMode) {
- breakBlock(self);
- } else {
- // Show block info or interact
- }
+ // Interact with city element
+ console.log('Interacted with', self.elementType);
};
return self;
});
-var Player = Container.expand(function () {
+var Vehicle = Container.expand(function (type, x, y) {
var self = Container.call(this);
- var playerGraphics = self.attachAsset('player', {
+ self.vehicleType = type || 'car';
+ self.speed = type === 'train' ? 8 : type === 'bus' ? 4 : 6;
+ self.occupied = false;
+ var assetName = type;
+ var vehicleGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
- anchorY: 1
+ anchorY: 0.5
});
- self.speed = 5;
- self.selectedBlock = 'grass';
+ 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();
+ }
+ }
+ };
return self;
});
/****
@@ -52,139 +77,202 @@
/****
* Game Code
****/
-var world = [];
-var worldWidth = 25;
-var worldHeight = 20;
-var blockSize = 80;
+var cityMap = [];
+var cityWidth = 25;
+var cityHeight = 20;
+var tileSize = 100;
var cameraX = 0;
var cameraY = 0;
-var miningMode = false;
-var buildMode = true;
-// Player
-var player = new Player();
-player.x = 1024;
-player.y = 1000;
-game.addChild(player);
+var vehicles = [];
+var explorationMode = true;
+// Character
+var character = new Character();
+character.x = 1024;
+character.y = 1366;
+game.addChild(character);
// UI Elements
-var modeText = new Text2('BUILD MODE', {
- size: 60,
+var statusText = new Text2('EXPLORING CITY', {
+ size: 50,
fill: 0xFFFFFF
});
-modeText.anchor.set(0.5, 0);
-LK.gui.top.addChild(modeText);
-var inventoryUI = LK.getAsset('inventory', {
- anchorX: 0.5,
- anchorY: 1
+statusText.anchor.set(0.5, 0);
+LK.gui.top.addChild(statusText);
+var minimap = LK.getAsset('minimap', {
+ anchorX: 1,
+ anchorY: 0
});
-LK.gui.bottom.addChild(inventoryUI);
-var selectedBlockText = new Text2('GRASS BLOCK', {
- size: 40,
+LK.gui.topRight.addChild(minimap);
+var vehicleText = new Text2('ON FOOT', {
+ size: 35,
fill: 0xFFFFFF
});
-selectedBlockText.anchor.set(0.5, 0);
-selectedBlockText.y = -80;
-LK.gui.bottom.addChild(selectedBlockText);
-// Initialize world with base terrain
-function generateWorld() {
- for (var x = 0; x < worldWidth; x++) {
- world[x] = [];
- for (var y = 0; y < worldHeight; y++) {
- world[x][y] = null;
- // Generate base terrain
- if (y >= 15) {
- var blockType = 'dirt';
- if (y === 15) blockType = 'grass';
- if (y >= 18) blockType = 'stone';
- var block = new Block(blockType, x, y);
- block.x = x * blockSize;
- block.y = y * blockSize;
- world[x][y] = block;
- game.addChild(block);
+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);
}
}
+ // Spawn vehicles around the city
+ spawnVehicles();
}
+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);
+ }
+ // 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 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 / blockSize),
- y: Math.floor(worldY / blockSize)
+ x: Math.floor(worldX / tileSize),
+ y: Math.floor(worldY / tileSize)
};
}
-function placeBlock(gridX, gridY, blockType) {
- if (gridX < 0 || gridX >= worldWidth || gridY < 0 || gridY >= worldHeight) return;
- if (world[gridX][gridY] !== null) return;
- var block = new Block(blockType, gridX, gridY);
- block.x = gridX * blockSize;
- block.y = gridY * blockSize;
- world[gridX][gridY] = block;
- game.addChild(block);
- LK.getSound('place').play();
+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 breakBlock(block) {
- if (!block) return;
- var gridX = block.gridX;
- var gridY = block.gridY;
- world[gridX][gridY] = null;
- block.destroy();
- LK.getSound('break').play();
+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;
+ }
+ }
+ }
}
-function switchMode() {
- miningMode = !miningMode;
- buildMode = !buildMode;
- if (miningMode) {
- modeText.setText('MINING MODE');
+function updateVehicleStatus() {
+ if (character.isInVehicle && character.currentVehicle) {
+ var vehicleType = character.currentVehicle.vehicleType;
+ vehicleText.setText('DRIVING ' + vehicleType.toUpperCase());
+ statusText.setText('DRIVING IN CITY');
} else {
- modeText.setText('BUILD MODE');
+ vehicleText.setText('ON FOOT');
+ statusText.setText('EXPLORING CITY');
}
}
-function switchBlock() {
- var blockTypes = ['grass', 'dirt', 'stone', 'wood'];
- var currentIndex = blockTypes.indexOf(player.selectedBlock);
- var nextIndex = (currentIndex + 1) % blockTypes.length;
- player.selectedBlock = blockTypes[nextIndex];
- selectedBlockText.setText(player.selectedBlock.toUpperCase() + ' BLOCK');
+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;
+ }
+ }
}
-generateWorld();
+generateCity();
game.down = function (x, y, obj) {
- if (buildMode && !miningMode) {
- var gridPos = getGridPosition(x, y);
- placeBlock(gridPos.x, gridPos.y, player.selectedBlock);
+ // Move character to touch position when on foot
+ if (!character.isInVehicle) {
+ character.targetX = x;
+ character.targetY = y;
}
};
game.up = function (x, y, obj) {
- // Double tap to switch modes
+ // Double tap to exit vehicle
var currentTime = Date.now();
if (currentTime - (game.lastTapTime || 0) < 300) {
- switchMode();
+ if (character.isInVehicle) {
+ exitVehicle();
+ }
}
game.lastTapTime = currentTime;
};
game.move = function (x, y, obj) {
- // Update player position to follow touch/mouse when in build mode
- if (buildMode) {
- player.x = x;
- if (player.y > y - 100) {
- player.y = y - 100;
+ 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();
}
}
};
game.update = function () {
- // Simple gravity for player
- if (player.y < 2732 - 200) {
- var gridPos = getGridPosition(player.x, player.y + 120);
- if (gridPos.x >= 0 && gridPos.x < worldWidth && gridPos.y >= 0 && gridPos.y < worldHeight) {
- if (world[gridPos.x][gridPos.y] === null) {
- player.y += 3; // Gravity
- }
+ // 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;
}
}
- // Keep player in bounds
- if (player.x < 30) player.x = 30;
- if (player.x > 2048 - 30) player.x = 2048 - 30;
- if (player.y > 2732 - 200) player.y = 2732 - 200;
- // Auto-switch blocks every 3 seconds for demo
- if (LK.ticks % 180 === 0) {
- switchBlock();
+ // 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;
}
};
\ No newline at end of file