begin process at 2010 02 09 23:54:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > PONG EN OPENGL

PONG EN OPENGL


 Information sur la source

Note :
Aucune note
Catégorie :OpenGL Niveau :Débutant Date de création :13/07/2004 Date de mise à jour :14/07/2004 17:46:52 Vu :5 320

Auteur : khayyam

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • #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;
  • }
#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;
}



 Historique

14 juillet 2004 17:46:53 :

 Sources du même auteur

Source avec une capture CRÉATION DE LABYRINTHE POUR POVRAY
Source avec une capture ÉCRITURE DE LABYRINTHE
Source avec une capture PROBLÈME DES 8 REINES
Source avec une capture RÉSOLUTION DE SYSTÈMES D'ÉQUATIONS LINÉAIRES
DÉCRYPTER VIGENERE AVEC OU SANS LA CLEF

 Sources de la même categorie

Source avec Zip JEU DE DAMES 3D par vbclaude
Source avec Zip CHARGEMENT DES TEXTURES EN OPENGL par Jackyzgood
Source avec Zip Source avec une capture OPENGL - UN PEU DE NEIGE... par underprog
Source avec Zip Source avec une capture JEU DE LA VIE 3D OPENGL AVEC GESTION SOURIS par fratleym
Source avec Zip Source avec une capture SPEAD RACER par jngl

Commentaires et avis

Commentaire de AlexMAN le 13/07/2004 23:47:10

Je peux te demander pourquoi tu as choisi OpenGL a directX ? nivo Perf, nivo Gout ... ?

Commentaire de Clem le 13/07/2004 23:52:11

peut être parce que glut est compatible sous linux, contrairement a directx qui n'y existe pas du tout dans le monde de tux.

Commentaire de khayyam le 14/07/2004 10:10:07

et peut-être aussi pour promouvoir encore plus l'univers du libre (et aussi pour la portabilité sous linux, comme l'a dit Clem).    et oui, je rappelle que directx n'est pas ce qu'il y a de plus libre ....

Commentaire de Kirua le 14/07/2004 12:18:02

et puis aussi pr la simplicité, il y a bcp moins de choses à initialiser avec OpenGL, alors qu'avec DirectX, c'est quasiment tout (même si, je le reconnais, ça ajoute de la flexibilité).

je ne vois pas le bout de code qui te fait passer en 2D, et c'est normal puisque tu ne le fais pas, pq tu dessines en 3D pr un jeu 2D?

Commentaire de khayyam le 14/07/2004 12:42:52

et ce serait quoi le bout de code magique ?

Commentaire de Kirua le 14/07/2004 12:48:22

[va fouiller dans ses codes]

voilà, ça sort de GamesTutorial, je m'en vais pr de bon mtnt, donc je ne pourrai pas répondre si tu as des questions pdt au moins 6 jours. ciao

///////////////////////////////// ORTHO MODE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
/////
/////    This function changes our projection mode from 3D to 2D
/////
///////////////////////////////// ORTHO MODE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*

void OrthoMode(int left, int top, int right, int bottom)
{
    // This function takes in rectangle coordinates for our 2D view port.
    // What happens below is, we need to change our projection matrix.  To do this,
    // we call glMatrixMode(GL_PROJECTION) to tell OpenGL the current mode we want.
    // Then we push on a new matrix so we can just call glPopMatrix() to return us
    // to our previous projection matrix, but first we will render in ortho mode.
    //  Next, we load a new identity matrix so that everything is initialize before
    // we go into ortho mode.  One we switch to ortho by calling glOrth(), we then
    // want to set our matrix mode to GL_MODELVIEW, which puts us back and ready to
    // render our world using the model matrix.  We also initialize this new model view
    // matrix for our 2D rendering before drawing anything.

    // Switch to our projection matrix so that we can change it to ortho mode, not perspective.
    glMatrixMode(GL_PROJECTION);                        

    // Push on a new matrix so that we can just pop it off to go back to perspective mode
    glPushMatrix();                                    
    
    // Reset the current matrix to our identify matrix
    glLoadIdentity();                                

    //Pass in our 2D ortho screen coordinates.like so (left, right, bottom, top).  The last
    // 2 parameters are the near and far planes.
    glOrtho( left, right, bottom, top, 0, 1 );    
    
    // Switch to model view so that we can render the scope image
    glMatrixMode(GL_MODELVIEW);                                

    // Initialize the current model view matrix with the identity matrix
    glLoadIdentity();                                        
}


///////////////////////////////// PERSPECTIVE MODE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
/////
/////    This function changes our returns our projection mode from 2D to 3D
/////
///////////////////////////////// PERSPECTIVE MODE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*

void PerspectiveMode()                                        // Set Up A Perspective View
{
    // This function doesn't really go to perspective mode, since we aren't
    // using gluPerspective(), but if you look in OrthoMode(), we push on
    // a matrix once we change to our projection matrix.  All we need to do is
    // pop that matrix off of our stack and it will return to our original perspective
    // matrix.  So, before we pop the current matrix, we need to tell OpenGL which
    // matrix we want to use by changing our current matrix mode to perspective.
    // Then we can go back to our model view matrix and render normally.

    // Enter into our projection matrix mode
    glMatrixMode( GL_PROJECTION );                            

    // Pop off the last matrix pushed on when in projection mode (Get rid of ortho mode)
    glPopMatrix();                                            

    // Go back to our model view matrix like normal
    glMatrixMode( GL_MODELVIEW );                            

    // We should be in the normal 3D perspective mode now
}

Commentaire de amomo le 14/07/2004 17:25:35

pour passer en 2D il y a aussi
gluOrtho2D
à la place glOrtho
il y a 4 paramètre qui sont: left,right,top,bottom mais je me souviens plus l'ordre .

Commentaire de khayyam le 14/07/2004 17:47:39

mise à jour - merci Kirua, mais vous en onviendrez tous, la différence ne saute pas aux yeux ;-)

Commentaire de JackosKing le 14/07/2004 21:39:46

opengl n'est pas compatibe u'avec linux, mais aussi avec tous les unix etc... et en particuler mac! d'où l'interet a préferer opengl à directx.

Commentaire de Kirua le 19/07/2004 23:38:51

c'est heureux que la différence ne se voit pas mais... est-ce que tu as changé tous mes glVertex2i() ? sinon y a eu un problème ^^ désolé de ne pas aller voir ton code, suis assez crevé... et vu l'heure, c'est grave

Commentaire de Kirua le 19/07/2004 23:39:00

c'est heureux que la différence ne se voit pas mais... est-ce que tu as changé tous les glVertex2i() ? sinon y a eu un problème ^^ désolé de ne pas aller voir ton code, suis assez crevé... et vu l'heure, c'est grave

Commentaire de Seiken le 22/08/2004 18:19:03

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 !
;-)

Commentaire de Kirua le 22/08/2004 18:34:41

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! :)

Commentaire de Seiken le 22/08/2004 18:37:17

Ah ouais, je vois... ok
Merciii !

Commentaire de Seiken le 23/08/2004 11:20:33

Mais, si on met plusieurs balles, elles vont avoir la même trajectoire non ? (à savoir dx et dy)

Commentaire de Kirua le 23/08/2004 11:44:04

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales