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;
}
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.