Pong en opengl

Contenu du snippet

un pong (deux joueurs) bien sympa entièrement en glut, mouvements : e,d et p,m ESC pour quitter
notez la portabilité du code.

Source / Exemple :


#include <GL/glut.h>
#include <stdio.h>

/////////////////////////////////
struct{
    float x,y;
}balle;    

typedef enum {false, true} bool;
bool touche[256];

int hauteur, largeur;
float dx=-.0003, dy=0;
float centre_raq1, centre_raq2;

///////////////////////////////////

void draw_raq()
{  
  glBegin(GL_POLYGON);
     glColor3f(1.0,0.0,0.0);
     glVertex2f(-.05 -.95,.2+centre_raq1);
     glColor3f(0.0,1.0,0.0);
     glVertex2f(.05  -.95,.2+centre_raq1);
     glColor3f(0.0,0.0,1.0);
     glVertex2f(.05  -.95, -.2+centre_raq1);
     glColor3f(1.0,1.0,1.0);
     glVertex2f(-.05 -.95, -.2+centre_raq1);
  glEnd();
  
  glBegin(GL_POLYGON);
     glColor3f(1.0,0.0,0.0);
     glVertex2f(-.05 +.95,.2+centre_raq2);
     glColor3f(0.0,1.0,0.0);
     glVertex2f(.05  +.95,.2+centre_raq2);
     glColor3f(0.0,0.0,1.0);
     glVertex2f(.05  +.95, -.2+centre_raq2);
     glColor3f(1.0,1.0,1.0);
     glVertex2f(-.05 +.95, -.2+centre_raq2);
  glEnd();
  
}    

void draw_balle(void)
{
  glBegin(GL_POLYGON);
     glColor3f(1,1,0);
     glVertex2f(-.04+balle.x,-.04+balle.y);
     glColor3f(1,1,0);
     glVertex2f(-.04+balle.x,.04+balle.y);
     glColor3f(1,1,0);
     glVertex2f(.04+balle.x, .04+balle.y);
     glColor3f(1,1,0);
     glVertex2f(.04+balle.x, -.04+balle.y);
  glEnd();
}    

void rebonds(void)
{
// rebond en haut
if (balle.y>1)
    {
        balle.y=1;
        dy=-dy;
    }    
// rebond en bas    
if (balle.y<-1)
    {
        balle.y=-1;
        dy=-dy;
    }    
    
//rebond à droite (raquette)
if ((balle.x>.9) && (balle.y>-.2+centre_raq2) && (balle.y<.2+centre_raq2))
    {
        balle.x=.9;
        dx=-dx;
        dy+=(balle.y-centre_raq2)/500;
    }    
if (balle.x>1)
   exit(0);
   
//rebond à gauche (raquette)
if ((balle.x<-.9) && (balle.y>-.2+centre_raq1) && (balle.y<.2+centre_raq1))
    {
        balle.x=-.9;
        dx=-dx;
        dy+=(balle.y-centre_raq1)/500;
    }    
if (balle.x<-1)
   exit(0);

}    

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  
  // dessin de la raquette
  draw_raq();
  
  balle.x+=dx;
  balle.y+=dy;
  
  rebonds();
  draw_balle();
  
  glFlush();
  glutSwapBuffers();
  glutPostRedisplay();
}    

void idle(void)
{
   if (touche['e'])
      if (centre_raq1<1)
            centre_raq1+=.0005;

   if (touche['d'])
      if (centre_raq1>-1)
            centre_raq1-=.0005;
          
   if (touche['p'])
      if (centre_raq2<1)
            centre_raq2+=.0005;

    
   if (touche['m'])
      if (centre_raq2>-1)
            centre_raq2-=.0005;
           
   glutPostRedisplay();
}

void keyboard(unsigned char key,int x, int y)
{
   if (key==27) exit(0);
   
   touche[key]=true;    
}    

void  reshape(int w,int h)
{    
   glViewport(0,0,w,h);
   
   hauteur=h;
   largeur=w;          
}

void KeyN_up(unsigned char key, int x, int y)
{
    touche[key] = false;
}

///////////////////////////////////////////////
int main(int argc,char **argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);
  glutCreateWindow("pong");
  glutSetCursor(GLUT_CURSOR_NONE); 

  glClearColor(0.0,0.0,0.0,0.0);
 // [merci Kirua] 
 glMatrixMode(GL_PROJECTION);       
  glOrtho( -1, 1, -1, 1, 0, 1 );    
  glMatrixMode(GL_MODELVIEW);  
// [/ merci Kirua]
  balle.x=balle.y=0; // on met la balle au centre
  centre_raq1=centre_raq2=0; // on met les raquettes au milieu

  // callbacks
  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard);
  glutReshapeFunc(reshape); 
  glutIdleFunc(idle); 
  glutKeyboardUpFunc(KeyN_up);  
  
  glutMainLoop();
  return 0;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.