L'exécutable

Le source: Bounce.cpp

#include <windows.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define COS(X) cos((X)*3.14159/180.0)
#define SIN(X) sin((X)*3.14159/180.0)

GLuint Ball;
GLenum Mode;
GLfloat Zrot = 0.0F,Zstep = 6.0F;
GLfloat Xpos = 0.0F,Ypos = 1.0F;
GLfloat Xvel = 0.2F,Yvel = 0.0F;
GLfloat Xmin=-4.0F,Xmax=4.0F;
GLfloat Ymin=-3.8F,Ymax=4.0F;
GLfloat G = -0.1F;

GLuint make_ball(void) {
  GLuint list;
  GLfloat a,b;
  GLfloat da = 18.0,db = 18.0;
  GLfloat radius = 1.0;
  GLuint color;
  GLfloat x,y,z;
  list = glGenLists(1);
  glNewList(list,GL_COMPILE);
  color = 0;
  for(a=-90.0;a+da<=90.0;a+=da) {
    glBegin(GL_QUAD_STRIP);
    for(b=0.0;b<=360.0;b+=db) {
      if(color) {
        GLfloat red[] = {1.0F,0.0F,0.0F,1.0F};
        glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,red) ;}
        else {
        GLfloat white[] = {1.0F,1.0F,1.0F,1.0F};
        glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,white); }
        x =(float)(COS(b) * COS(a));
        y =(float)(SIN(b) * COS(a));
        z =(float) SIN(a);
        glVertex3f(x,y,z);
        glNormal3f(x,y,z);
        x =(float)(radius * COS(b) * COS(a+da));
        y =(float)(radius * SIN(b) * COS(a+da));
        z =(float)(radius * SIN(a+da));
        glVertex3f(x,y,z);
        glNormal3f(x,y,z);
        color = 1-color; }
    glEnd(); }
    glEndList();
  return list;
}

void CALLBACK reshape(int width,int height){
  glViewport(0,0,(GLint)width,(GLint)height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-6.0,6.0,-height*6.0/width,height*6.0/width,-6.0,6.0);
  glMatrixMode(GL_MODELVIEW);
}

void CALLBACK draw(void){
  GLint i,j;
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  GLfloat cyan[] = {0.0F,1.0F,1.0F,1.0F};
  glMaterialfv(GL_FRONT,GL_DIFFUSE,cyan) ;
  glBegin(GL_LINES);
  for(i=-5;i<=5;i++) {
    glVertex2i(i,-5);   
    glVertex2i(i,5);}
  for(i=-5;i<=5;i++) {
    glVertex2i(-5,i);   
    glVertex2i(5,i);}
  for(i=-5;i<=5;i++) {
    glVertex2i(i,-5);  
    glVertex2f(i*1.15,-5.9);}
  glVertex2f(-5.3,-5.35);   
  glVertex2f(5.3,-5.35);
  glVertex2f(-5.75,-5.9);    
  glVertex2f(5.75,-5.9);
  glEnd();
  glPushMatrix();
  glTranslatef(Xpos,Ypos,0.0);
  glScalef(2.0,2.0,2.0);
  glRotatef(8.0,0.0,0.0,1.0);
  glRotatef(90.0,1.0,0.0,0.0);
  glRotatef(Zrot,0.0,0.0,1.0);
  glCallList(Ball);
  glPopMatrix();
  glFlush();
  auxSwapBuffers();
}

static void CALLBACK idle(void){
  static float vel0 = -100.0;
  Zrot += Zstep;
  Xpos += Xvel;
  if(Xpos>=Xmax) {
    Xpos = Xmax;
    Xvel = -Xvel;
    Zstep = -Zstep; }
  if(Xpos<=Xmin) {
    Xpos = Xmin;
    Xvel = -Xvel;
    Zstep = -Zstep; }
  Ypos += Yvel;
  Yvel += G;
  if(Ypos<Ymin) {
    Ypos = Ymin;
    if(vel0==-100.0)  
      vel0 = fabs(Yvel);
    Yvel = vel0; }
  draw();
}

void init() {
  Ball = make_ball();
  glEnable(GL_LIGHTING) ;
  glEnable(GL_LIGHT0) ;
  glEnable(GL_DEPTH_TEST) ;
  glEnable(GL_NORMALIZE) ;
  glDepthFunc(GL_DEPTH) ;
  glShadeModel(GL_FLAT);
}

void main(void) {
  auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA|AUX_DEPTH);
  auxInitPosition(0,0,250,250);
  auxInitWindow("Une balle rebondissante") ;
  init();
  auxIdleFunc(idle);
  auxReshapeFunc(reshape);
  auxMainLoop(draw);
}
 RETOUR