// Generate "infinite" random mountains
// Use a small buffer that keeps the visible portion of mountains
// the segments that leave the screen are remove and added at the end
const speed = 3;
let segments = generateSegments(15);
function loop()
{
clear();
drawSegments(segments);
updateSegments(segments);
}
function updateSegments(segments)
{
if(mouseIsPressed)
{
text(segments.length, 10, 10);
return;
}
let noSegments = segments.length;
for(let i = noSegments - 1; i >= 0; i--)
{
let curr = segments[i];
curr.start.x -= speed;
curr.end.x -= speed;
if (curr.end.x < 0)
{
let lastSegment = segments[noSegments - 1];
let newSegment = generateSegment(lastSegment);
segments.push(newSegment);
segments.splice(i, 1);
}
}
}
function drawSegments(segments)
{
for(let i = 0; i < segments.length; i++)
{
let curr = segments[i];
if (segmentVisible(curr))
line(curr.start.x, curr.start.y, curr.end.x, curr.end.y);
}
}
function segmentVisible(segment)
{
let pointVisible = (p) => p.x >= 0 && p.x < width;
return pointVisible(segment.start) || pointVisible(segment.end);
}
function generateSegments(n)
{
let segments = [];
let lastSegment;
for(let i = 0; i < n; i++)
{
lastSegment = generateSegment(lastSegment);
segments.push(lastSegment);
}
return segments;
}
function generateSegment(lastSegment)
{
// New segment points
let start = lastSegment ? {x : lastSegment.end.x, y : lastSegment.end.y} : generatePoint();
let end = generatePoint(start);
return {start, end};
}
function generatePoint(lastPoint)
{
// New point coordinates
let x = 0;
let y = floor(random(height / 2, height));
if (lastPoint)
x = lastPoint.x + floor(random(50, 100));
return {x, y};
}
// Generate random mountains with landing ramp
// You can specify if the scrolling stops if ramp is visible
// or continues and new ramps are added at the end
const speed = 3; // Scrolling speed
const stopOnRampVisible = false; // Stop scrolling if the ramp is visible
let segments = generateSegments(15);
let rampVisible = false;
function loop()
{
clear();
drawSegments(segments);
updateSegments(segments);
}
function updateSegments(segments)
{
if (stopOnRampVisible && rampVisible)
return;
let noSegments = segments.length;
for(let i = noSegments - 1; i >= 0; i--)
{
let curr = segments[i];
if (curr.ramp && curr.start.x >= 0 && curr.start.x < width / 2)
rampVisible = true;
curr.start.x -= speed;
curr.end.x -= speed;
if (curr.end.x < 0)
{
let lastSegment = segments[noSegments - 1];
let newSegment = generateSegment(lastSegment);
// Make sure that the new ramp is also flat
if (curr.ramp)
{
newSegment.ramp = true;
newSegment.end.y = newSegment.start.y;
}
segments.push(newSegment);
segments.splice(i, 1);
}
}
}
function drawSegments(segments)
{
for(let i = 0; i < segments.length; i++)
{
let curr = segments[i];
if (segmentVisible(curr))
{
stroke(curr.ramp ? "red" : "black");
line(curr.start.x, curr.start.y, curr.end.x, curr.end.y);
}
}
}
function segmentVisible(segment)
{
let pointVisible = (p) => p.x >= 0 && p.x < width;
return pointVisible(segment.start) || pointVisible(segment.end);
}
function generateSegments(n)
{
let segments = [];
let lastSegment;
for(let i = 0; i < n; i++)
{
lastSegment = generateSegment(lastSegment);
segments.push(lastSegment);
}
// Add a flat landing ramp at the end
let ramp = generateSegment(lastSegment);
ramp.end.y = ramp.start.y;
segments.push(ramp);
ramp.ramp = true;
return segments;
}
function generateSegment(lastSegment)
{
// New segment points
let start = lastSegment ? {x : lastSegment.end.x, y : lastSegment.end.y} : generatePoint();
let end = generatePoint(start);
return {start, end};
}
function generatePoint(lastPoint)
{
// New point coordinates
let x = 0;
let y = floor(random(height / 2, height));
if (lastPoint)
x = lastPoint.x + floor(random(50, 100));
return {x, y};
}