// ball int cx, cy, r; int vx, vy; // number of obstacles int OBST_NUM = 3; // center rectanglular obstacle int[] rx, ry, rw, rh; void setup() { size(400,400); background(0); ellipseMode(RADIUS); // size and initial position of ball r = 10; cx = 2 * r; cy = 2 * r; // velocity vx = int(random(10))-5; vy = int(random(10))-5; if( 0 <= vx ) vx++; if( 0 <= vy ) vy++; // obstacle rx = new int[OBST_NUM]; ry = new int[OBST_NUM]; rw = new int[OBST_NUM]; rh = new int[OBST_NUM]; for( int i = 0 ; i < OBST_NUM ; i++ ) { rx[i] = 100 + (200/OBST_NUM) * i; ry[i] = 100 + (200/OBST_NUM) * i; rw[i] = 200/OBST_NUM; rh[i] = 200/OBST_NUM; } } void draw() { clearToBlack(); drawObstacle(); drawCircle(); moveCircle(); collideWall(); for( int i = 0 ; i < OBST_NUM ; i++ ) { collideObstacle(rx[i], ry[i], rw[i], rh[i]); } } void clearToBlack() { noStroke(); fill(0,50); rect(0,0,width,height); } void drawObstacle() { noStroke(); fill(255); for( int i = 0 ; i < OBST_NUM ; i++ ) { rect(rx[i],ry[i],rw[i],rh[i]); } } void drawCircle() { noStroke(); fill(0,0,255); ellipse(cx,cy,r,r); } void moveCircle() { cx += vx; cy += vy; } void collideWall() { if( cx-r <= 0 || width <= cx+r ) { vx = -vx; } if( cy-r <= 0 || height <= cy+r ) { vy = -vy; } } void collideObstacle(int x, int y, int w, int h) { if( x <= cx+r && cx-r <= x+w && y <= cy+r && cy-r <= y+h ) { if( cx < x || x+w < cx ) { vx = -vx; } if( cy < y || y+h < cy ) { vy = -vy; } } }