User prompt
quic respon when tap for jump
User prompt
reduce quantity obstacle
User prompt
2x jump
User prompt
player in the middle
User prompt
fast speed platform
User prompt
slow more platform move
User prompt
erase random platform
User prompt
slow platform move
User prompt
make platform random
User prompt
add background asset
User prompt
more high jump
User prompt
more high jump
User prompt
high jump
Code edit (1 edits merged)
Please save this source code
User prompt
Endless Downhill Dash
Initial prompt
best java script make simple adictif bike downhill side scrolling game endless
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Biker = Container.expand(function () {
var self = Container.call(this);
var bikerGraphics = self.attachAsset('biker', {
anchorX: 0.5,
anchorY: 0.5
});
// State variables
self.velocity = {
x: 0,
y: 0
};
self.isJumping = false;
self.isDead = false;
self.gravity = 0.5;
self.jumpForce = -20; // Increase jump force for quicker response
self.jump = function (isHighJump) {
if (!self.isJumping && !self.isDead) {
self.velocity.y = isHighJump ? self.jumpForce * 2 : self.jumpForce;
self.isJumping = isHighJump ? true : !self.isJumping;
LK.getSound('jump').play();
}
};
self.update = function () {
if (self.isDead) {
return;
}
// Apply gravity
self.velocity.y += self.gravity;
// Update position
self.y += self.velocity.y;
// Cap falling speed
if (self.velocity.y > 15) {
self.velocity.y = 15;
}
// Tilt the biker based on vertical velocity
var targetRotation = self.velocity.y * 0.03;
bikerGraphics.rotation = targetRotation;
};
self.die = function () {
if (!self.isDead) {
self.isDead = true;
LK.getSound('crash').play();
// Animate the death
tween(bikerGraphics, {
rotation: Math.PI
}, {
duration: 800,
easing: tween.bounceOut
});
// Flash the biker red
LK.effects.flashObject(self, 0xff0000, 500);
// Game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = coinGraphics.width;
self.height = coinGraphics.height;
self.speed = 5;
self.active = true;
// Animation
self.update = function () {
if (!self.active) {
return;
}
// Spin the coin
coinGraphics.rotation += 0.05;
self.x -= self.speed;
// Remove when off screen
if (self.x < -self.width) {
self.active = false;
self.destroy();
}
};
self.collect = function () {
if (self.active) {
self.active = false;
// Animate coin collection
tween(self, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
LK.getSound('coin').play();
return true;
}
return false;
};
return self;
});
var Ground = Container.expand(function () {
var self = Container.call(this);
var groundGraphics = self.attachAsset('ground', {
anchorX: 0,
anchorY: 0
});
self.speed = 5;
self.update = function () {
self.x -= self.speed;
// Loop the ground
if (self.x <= -groundGraphics.width) {
self.x += groundGraphics.width;
}
};
return self;
});
var Jump = Container.expand(function () {
var self = Container.call(this);
var jumpGraphics = self.attachAsset('jump', {
anchorX: 0.5,
anchorY: 1.0
});
self.width = jumpGraphics.width;
self.height = jumpGraphics.height;
self.speed = 5;
self.active = true;
self.update = function () {
if (!self.active) {
return;
}
self.x -= self.speed;
// Remove when off screen
if (self.x < -self.width) {
self.active = false;
self.destroy();
}
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 1.0
});
self.width = obstacleGraphics.width;
self.height = obstacleGraphics.height;
self.speed = 5;
self.active = true;
self.update = function () {
if (!self.active) {
return;
}
self.x -= self.speed;
// Remove when off screen
if (self.x < -self.width) {
self.active = false;
self.destroy();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game variables
var biker;
var groundTiles = [];
var obstacles = [];
var jumps = [];
var coins = [];
var distance = 0;
var groundY = 2732 - 250; // Ground position from top
var gameSpeed = 5;
var spawnDistance = 0;
var lastObstaclePos = 0;
var gameActive = false;
var difficultyTimer = 0;
var coinsCollected = 0;
// Create score display
var scoreTxt = new Text2('Distance: 0m', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create coin display
var coinTxt = new Text2('Coins: 0', {
size: 80,
fill: 0xFFCC00
});
coinTxt.anchor.set(0.5, 0);
coinTxt.y = 100;
LK.gui.top.addChild(coinTxt);
// Initialize high score from storage
var highScore = storage.highScore || 0;
var highScoreTxt = new Text2('Best: ' + highScore + 'm', {
size: 60,
fill: 0xFFFFFF
});
highScoreTxt.anchor.set(1.0, 0);
highScoreTxt.y = 10;
highScoreTxt.x = -10;
LK.gui.topRight.addChild(highScoreTxt);
// Create tap to start message
var startTxt = new Text2('Tap to Start', {
size: 120,
fill: 0xFFFFFF
});
startTxt.anchor.set(0.5, 0.5);
LK.gui.center.addChild(startTxt);
// Initialize the game elements
function initGame() {
// Attach background image
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(background);
// Reset variables
obstacles = [];
jumps = [];
coins = [];
distance = 0;
gameSpeed = 5;
spawnDistance = 0;
lastObstaclePos = 0;
gameActive = false;
difficultyTimer = 0;
coinsCollected = 0;
// Update UI
scoreTxt.setText('Distance: 0m');
coinTxt.setText('Coins: 0');
startTxt.visible = true;
// Create ground
if (groundTiles.length === 0) {
for (var i = 0; i < 2; i++) {
var ground = new Ground();
ground.x = i * ground.width;
ground.y = groundY;
groundTiles.push(ground);
game.addChild(ground);
}
} else {
for (var i = 0; i < groundTiles.length; i++) {
groundTiles[i].x = i * groundTiles[i].width;
}
}
// Create player if not exists
if (!biker) {
biker = new Biker();
game.addChild(biker);
}
// Position player
biker.x = 2048 / 2; // Center the player horizontally
biker.y = groundY - 30;
biker.velocity = {
x: 0,
y: 0
};
biker.isJumping = false;
biker.isDead = false;
// Play background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.6,
duration: 1000
}
});
}
// Start the game
function startGame() {
if (!gameActive) {
gameActive = true;
startTxt.visible = false;
}
}
// Spawn obstacles and collectibles
function spawnObjects() {
if (!gameActive) {
return;
}
spawnDistance += gameSpeed;
// Minimum distance between objects
var minDistance = 500;
// Check if we should spawn a new object
if (spawnDistance - lastObstaclePos > minDistance) {
var rand = Math.random();
// Determine what type of object to spawn
if (rand < 0.5) {
// Spawn obstacle
var obstacle = new Obstacle();
obstacle.x = 2048 + obstacle.width;
obstacle.y = groundY;
obstacle.speed = gameSpeed;
obstacles.push(obstacle);
game.addChild(obstacle);
lastObstaclePos = spawnDistance;
} else if (rand < 0.8) {
// Spawn jump ramp
var jump = new Jump();
jump.x = 2048 + jump.width;
jump.y = groundY;
jump.speed = gameSpeed;
jumps.push(jump);
game.addChild(jump);
lastObstaclePos = spawnDistance;
// Spawn coin above the jump
var coin = new Coin();
coin.x = jump.x;
coin.y = groundY - 150 - Math.random() * 100;
coin.speed = gameSpeed;
coins.push(coin);
game.addChild(coin);
} else {
// Spawn just a coin
var coin = new Coin();
coin.x = 2048 + coin.width;
coin.y = groundY - 100 - Math.random() * 150;
coin.speed = gameSpeed;
coins.push(coin);
game.addChild(coin);
lastObstaclePos = spawnDistance;
}
}
}
// Check collision with ground
function checkGroundCollision() {
if (biker.y >= groundY - 30) {
biker.y = groundY - 30;
biker.velocity.y = 0;
biker.isJumping = false;
}
}
// Check collision with obstacles
function checkObstacleCollision() {
if (!gameActive || biker.isDead) {
return;
}
// Check obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.active && biker.intersects(obstacle)) {
biker.die();
return;
}
}
// Check jumps (no collision, just boost)
for (var i = jumps.length - 1; i >= 0; i--) {
var jump = jumps[i];
if (jump.active && biker.intersects(jump) && !biker.isJumping) {
biker.velocity.y = biker.jumpForce * 1.2; // Extra boost from ramp
biker.isJumping = true;
LK.getSound('jump').play();
}
}
// Check coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (coin.active && biker.intersects(coin)) {
if (coin.collect()) {
coins.splice(i, 1);
coinsCollected++;
coinTxt.setText('Coins: ' + coinsCollected);
}
}
}
}
// Update game difficulty
function updateDifficulty() {
if (!gameActive) {
return;
}
difficultyTimer++;
// Increase speed every 5 seconds
if (difficultyTimer % 300 === 0) {
gameSpeed += 1.0;
// Update all object speeds
for (var i = 0; i < groundTiles.length; i++) {
groundTiles[i].speed = gameSpeed;
}
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].speed = gameSpeed;
}
for (var i = 0; i < jumps.length; i++) {
jumps[i].speed = gameSpeed;
}
for (var i = 0; i < coins.length; i++) {
coins[i].speed = gameSpeed;
}
}
}
// Clean up objects that are no longer active
function cleanupObjects() {
for (var i = obstacles.length - 1; i >= 0; i--) {
if (!obstacles[i].active) {
obstacles.splice(i, 1);
}
}
for (var i = jumps.length - 1; i >= 0; i--) {
if (!jumps[i].active) {
jumps.splice(i, 1);
}
}
for (var i = coins.length - 1; i >= 0; i--) {
if (!coins[i].active) {
coins.splice(i, 1);
}
}
}
// Update score
function updateScore() {
if (gameActive && !biker.isDead) {
distance += gameSpeed / 10;
var distanceInt = Math.floor(distance);
scoreTxt.setText('Distance: ' + distanceInt + 'm');
// Update high score
if (distanceInt > highScore) {
highScore = distanceInt;
highScoreTxt.setText('Best: ' + highScore + 'm');
storage.highScore = highScore;
}
}
}
// Event handlers
game.down = function (x, y, obj) {
if (!gameActive) {
startGame();
} else if (!biker.isDead) {
biker.jump(y < 1700); // High jump if tap is in the upper 60% of the screen
}
};
// Game update function
game.update = function () {
// Initialize on first run
if (LK.ticks === 1) {
initGame();
}
// Update all game objects
if (biker) {
biker.update();
}
for (var i = 0; i < groundTiles.length; i++) {
groundTiles[i].update();
}
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].update();
}
for (var i = 0; i < jumps.length; i++) {
jumps[i].update();
}
for (var i = 0; i < coins.length; i++) {
coins[i].update();
}
// Game logic
if (gameActive) {
checkGroundCollision();
checkObstacleCollision();
spawnObjects();
updateDifficulty();
updateScore();
cleanupObjects();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -20,9 +20,9 @@
};
self.isJumping = false;
self.isDead = false;
self.gravity = 0.5;
- self.jumpForce = -16; // Increase jump force for higher jumps
+ self.jumpForce = -20; // Increase jump force for quicker response
self.jump = function (isHighJump) {
if (!self.isJumping && !self.isDead) {
self.velocity.y = isHighJump ? self.jumpForce * 2 : self.jumpForce;
self.isJumping = isHighJump ? true : !self.isJumping;