User prompt
The player should have a 0.5 larger hitbox, accommodate the player skin I have provided you
User prompt
The player is a car, the obstacles are spikes and the platforms are asphalt.
User prompt
The player has a car skin, car spike obstacles and street or asphalt platforms.
User prompt
The player must be on top of the platforms just as the obstacles must be on top not in the center
User prompt
Platform textures should be finer, the size of their hitbox.
User prompt
Platforms should have a finer texture or a larger hitbox.
User prompt
The platforms will have a stone texture, the player will be a cart and the obstacles will be small and Mediums will be peaks on the ground and large ones will be birds flying ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Every 0.5 seconds is 1 point
User prompt
Remove the record section and change it to "score" Each point is equivalent to 1 second. 1 second = 1 point
User prompt
Large obstacles must appear at least 3 times every 150 points
User prompt
Obstacles tend to appear on the platform where the player is standing. The big obstacle will be a wall that will cover 2 platforms
User prompt
The indicator where the obstacles will emerge from should appear 0.5 seconds before the obstacle appears. The obstacles will have 3 sizes: small, medium and large, the large one will occupy 2 of the 3 platforms ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make an arrow appear where the obstacles come out . Make obstacles increase their speed by 1 for every 100 points
User prompt
That the character moves between the 3 platforms and can go up or down with an arrow button There will be some obstacles that will pass through the platforms.
Code edit (1 edits merged)
Please save this source code
User prompt
Jump Runner - Infinite Obstacle Course
Initial prompt
Create a game where the character runs infinitely but has to jump over obstacles which will come from 3 directions: top, middle and bottom, those below and middle can be jumped over.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Obstacle = Container.expand(function (lane, size) {
var self = Container.call(this);
self.lane = lane || 'middle';
self.size = size || 'small';
self.speed = 8;
self.isLarge = size === 'large';
var assetName = 'obstacleMiddleSmall';
if (self.lane === 'top') {
if (size === 'small') assetName = 'obstacleTopSmall';else if (size === 'medium') assetName = 'obstacleTopMedium';else if (size === 'large') assetName = 'obstacleTopLarge';
} else if (self.lane === 'bottom') {
if (size === 'small') assetName = 'obstacleBottomSmall';else if (size === 'medium') assetName = 'obstacleBottomMedium';else if (size === 'large') assetName = 'obstacleBottomLarge';
} else {
if (size === 'small') assetName = 'obstacleMiddleSmall';else if (size === 'medium') assetName = 'obstacleMiddleMedium';else if (size === 'large') assetName = 'obstacleMiddleLarge';
}
var obstacleGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.currentLane = 1; // 0=top, 1=middle, 2=bottom
self.isMoving = false;
self.targetY = 0;
self.moveSpeed = 12;
self.moveUp = function () {
if (!self.isMoving && self.currentLane > 0) {
self.currentLane--;
self.isMoving = true;
if (self.currentLane === 0) self.targetY = topLaneY;else if (self.currentLane === 1) self.targetY = middleLaneY;
LK.getSound('platformSwitch').play();
}
};
self.moveDown = function () {
if (!self.isMoving && self.currentLane < 2) {
self.currentLane++;
self.isMoving = true;
if (self.currentLane === 1) self.targetY = middleLaneY;else if (self.currentLane === 2) self.targetY = bottomLaneY;
LK.getSound('platformSwitch').play();
}
};
self.update = function () {
if (self.isMoving) {
var diff = self.targetY - self.y;
if (Math.abs(diff) < self.moveSpeed) {
self.y = self.targetY;
self.isMoving = false;
} else {
self.y += diff > 0 ? self.moveSpeed : -self.moveSpeed;
}
}
};
return self;
});
var SpawnArrow = Container.expand(function (lane) {
var self = Container.call(this);
self.lane = lane || 'middle';
var arrowGraphics = self.attachAsset('spawnArrow', {
anchorX: 0.5,
anchorY: 0.5
});
arrowGraphics.rotation = Math.PI; // Point left toward incoming obstacles
self.fadeTimer = 0;
self.maxFadeTime = 60; // 1 second at 60fps
self.update = function () {
self.fadeTimer++;
var alpha = 1 - self.fadeTimer / self.maxFadeTime;
if (alpha <= 0) {
self.destroy();
return;
}
arrowGraphics.alpha = alpha;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game dimensions: 2048x2732
var gameWidth = 2048;
var gameHeight = 2732;
// Lane positions
var topLaneY = gameHeight * 0.3;
var middleLaneY = gameHeight * 0.5;
var bottomLaneY = gameHeight * 0.7;
// Game variables
var player;
var obstacles = [];
var spawnArrows = [];
var pendingObstacles = [];
var gameSpeed = 1;
var spawnTimer = 0;
var spawnInterval = 120; // frames between spawns
var gameTime = 0; // tracks game time in frames (60fps = 1 second)
var speedIncreaseInterval = 600; // increase speed every 10 seconds at 60fps
var largeObstaclesSpawned = 0;
var lastScoreCheck = 0;
// Initialize score display
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create player
player = game.addChild(new Player());
player.x = gameWidth * 0.2;
player.y = middleLaneY;
// Create arrow buttons
var arrowUp = LK.getAsset('arrowUp', {
anchorX: 0.5,
anchorY: 0.5
});
arrowUp.x = gameWidth - 150;
arrowUp.y = gameHeight - 300;
LK.gui.addChild(arrowUp);
var arrowDown = LK.getAsset('arrowDown', {
anchorX: 0.5,
anchorY: 0.5
});
arrowDown.x = gameWidth - 150;
arrowDown.y = gameHeight - 150;
LK.gui.addChild(arrowDown);
// Arrow button event handlers
arrowUp.down = function (x, y, obj) {
player.moveUp();
};
arrowDown.down = function (x, y, obj) {
player.moveDown();
};
// Draw stone platform tracks with larger hitbox and finer texture
var topPlatform = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0.5,
scaleX: 15,
scaleY: 1.8
});
topPlatform.x = 0;
topPlatform.y = topLaneY;
game.addChild(topPlatform);
// Add finer texture overlay for top platform
for (var i = 0; i < 40; i++) {
var fineTexture = LK.getAsset('platformFine', {
anchorX: 0,
anchorY: 0.5
});
fineTexture.x = i * 50;
fineTexture.y = topLaneY + (Math.random() - 0.5) * 30;
fineTexture.alpha = 0.6;
game.addChild(fineTexture);
}
var middlePlatform = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0.5,
scaleX: 15,
scaleY: 1.8
});
middlePlatform.x = 0;
middlePlatform.y = middleLaneY;
game.addChild(middlePlatform);
// Add finer texture overlay for middle platform
for (var i = 0; i < 40; i++) {
var fineTexture = LK.getAsset('platformFine', {
anchorX: 0,
anchorY: 0.5
});
fineTexture.x = i * 50;
fineTexture.y = middleLaneY + (Math.random() - 0.5) * 30;
fineTexture.alpha = 0.6;
game.addChild(fineTexture);
}
var bottomPlatform = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0.5,
scaleX: 15,
scaleY: 1.8
});
bottomPlatform.x = 0;
bottomPlatform.y = bottomLaneY;
game.addChild(bottomPlatform);
// Add finer texture overlay for bottom platform
for (var i = 0; i < 40; i++) {
var fineTexture = LK.getAsset('platformFine', {
anchorX: 0,
anchorY: 0.5
});
fineTexture.x = i * 50;
fineTexture.y = bottomLaneY + (Math.random() - 0.5) * 30;
fineTexture.alpha = 0.6;
game.addChild(fineTexture);
}
function spawnObstacle() {
var lanes = ['top', 'middle', 'bottom'];
var sizes = ['small', 'medium', 'large'];
var currentScore = LK.getScore();
var scoreSegment = Math.floor(currentScore / 150);
var requiredLargeObstacles = (scoreSegment + 1) * 3;
var forceLarge = false;
// Check if we need to force a large obstacle
if (scoreSegment > Math.floor(lastScoreCheck / 150)) {
// We've entered a new 150-point segment, reset counter
largeObstaclesSpawned = 0;
lastScoreCheck = currentScore;
}
// Force large obstacle if we haven't met the requirement and we're near the end of the segment
var progressInSegment = currentScore % 150;
if (progressInSegment > 100 && largeObstaclesSpawned < 3) {
forceLarge = true;
}
var randomSize;
if (forceLarge) {
randomSize = 'large';
} else {
randomSize = sizes[Math.floor(Math.random() * sizes.length)];
}
// Track large obstacles
if (randomSize === 'large') {
largeObstaclesSpawned++;
}
var randomLane;
// 70% chance to spawn obstacle on player's current lane, 30% chance random
if (Math.random() < 0.7) {
randomLane = lanes[player.currentLane];
} else {
randomLane = lanes[Math.floor(Math.random() * lanes.length)];
}
// For large obstacles (walls), ensure they cover 2 platforms appropriately
if (randomSize === 'large') {
// Large obstacles are walls that span 2 lanes
if (randomLane === 'top') {
// Wall covers top and middle
randomLane = 'top';
} else if (randomLane === 'bottom') {
// Wall covers middle and bottom
randomLane = 'middle';
} else {
// For middle lane, randomly choose between top-middle or middle-bottom wall
randomLane = Math.random() < 0.5 ? 'top' : 'middle';
}
}
// Create spawn arrow indicator
var spawnArrow = new SpawnArrow(randomLane);
spawnArrow.x = gameWidth - 20;
if (randomLane === 'top') {
spawnArrow.y = topLaneY;
} else if (randomLane === 'middle') {
spawnArrow.y = middleLaneY;
} else {
spawnArrow.y = bottomLaneY;
}
// Add pulsing animation to spawn arrow
tween(spawnArrow, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 250,
easing: tween.easeInOut
});
tween(spawnArrow, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 250,
easing: tween.easeInOut
});
spawnArrows.push(spawnArrow);
game.addChild(spawnArrow);
// Schedule obstacle to spawn after 0.5 seconds (30 frames at 60fps)
var pendingObstacle = {
lane: randomLane,
size: randomSize,
spawnTime: LK.ticks + 30
};
pendingObstacles.push(pendingObstacle);
}
function createObstacle(lane, size) {
var obstacle = new Obstacle(lane, size);
obstacle.x = gameWidth + 50;
// For large obstacles, position them between lanes
if (size === 'large') {
if (lane === 'top') {
obstacle.y = (topLaneY + middleLaneY) / 2;
} else if (lane === 'middle') {
obstacle.y = (middleLaneY + bottomLaneY) / 2;
} else {
obstacle.y = bottomLaneY;
}
} else {
if (lane === 'top') {
obstacle.y = topLaneY;
} else if (lane === 'middle') {
obstacle.y = middleLaneY;
} else {
obstacle.y = bottomLaneY;
}
}
var baseSpeed = 8;
var speedBonus = Math.floor(LK.getScore() / 100);
obstacle.speed = (baseSpeed + speedBonus) * gameSpeed;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function checkCollisions() {
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
var collision = false;
if (obstacle.isLarge) {
// Large obstacles are walls spanning two lanes
if (obstacle.lane === 'top') {
// Wall covers top (lane 0) and middle (lane 1)
if (player.currentLane === 0 || player.currentLane === 1) {
collision = player.intersects(obstacle);
}
} else if (obstacle.lane === 'middle') {
// Wall covers middle (lane 1) and bottom (lane 2)
if (player.currentLane === 1 || player.currentLane === 2) {
collision = player.intersects(obstacle);
}
} else if (obstacle.lane === 'bottom') {
// This shouldn't happen for large obstacles, but handle it
if (player.currentLane === 2) {
collision = player.intersects(obstacle);
}
}
} else {
// Normal single-lane collision - only check if player is in same lane
if (obstacle.lane === 'top' && player.currentLane === 0 || obstacle.lane === 'middle' && player.currentLane === 1 || obstacle.lane === 'bottom' && player.currentLane === 2) {
collision = player.intersects(obstacle);
}
}
if (collision) {
LK.getSound('collision').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
}
}
// Touch controls for platform switching
var touchStartY = 0;
game.down = function (x, y, obj) {
touchStartY = y;
};
game.up = function (x, y, obj) {
var swipeDistance = y - touchStartY;
if (Math.abs(swipeDistance) > 100) {
if (swipeDistance < 0) {
// Swipe up
player.moveUp();
} else {
// Swipe down
player.moveDown();
}
}
};
// Main game loop
game.update = function () {
// Update game time (1 second = 60 frames at 60fps)
gameTime++;
// Update score: 1 point every 0.5 seconds (30 frames)
var timeScore = Math.floor(gameTime / 30);
LK.setScore(timeScore);
scoreTxt.setText('Score: ' + LK.getScore());
// Increase obstacle speed by 1 for every 100 points
var baseSpeed = 8;
var speedBonus = Math.floor(LK.getScore() / 100);
var currentObstacleSpeed = baseSpeed + speedBonus;
// Increase game speed over time
if (LK.ticks % speedIncreaseInterval === 0) {
gameSpeed += 0.1;
if (spawnInterval > 60) {
spawnInterval -= 5;
}
}
// Spawn obstacles
spawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnObstacle();
spawnTimer = 0;
}
// Check for pending obstacles to spawn
for (var i = pendingObstacles.length - 1; i >= 0; i--) {
var pending = pendingObstacles[i];
if (LK.ticks >= pending.spawnTime) {
createObstacle(pending.lane, pending.size);
pendingObstacles.splice(i, 1);
}
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.speed = currentObstacleSpeed * gameSpeed;
// Remove obstacles that are off screen
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
// Update and clean up spawn arrows
for (var i = spawnArrows.length - 1; i >= 0; i--) {
var arrow = spawnArrows[i];
if (arrow.fadeTimer >= arrow.maxFadeTime) {
spawnArrows.splice(i, 1);
}
}
// Check for collisions
checkCollisions();
}; ===================================================================
--- original.js
+++ change.js
@@ -151,36 +151,69 @@
};
arrowDown.down = function (x, y, obj) {
player.moveDown();
};
-// Draw stone platform tracks
+// Draw stone platform tracks with larger hitbox and finer texture
var topPlatform = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0.5,
- scaleX: 25,
- scaleY: 1.2
+ scaleX: 15,
+ scaleY: 1.8
});
topPlatform.x = 0;
topPlatform.y = topLaneY;
game.addChild(topPlatform);
+// Add finer texture overlay for top platform
+for (var i = 0; i < 40; i++) {
+ var fineTexture = LK.getAsset('platformFine', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ fineTexture.x = i * 50;
+ fineTexture.y = topLaneY + (Math.random() - 0.5) * 30;
+ fineTexture.alpha = 0.6;
+ game.addChild(fineTexture);
+}
var middlePlatform = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0.5,
- scaleX: 25,
- scaleY: 1.2
+ scaleX: 15,
+ scaleY: 1.8
});
middlePlatform.x = 0;
middlePlatform.y = middleLaneY;
game.addChild(middlePlatform);
+// Add finer texture overlay for middle platform
+for (var i = 0; i < 40; i++) {
+ var fineTexture = LK.getAsset('platformFine', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ fineTexture.x = i * 50;
+ fineTexture.y = middleLaneY + (Math.random() - 0.5) * 30;
+ fineTexture.alpha = 0.6;
+ game.addChild(fineTexture);
+}
var bottomPlatform = LK.getAsset('platform', {
anchorX: 0,
anchorY: 0.5,
- scaleX: 25,
- scaleY: 1.2
+ scaleX: 15,
+ scaleY: 1.8
});
bottomPlatform.x = 0;
bottomPlatform.y = bottomLaneY;
game.addChild(bottomPlatform);
+// Add finer texture overlay for bottom platform
+for (var i = 0; i < 40; i++) {
+ var fineTexture = LK.getAsset('platformFine', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ fineTexture.x = i * 50;
+ fineTexture.y = bottomLaneY + (Math.random() - 0.5) * 30;
+ fineTexture.alpha = 0.6;
+ game.addChild(fineTexture);
+}
function spawnObstacle() {
var lanes = ['top', 'middle', 'bottom'];
var sizes = ['small', 'medium', 'large'];
var currentScore = LK.getScore();