David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 13 Fev 2012, 12:52 Message non corrigé | |
|
Dessin de l'arme
Pour dessiner l'arme, j'ai simplement ajouté une image 2D à l'écran.
Impact
Pour savoir si un personnage est touché, je fais comme ceci :
- Je dessine la carte sans le personnage
- Je fait un prélèvement du pixel situé sous le viseur à l'aide de la fonction glReadPixels().
- Ensuite je dessine le personnage
- Je refait un prélèvement du pixel situé sous le viseur.
- Si les pixels prélevé ont une profondeur (z-buffer) différente, alors le personnage est touché.
Voici ma version non optimisée de cette méthode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | bool8 Objet3DStatique::dessiner3D(GLint x, GLint y) { // Fonction : Dessine l'objet a l'ecran et retourne TRUE ssi le dessin de l'objet affecte le point GLfloat distancePointAvant, distancePointApres; // Mesure la distance du point glReadPixels (x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &distancePointAvant); // Dessin de l'objet this->dessiner3D(); // Remesure la distance du point glReadPixels (x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &distancePointApres); // Retourne TRUE ssi la distance du point a ete modifier pendant le dessin de l'objet return distancePointAvant != distancePointApres; } |
J'ai eu perreet la semaine dernière au téléphone et il m'a proposé une autre solution, que voici :
Lorsque le joueur tir,
- Il dessine la carte en noir, sans texture.
- Ensuite, il prend la couleur #000001 et dessine le premier personnage sans texture.
- Puis le deuxième avec la couleur #000002 sans texture.
- Puis le troisième en #0000033 et ainsi de suite.
A la fin du dessin, il prélève la couleur du pixel situé sous le curseur et en déduit le personnage touché :
#000000 -> Personne n'est touché
#000001 -> Le personnage 1 est touché
#000002 -> Le personnage 2 est touché
#000003 -> Le personnage 3 est touché
Ainsi, il ne fait qu'une seule fois le prélèvement du pixel et détermine immédiatement le personnage touché :
| if (0 == couleur) { this->listePersonnage[couleur-1]->touche(); } |
Pour optimiser le tout, il serait astucieux d'attendre la fin de l'exécution des instructions entrées dans le pipeline d'OpenGL avant d'appeler la fonction glReadPixels().
Bien entendu, l'image calculée nécessaire à le déduction des conséquences de l'impact n'a pas à être affichée.
Étendre l'herbe
Dans la méthode void Carte::creerListeAffichage(), à la fin, il y a ceci :
| // L'herbe glBindTexture(GL_TEXTURE_2D, this->conteneurTextures.texture("herbe.bmp").texture); // Repetition de la texture suivant les 2 axes glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBegin(GL_QUADS); glTexCoord2i(0, 0); glVertex3i(0, 0, 0); glTexCoord2i(0, 10); glVertex3i(50, 0, 0); glTexCoord2i(10, 10); glVertex3i(50, 50, 0); glTexCoord2i(10, 0); glVertex3i(0, 50, 0); glEnd(); |
Les appels à la fonction glVertex3i() permettent de définir l'étendue de l'herbe en X, Y et Z (les 3 paramètres). En augmentant ou en diminuant l'étendue de l'herbe, la texture sera plus ou moins étirée. Il faut donc la répéter. Ici, pour 50 unités, la texture a été répétée 10 fois en X et en Y. Ce sont les valeurs 10 que l'on vois dans les appels à la fonction glTexCoord2i(). J'ai choisi cette valeur arbitrairement.
Pour que la répétition se face sans qu'on la voie, il faut une texture adaptée : les pixels de gauche sont proche des pixel de droite et les pixels du haut sont proche de ceux du bas.
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|