ArrayList < Platform > platforms;
float timeSinceLastSpawn;
float spawnInterval = 500;
ball.shackles.playerPos.x, ball.shackles.playerPos.y - 400, ball.shackles.playerPos.z - 800,
ball.shackles.playerPos.x, ball.shackles.playerPos.y, ball.shackles.playerPos.z,
ball.shackles.playerPos.x,
ball.shackles.playerPos.y - 400,
ball.shackles.playerPos.z
rotateZ(sin(millis() / 500) / 20 * ((score >= highScore) / 2 + 1));
rotateZ(cos(millis() / 500) / 10 * ((score >= highScore) / 2 + 1));
if (score >= highScore) {
textAlign(CENTER, CENTER);
text("Score: " + score + "/" + highScore, 0, 0);
textAnimVel += (textAnimSize - 30) / 3;
textAnimSize -= textAnimVel;
if (abs(30 - textAnimSize) < 0.1) {
background(240, 100, 80);
ball.shackles.playerPos.x,
ball.shackles.playerPos.y,
ball.shackles.playerPos.z
rotateZ(sin(millis() / 500) / 20 * ((score >= highScore) / 2 + 1));
rotateZ(cos(millis() / 500) / 10 * ((score >= highScore) / 2 + 1));
textSize(textAnimSize * 2);
textAlign(CENTER, CENTER);
text("You died, with a score of " + score + " out of " + highScore, 0, -textAnimSize * 1.2);
text("Press [R] to restart.", 0, textAnimSize * 1.2);
if (!died) box(3000, 5, 5000);
if (millis() - timeSinceLastSpawn > spawnInterval) {
timeSinceLastSpawn = millis();
platforms.add(new Platform(random(-1000, 1000), 1500, random(800, 1200), random(800, 1200)))
ball.roll((isHeld('a') - isHeld('d')) * 2, (isHeld('w') - isHeld('s')) * 2);
for (Platform instance: platforms) {
instance.move(gameSpeed);
if (instance.pos.z < -4000) {
platforms.remove(instance);
gameSpeed += 0.02 / (frameRate / 30);
boolean isHeld(char _key) {
return keysHeld.contains(String(_key));
if (ball.isOnGround() && !platformBelow()) died = true;
boolean platformBelow() {
for (Platform instance: platforms) {
boolean c1 = ball.shackles.playerPos.x > instance.pos.x - (instance.dimensions.x / 2) - coyote;
boolean c2 = ball.shackles.playerPos.x < instance.pos.x + (instance.dimensions.x / 2) + coyote;
boolean c3 = ball.shackles.playerPos.z > instance.pos.z - (instance.dimensions.z / 2) - coyote;
boolean c4 = ball.shackles.playerPos.z < instance.pos.z + (instance.dimensions.z / 2) + coyote;
if (c1 && c2 && c3 && c4) {
keysHeld = keysHeld.replace(String(key), "");
platforms = new ArrayList < Platform > ();
platforms.add(new Platform(0, 1000, 1000, 5000));