Pong en opengl

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 040 fois - Téléchargée 31 fois

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

Ajouter un commentaire

Commentaires

Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

ben ça dépend comment le jeu est implémenté... j'imagine que la balle devrait avoir ce genre de prototype:

class Balle
{
Vecteur2D Position;
Vecteur2D Vitesse;
short Rayon;
RVBA Couleur; //structure avec 4 propriétés R,V,B et A
};

Les vecteurs sont très pratique pour des objets qui doivent bouger: il suffit de faire Position += Vitesse * temps; à chaque passage de la boucle, avec "temps" le nombre de secondes (attention, pas millissecondes) écoulées depuis la dernière fois qu'on a effectué ce calcul. A chaque collision on recalcul le vecteur Vitesse pour réorienter, et éventuellement accélérer/décélérer la balle.

c'est souple, simple, et ça permet de gérer plusieurs balles. Après, si tu veux que les balles rebondissent entre elles, il va falloir le coder aussi, mais ça se passe tjs avec des vecteurs.
Messages postés
14
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
24 avril 2005

Mais, si on met plusieurs balles, elles vont avoir la même trajectoire non ? (à savoir dx et dy)
Messages postés
14
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
24 avril 2005

Ah ouais, je vois... ok
Merciii !
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

avec ta version modifiée, essaye d'écrire une variante du jeu avec 15 balles... tu vois, la POO est préparée à ce genre de changement! :)
Messages postés
14
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
24 avril 2005

Salut, moi je trouve que ton code est très compréhensible (pourtant je suis un débutant), mais je me demande bien pourquoi tu a utilisé une struct "balle", j'ai un peu modifié ton code en l'enlevant et en la remplaçant par des variables ballex et balley, ça marche tout aussi bien ! (j'ai un peu de mal avec la POO moi...
Bonne chance !
;-)
Afficher les 16 commentaires

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.