[openGL] fichier wav/ fonction getColor()

fichier wav/ fonction getColor() [openGL] - C++ - Programmation

Marsh Posté le 28-08-2005 à 19:56:53    

Bonjour !!!
 
Bon, alors en ce moment je suis en train de faire un petit jeu hautement magnifique du point de vue graphique (vaisseau modélisé par des triangles …  donc en 2D ) Mais j’ai un petit souci : tout d’abord j’avais l’intention de mettre des petits bruitages en « .wav » je connais la méthode PlaySound() mais là gros problème : quand il fait le bruit le jeu s’arrête ce qui est vraiment pas cool pour un jeu de tir… Aussi vous ne connaîtrez pas par hasard une autre méthode pour le faire et qui ne bloquerait pas le jeu ?
 
   Mon deuxième problème est pour gérer les collisions avec le décor : j’avait pensé a charger une texture que j’afficherai en fond d’écran et ensuite je pensai définir une couleur (noir) qui ne serait pas un élément du décors et toute les autres couleur seraient du décors donc contact avec cette couleur == explosion. Ainsi pour cela il me faudrait un fonction du type getColor(int x, int y) comme il y en a dans graphics.h mais mon problème c’est que je travaille en openGL donc je sais pas si il y en a une qui fait ça dedans. Donc si vous en connaissez une … (même en Win32).
 
Merci !!! :)  

Reply

Marsh Posté le 28-08-2005 à 19:56:53   

Reply

Marsh Posté le 28-08-2005 à 20:10:23    

oops je suis vraiment désolé j'ai posté trop vite : j'ai eu ma réponce pour PlaySound() sur msdn...  :)  
 
par contre pour un getColor() je suis toujours preneur ...
 
Merci

Reply

Marsh Posté le 28-08-2005 à 21:22:06    

Jette un oeil du côté de glReadPixels c'est ce que tu veux faire même si ce n'est pas ce qu'il y a de plus efficace (les cartes 3D sont optimisées pour envoyer des données depuis la mémoire principale vers le GPU mais pas pour rapatrier des données locales comme le FrameBuffer en mémoire principale)

Reply

Marsh Posté le 29-08-2005 à 10:25:03    

Ok Merci Zeross.
 
   mais j'avoue ne pas bien bien tout saisir... Genre pour ce que j'aurais besoin il faudrait que je fasse :
 

Citation :


glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, &pixels);


 
en utilisant GL_FLOAT pour que ma couleur ne soit pas multipliée par une constante. (d' ailleur je ne comprend pas trop cette histoire de multiplication par une constante... )
 
mais surtout mon gros problème est au sujet de "pixels". je ne trouve pas de classe "pixels". Alors j'ai essayé de la créer en faisant ça :
 

Citation :


 
class pixels{
   public :  
      float r, g , b;
};
 


mais bon là ça marche pas ...
 
Sinon j'ai voulu aler voir du côté du traitement des erreurs de cette fonction : (GL_INVALID_ENUM, GL_INVALID_VALUE, GL_INVALID_OPERATION, ...)
 
mais je ne sais pas où l'on peut récupérer ces constantes. Car il disent que si il y a une érreur pixels n'est pas modifié et quand j'ai éssayé de mettre mon if() devant glReadPixels() il me déclare un erreur et refuse de compiler (normal) puisque la déclaration de glReadPixels est :  

Citation :

void glReadPixels(GLint x, GLint y, ...

Reply

Marsh Posté le 29-08-2005 à 11:08:22    

Essaye un truc de ce genre

Code :
  1. GLubyte pixColor[3];
  2. glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixColor);


 
Ensuite pour voir s'il y a du noir tu n'as plus qu'à vérifier que pixColor[0], pixColor[1] et pixColor[2] valent 0 pour voir s'il y a du blanc les 3 valeurs doivent être à 255 etc... Un truc que tu pourrais faire ce serait, plutôt que d'utiliser une couleur, d'utiliser le canal alpha.
 
Pour la gestion des erreurs en OpenGL il faut faire appel à glGetError qui renvoie un code d'erreur que tu peux ensuite passer à gluErrorString pour obtenir une chaîne de caractères décrivant l'erreur.
 
L'exemple du redbook :

Code :
  1. GLenum errCode;
  2. const GLubyte *errString;
  3. if ((errCode = glGetError ()) != GL_NO_ERROR) {
  4. errString = gluErrorString(errCode);
  5. fprintf (stderr, "Erreur OpenGL : %s\n", errString);
  6. }

Reply

Marsh Posté le 29-08-2005 à 13:35:52    

Ok MERCI ça marche impeccablement bien !!!
 
Bon en ce qui concerne la gestion des erreurs j'ai pas encore essayé mais bon je m'en occupe bientôt.
 
Sinon, géniale cette idée d'utiliser le chanel alpha je sais pas pourquoi j'y avait pas pensé (le manque de géni peut-être...). Par contre tu connaîtrais pas un éditeur d’image qui permet d’accéder au chanel alpha. Car actuellement j’utilise paint et dessus je crois pas que l’on puisse le faire. Du moins je ne sais pas comment on le fait.
 
Et encore Merci pour l’aide !!!  :)  

Reply

Marsh Posté le 29-08-2005 à 14:32:28    

sinon pour avoir un truc plus économique et éviter le glReadPixels(), tu peux générer un bitmap où chaque octet code 8 pixels, donc 1 bit == canal alpha ou résultat de test par rapport à une couleur de masque.

Reply

Marsh Posté le 30-08-2005 à 14:40:40    

ha oui c'est pas bête... :jap:  
je vais essayer...
 
Merci a tous de m'avoir répondu !!!

Reply

Marsh Posté le 30-08-2005 à 14:48:37    

et la méthode ultime, qui serait totallement indépendante du CPU, mais qui nécessite un GPU récent, serait de clearer le stencil buffer, quand tu construit ton décord avec tes tiles, les vaisseaux ennemis, et les munitions, tu mets le stencil a une constante....
 
et tu fais une requête d'occlusion avec le nombre de pixels traçés ou plustôt non traçés (je sais pas si c'est possible) en traçant d'abord ton piti vaisseau uniquement en Z+stencil avec un test contre le stencil, ce qui te permettera de savoir par voie hardware si ton vaisseau il est en collision avec quelque chose qu'il faut pas :D
 
mais bon c'est un peu faire un jeu oldschool qui a besoin d'une geforce fx/radeon 9600, donc c'est un peu creuvard :D

Reply

Marsh Posté le 31-08-2005 à 18:41:09    

Merci ... mais je t'avoue que là j'ai pas tout compris : j'ai pas encore un niveau énorme en openGL alors je pense que je vais me contenter de l'autre solution que tu proposait voir revenir a ma première idée si je n'y arrive pas ...
 
Mais MERCI quand même pour tes idées que tu me propose !!!  :bounce:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed