We use two variables x, y for storing the current position of the ball, and two other variables dx, dy for the direction. At each step, we delete the ball from its current position, change the coordinates (x += dx; y += dy), and draw the circle in the new position.
In other words, we define the four variables we need at the beginning of the program:
int x=10, y=10; /* position of the ball */ int dx=1, dy=1; /* direction of the ball */At each time step, we have to remove the ball from its current position:
/* draw something */ while (1) { /* remove the ball from the screen */ XClearArea(dpy, root, x, y, 40, 40, False);We can now change the position of the ball, and redraw it in the new position.
/* change position */ x+=dx; y+=dy; /* draw in the new position */ XFillArc(dpy, root, g, x, y, 40, 40, 0, 360*64);Each time the ball reaches the border of the screen, it must bounce back. This is done by checking whether x is either 0 or wa.width-40. If this is the case, we change the sign of the direction.
/* bounce (if the ball is at the edge of the screen) */ if( x<=0 || x>=wa.width-40 ) dx= -dx; if( y<=0 || y>=wa.height-40 ) dy= -dy;Note that the ball flickers. This can be avoided using the double buffering tecnique.