User prompt
Small still doesn't fit the floor, it just is floating
User prompt
Still doesn't fit the floor, it just is floating
User prompt
Make player character small version have it's own hitbox
User prompt
Make multiple copies of bg be there so loops more natural
User prompt
Re-add bg movement code
User prompt
Make it cover whole in-between the 2 and not move it stays there
User prompt
Make it cover whole in-between the 2 and not move it stays there
User prompt
Resize this into a bg in middle of floor and ceiling
User prompt
Add random spike and orb powerup patterns for each play! Orb makes player smaller and jump higher for 5 jumps. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Change hitboxes to be like the models here
User prompt
Add bg music loop
Code edit (1 edits merged)
Please save this source code
User prompt
Cave Runner
Initial prompt
Geometry Dash recreation. Don't call it geometry Rush, also cave bg
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var CeilingSegment = Container.expand(function () { var self = Container.call(this); var ceilingGraphics = self.attachAsset('ceiling', { anchorX: 0, anchorY: 1 }); self.speed = -8; self.update = function () { self.x += self.speed; }; return self; }); var GroundSegment = Container.expand(function () { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); self.speed = -8; self.update = function () { self.x += self.speed; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('spike', { anchorX: 0.5, anchorY: 1.0 }); self.speed = -8; 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.velocityY = 0; self.gravity = 0.8; self.jumpPower = -16; self.isGrounded = false; self.groundY = 2400; self.jump = function () { if (self.isGrounded) { self.velocityY = self.jumpPower; self.isGrounded = false; LK.getSound('jump').play(); } }; self.update = function () { // Apply gravity self.velocityY += self.gravity; self.y += self.velocityY; // Ground collision if (self.y >= self.groundY) { self.y = self.groundY; self.velocityY = 0; self.isGrounded = true; } // Ceiling collision if (self.y <= 200) { self.y = 200; self.velocityY = 0; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2c1810 }); /**** * Game Code ****/ var player; var obstacles = []; var groundSegments = []; var ceilingSegments = []; var gameSpeed = 8; var obstacleSpawnTimer = 0; var groundSpawnTimer = 0; var ceilingSpawnTimer = 0; var distance = 0; var isGameRunning = true; // Score display var scoreTxt = new Text2('Distance: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Start background music LK.playMusic('Bg-music-loop'); // Create player player = game.addChild(new Player()); player.x = 400; player.y = 2400; // Initialize ground segments for (var i = 0; i < 15; i++) { var groundSeg = new GroundSegment(); groundSeg.x = i * 200; groundSeg.y = 2500; groundSegments.push(groundSeg); game.addChild(groundSeg); } // Initialize ceiling segments for (var i = 0; i < 15; i++) { var ceilingSeg = new CeilingSegment(); ceilingSeg.x = i * 200; ceilingSeg.y = 100; ceilingSegments.push(ceilingSeg); game.addChild(ceilingSeg); } function spawnObstacle() { var obstacle = new Obstacle(); obstacle.x = 2200; obstacle.y = 2500; obstacles.push(obstacle); game.addChild(obstacle); } function spawnGroundSegment() { var groundSeg = new GroundSegment(); groundSeg.x = 2200; groundSeg.y = 2500; groundSegments.push(groundSeg); game.addChild(groundSeg); } function spawnCeilingSegment() { var ceilingSeg = new CeilingSegment(); ceilingSeg.x = 2200; ceilingSeg.y = 100; ceilingSegments.push(ceilingSeg); game.addChild(ceilingSeg); } function resetGame() { isGameRunning = false; LK.getSound('death').play(); LK.effects.flashScreen(0xff0000, 500); LK.setTimeout(function () { LK.showGameOver(); }, 500); } function checkCollisions() { if (!isGameRunning) return; // Check obstacle collisions with precise hitboxes for (var i = 0; i < obstacles.length; i++) { var obstacle = obstacles[i]; // Player hitbox (reduced by 20% on all sides for more forgiving gameplay) var playerLeft = player.x - 60; var playerRight = player.x + 60; var playerTop = player.y - 80; var playerBottom = player.y + 80; // Obstacle hitbox (spike - reduce width by 30% and height by 20% to match visual spike shape) var obstacleLeft = obstacle.x - 28; var obstacleRight = obstacle.x + 28; var obstacleTop = obstacle.y - 55; var obstacleBottom = obstacle.y; // Check if hitboxes overlap if (playerLeft < obstacleRight && playerRight > obstacleLeft && playerTop < obstacleBottom && playerBottom > obstacleTop) { resetGame(); return; } } } game.down = function (x, y, obj) { if (isGameRunning) { player.jump(); } }; game.update = function () { if (!isGameRunning) return; // Update distance distance += gameSpeed; LK.setScore(Math.floor(distance / 10)); scoreTxt.setText('Distance: ' + Math.floor(distance / 10)); // Spawn obstacles obstacleSpawnTimer++; if (obstacleSpawnTimer >= 90) { spawnObstacle(); obstacleSpawnTimer = 0; } // Spawn ground segments groundSpawnTimer++; if (groundSpawnTimer >= 25) { spawnGroundSegment(); groundSpawnTimer = 0; } // Spawn ceiling segments ceilingSpawnTimer++; if (ceilingSpawnTimer >= 25) { spawnCeilingSegment(); ceilingSpawnTimer = 0; } // Remove off-screen obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (obstacle.x < -100) { obstacle.destroy(); obstacles.splice(i, 1); } } // Remove off-screen ground segments for (var i = groundSegments.length - 1; i >= 0; i--) { var groundSeg = groundSegments[i]; if (groundSeg.x < -300) { groundSeg.destroy(); groundSegments.splice(i, 1); } } // Remove off-screen ceiling segments for (var i = ceilingSegments.length - 1; i >= 0; i--) { var ceilingSeg = ceilingSegments[i]; if (ceilingSeg.x < -300) { ceilingSeg.destroy(); ceilingSegments.splice(i, 1); } } // Check collisions checkCollisions(); // Increase difficulty over time if (LK.ticks % 600 === 0 && gameSpeed < 12) { gameSpeed += 0.5; } };
===================================================================
--- original.js
+++ change.js
@@ -158,12 +158,23 @@
}, 500);
}
function checkCollisions() {
if (!isGameRunning) return;
- // Check obstacle collisions
+ // Check obstacle collisions with precise hitboxes
for (var i = 0; i < obstacles.length; i++) {
var obstacle = obstacles[i];
- if (player.intersects(obstacle)) {
+ // Player hitbox (reduced by 20% on all sides for more forgiving gameplay)
+ var playerLeft = player.x - 60;
+ var playerRight = player.x + 60;
+ var playerTop = player.y - 80;
+ var playerBottom = player.y + 80;
+ // Obstacle hitbox (spike - reduce width by 30% and height by 20% to match visual spike shape)
+ var obstacleLeft = obstacle.x - 28;
+ var obstacleRight = obstacle.x + 28;
+ var obstacleTop = obstacle.y - 55;
+ var obstacleBottom = obstacle.y;
+ // Check if hitboxes overlap
+ if (playerLeft < obstacleRight && playerRight > obstacleLeft && playerTop < obstacleBottom && playerBottom > obstacleTop) {
resetGame();
return;
}
}