float vertices[] = new float[ 26 ]; float ballX = 0; float ballY = 300; void setup() { size( 500, 300 ); background( 0 ); generateTerrain(); } void keyPressed() { if ( keyCode == LEFT ) ballX = ( ballX > 0 ) ? ballX - 2 : ballX; else if ( keyCode == RIGHT ) ballX = ( ballX < 500 ) ? ballX + 2 : ballX; else if ( key == 'g' ) generateTerrain(); if ( ballX > 0 && ballX < 500 ) getBallCoords(); } void draw() { background( 0 ); renderTerrain(); fill( 255, 0, 10 ); ellipse( ballX, ballY - 5.5, 6, 6 ); } void getBallCoords() { float minX; float maxX; int minY; int maxY; int index = floor( ballX / 20 ); if ( index == 0 ) { minY = 0; maxY = 1; } else { minY = index; maxY = index + 1; } minX = index * 20; maxX = minX + 20; /* println("ballX: " + ballX ); println("minX: " + minX + ", maxX: " + maxX); println("minY: " + vertices[minY] + ", maxY: " + vertices[maxY]); */ // normalize ballX // this yields a value between 0 and 1, used to interpolate the ballY coord float normalizedBallX = ( ballX - minX ) / ( maxX - minX ); // interpolate ballY = normalizedBallX * ( vertices[ maxY ] - vertices[ minY ] ) + vertices[ minY ]; } void generateTerrain() { int index = 1; vertices[ 0 ] = 300; for ( int x = 20; x <= 500; x += 20 ) { float y = 295 - random( 75 ); vertices[ index++ ] = y; } } void renderTerrain() { stroke( 255 ); float xp = 0; float yp = vertices[ 0 ]; float y; int index = 1; for ( int x = 20; x <= 500; x += 20 ) { y = vertices[ index++ ]; line( xp, yp, x, y ); xp = x; yp = y; } noStroke(); }