Soyez le premier à donner votre avis sur cette source.
Snippet vu 9 563 fois - Téléchargée 33 fois
#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; }
23 août 2004 à 11:44
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.
23 août 2004 à 11:20
22 août 2004 à 18:37
Merciii !
22 août 2004 à 18:34
22 août 2004 à 18:19
Bonne chance !
;-)
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.