problème de souris OpenGL

problème de souris OpenGL - C++ - Programmation

Marsh Posté le 17-08-2005 à 14:02:43    

Youpi j'adore quand mes sujet se suivent, j'ai l'impression d'être vraiment nul...
 
Enfin bon voilà j'utilise OpenGL, GLUT et FMOD pour un petit jeu de combat qui se déroule pour l'instant en deux "phases":
 
une phase de menu ou l'on choisit son monde en cliquant sur un petit carré jaune qui par la suite sera une jolie image le représentant.
 
une phase de jeu en un seul round pour l'instant et encore loin d'être finie.
 
Tout se passe bien pendant le choix du monde et pendant son chargement mais quand le jeu commence, dès que je bouge la souris j'obtiens une jolie erreur windows (Rapport d'erreur Microsoft saura tout sur vous si vous cliquez sur "envoyer" etc)
 
voilà comment je passe d'une "phase" à l'autre:
 

Code :
  1. void charge_monde()
  2. {
  3.     Message bo; //Classe à part pour afficher des messages
  4.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  5.     glLoadIdentity();
  6.    
  7.     glColor3f(1,1,0);
  8.    
  9.     bo.texte=new char[28];
  10.     bo.x=largeur_fenetre/2-13*16;
  11.     bo.y=hauteur_fenetre/2-16;
  12.     bo.rouge=1;
  13.     bo.vert=1;
  14.     bo.bleu=0;
  15.     bo.taille=1;
  16.     //initialisation de la skybox:   
  17.     strcpy(bo.texte,"Chargement de l'exterieur..." );
  18.    
  19.     afficher_chaine(bo,police);
  20.     glutSwapBuffers();
  21.        
  22.     init_skybox(); //Charge les textures
  23.        
  24.     delete [] bo.texte;
  25.     glutSetCursor(GLUT_CURSOR_NONE);
  26. //Initialisation de la scène 3d car le menu est en 2d
  27.     glMatrixMode(GL_PROJECTION);
  28.     glLoadIdentity();
  29.     gluPerspective(90,largeur_fenetre/hauteur_fenetre,0.01,300);
  30.     glMatrixMode(GL_MODELVIEW);
  31.     glLoadIdentity();
  32.     glColor3f(1,1,1);
  33.        
  34.     //Divers
  35.     pause=FAUX;
  36.     demo=VRAI;
  37.        
  38.     //Musique
  39.     int i=glutGet(GLUT_ELAPSED_TIME)%nb_musiques;//une musique
  40.                                                  //"au pif"
  41.     musique=FSOUND_Stream_Open(musiques[i],FSOUND_NORMAL,0,0);
  42.     FSOUND_Stream_Play(CANAL_MUSIQUE,musique);
  43.     longueur_musique=FSOUND_Stream_GetLength(musique);
  44.     vol=VRAI;
  45.        
  46.     glutMouseFunc(souris); // cette fonction est VIDE
  47.     glutDisplayFunc(aff); // fonction d'affichage du jeu
  48.     glutIdleFunc(gere); //Fonction de gestion des évènements
  49. }


 
Merci!


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 14:02:43   

Reply

Marsh Posté le 17-08-2005 à 14:17:31    

Oups en fait je crois que ça ne vient pas de la souris parceque j'ai la meme chose si je change de tâche (alt-tab) ou si j'appuie sur la touche Windows(R)(c)(tm)...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 15:17:10    

Y'a pas de secret, faut debugger !


---------------
Töp of the plöp
Reply

Marsh Posté le 17-08-2005 à 16:03:14    

mouais mais j'utilise devc++ et le debugger marche pas avec mon appli OpenGl et puis comme je te l'ai dit, si je change de tâche: crash! donc y'a de forte chance pour qu'un breakpoint fasse la meme chose qd je retourne au debugger.
Sinon j'ai bien soft-ice mais comprendre le code c++ traduit en assembleur après les optimisations du compilateur.... j'aime bien l'assembleur ms j'ai des limites...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 16:06:24    

Cependant, si tu as un moyen (technique sauvage, autre debugger...) toute idée sera la bienvenue!!
 
En plus je sais pas trop si ça vient de mon code parceque là, depuis mon dernier message mon jeu tourne en boucle avec la souris débranchée (y'a une micro micro micro IA pour que les joueurs se tatanent la gueule) et pas le moindre bug (enfin si Hector éclate la gueule d'Achille).


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 16:12:34    

tu n'as pas prévu un mode fenêtré pour faciliter le debug ?
 
Edit : parce que bon, les applis en plein écran, à moisn de debugger à coups de log ou de session de debug distante, c'est la mort (même avec un dual screen :p)


Message édité par theshockwave le 17-08-2005 à 16:13:20
Reply

Marsh Posté le 17-08-2005 à 16:12:59    

en commentant " glutMouseFunc(souris); // cette fonction est VIDE" ça passe ?


Message édité par jlighty le 17-08-2005 à 16:13:24
Reply

Marsh Posté le 17-08-2005 à 16:30:48    

si je commente ça et que par inatention je clique, si par hasard je me trouve sur l'emplacement d'un des anciens "boutons" je vais me retrouver avec un chargement d'un nouveau monde sans supprimer l'ancien, je vais avoir plein de problèmes (du style des delete [] xxxx; qui vont  etre oubliés parcequ'il ont lieu à la fin du round....)
je vais essayer sans plein écran..


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 16:39:21    

Oui tu as meilleur temps de lancer ton application en mode fenêtré c'est beaucoup plus facile à debugguer.

Reply

Marsh Posté le 17-08-2005 à 16:44:10    

oulala
oulalalalalalalala
quand je suis en mode fenêtré ça plante dès la fin de la fonction que j'ai copiée au debut. En fait c'est comme avant sauf que je n'ai plus besoin de faire alt-tab puisque mon appli n'est pas "toute seule" directement.
Donc j'étais content, le debugger va marcher c'est cool!!!!
sauf que le debugger de dev c++, aie aie aie.
je lance, je pose un breakpoint au debut de la fonction, j'y vais pas à pas et puis stupeur tout d'un coup la ligne bleue(qui m'indique où j'en suis dans le prog) remonte et remonte encore puis redescend puis remonte et puis tout d'un coup je me retrouve dans le destructeur de mon joueur et puis tout d'un coup encore ailleurs jusqu'a erreur de segmentation.
Pourtant si je fais tourner le jeu tout seul, ça marche et même très bien....
snif.........


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 16:44:10   

Reply

Marsh Posté le 17-08-2005 à 18:35:50    

bo.texte devrait faire 29 char, pas 28.
 
Edit : typo


Message édité par matafan le 17-08-2005 à 18:36:18
Reply

Marsh Posté le 17-08-2005 à 20:15:03    

c vrai...
Bon alors, j'ai commenté tout mon code puis j'ai décommenté petit à petit et j'ai isolé deux zones critiques.
 
La première c'est le moment où j'initialise les volumes et le pb c'est que j'ai exactement la meme portion de code dans un autre prog (j'avais fait un copier coller) et ça marche sans pb, à suivre.
 
la seconde est beaucoup plus enigmatique.
j'appelle une fonction  void gestion_collision(contact)
contact est une struct de mon prog qui fonctionne dans d'autre fonctions
si je commente l'appel à cette fonction, ça marche (mais les joueurs se passe à travers).  
par contre, si je laisse l'appel mais que je commente tout le code de la fonction, ca plante. j'ai meme essayé de supprimer le code et de laisser:

Code :
  1. void gestion_collisions(contact bleurkkk)
  2. {
  3. }


ca plante.
je comprends pas....


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 20:34:36    

gestion_collision est appelée par la fonction gere ?
comment est déclaré et initialisé "contact" ?

Reply

Marsh Posté le 17-08-2005 à 20:52:04    

oui elle est appelée par la fonction gère
 
dans baston.hpp:
//Pour les collisions:
typedef struct
{
    unsigned int contact1;
    unsigned int contact2;
}Contact;
 
dans la fonction gere:
 
Contact contact;
...
contact=test_collision();
gestion_collisions(contact);
 
...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 20:54:12    

après contact=test_collision();  
le contenu de contact est correct ?

Reply

Marsh Posté le 17-08-2005 à 21:16:25    

le contenu de contact est forcément correct puisqu'il contient deux entiers et n'importe quelle valeur convient à ma fonction car c'est un masque:
si 0-> pas de collisions
si 1 le joueur frappe la tete avec son poing
si 2 "                                " bras
si 4 "                                " pied
...
et puis comment se fait il que ça plante avec une fonction vide?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 21:18:46    

Quelles sont les instructions dans test_collision ?

Reply

Marsh Posté le 17-08-2005 à 21:18:50    

mais bon je vais qd meme faire des tests on ne sait jms
mais bon meme si la valeur ne veut rien dire pour mon prog normalement un entier a une valeur qui existe, pas comme un pointeur qui pourait pointer n'importe où non?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 21:25:53    

Je suppose que ça plante dans la fonction test_collision et non pas à l'appel de cette fonction. L'adresse de contact est correcte ? elle n'a pas été modifié entre temps ?

Reply

Marsh Posté le 17-08-2005 à 23:49:49    

je ne pense pas que cela vienne de ces fonctions, elles n'ont pas été modifiées récemment et elle fonctionnaient avant. En plus, j'ai remplacé l'appel de gestion_collisions par cout<<"Hello"; et ça plante pareil. Ca l'affiche une fois avant.
Si je commente cette ligne ça marche...
Je me demande si ça vient pas de FMOD c'est le dernier truc sur lequel je bossais mais comme ce pb est arrivé d'un coup quand je voulais surveiller ma conso de memoire je ne sais pas trop de quand il date.
j'ai une sauvegarde "récente" où j'avais commencé à mettre le son et qui fonctionne, je vais repartir de la avec quelques copier-coller mais pfffff ça m'énerve de perdre (ou presque) une ou deux semaines de boulot!


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 17-08-2005 à 23:55:12    

Essaye de commenter tous les appels à FMOD

Citation :


# musique=FSOUND_Stream_Open(musiques[i],FSOUND_NORMAL,0,0);
#     FSOUND_Stream_Play(CANAL_MUSIQUE,musique);
#     longueur_musique=FSOUND_Stream_GetLength(musique);

Reply

Marsh Posté le 18-08-2005 à 00:53:55    

je l'avais déjà fait.
En fait j'ai une bonne nouvelle: on a tous galéré pour rien!!!
je crois que je vais devenir fou et les coup de tete ds le mur n'ont rien arrangé!
j'ai presque envie de me bourrer la gueule pour oublier tout ça.
Voilà la solution:
il fallait décocher la case "optimisation" dans les propriétés du compilateur.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Enfin, un moins mon code est bon.
Merci bcp à tous et surtout toi jlighty


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-08-2005 à 04:37:41    

C'est pas pour te casser le moral mais si ça passe sans optimisations et que ça plante avec, c'est probablement que tu as vraiment une erreur dans ton code. Et a priori ça peut casser aussi sans optimisation, même si c'est apparemment plus rare.
 
Tu as essayé de debugger à partir du core ? C'est quand même comme ça qu'on fait en général...

Reply

Marsh Posté le 18-08-2005 à 20:33:50    

comment ça à partir du core?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-08-2005 à 20:35:46    

ça peut pas être mon compilateur qui foire? parceque je l'ai vraiment fait tourner longtps en testant (je pense) tout ce qui peut arriver et ça marche bien...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-08-2005 à 20:40:11    

ça peut pas être les optimisations qui font que ensuite le prog ne peut marcher qu'au premier plan?
En fait j'avais jms utilisé ça et je sais pas trop comment ça marche (un petit peu qd meme j'ai fait de l'assembleur et j'avais un prof cette année qui s'occupait de ça, avant il faisait des démos "old-school" comme Harkonnen (voir forum assembleur je crois)).


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-08-2005 à 23:44:50    

Quand un programe plante ca genere un "core", une image memoire du programme a l'instant ou il a fait le truc illegal. Ensuite tu peux charger le core dans un debugger pour faire une analyse post-mortem. Enfin c'est comme ca sous linux/unix, j'imagine qu'il y a un mecanisme similaire sous windows.
 
Sinon oui, ca peut etre un bug du compilateur. Mais je n'y crois pas trop. A mon avis c'est un debordement de buffer du a une variable non initialisee, ou un truc du genre.

Reply

Marsh Posté le 19-08-2005 à 12:15:41    

ça doit être pratique c'est vrai je vais me renseigner mais j'ai peut confiance en windows(tm)(r)(c), linux/unix est bcp mieux (pour ce que j'ai vu en cours) pour les developpeurs, windobe c'est pour la populace...
C'est qd meme bizare que le bug n'arrive que si je change de tâche, peut-etre est-ce un pauvre truc complètement imprévu du aux optimisations et mes bibliotheques, je c pas...
Le pb c'est que windows ne m'indique pas le type d'erreur (segmentation...) juste "voulez-vous envoyer le rapport d'erreur ainsi que toutes vos informations sur votre licence (pirate) à Bilou" et j'ai regardé le rapport d'erreur en question, je n'y ai vu que le nom des différents modules en mémoire au moment du crash avec leur version, je vois pas trop comment ils peuvent savoir qqchose sur mon erreur avec ça.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-08-2005 à 12:21:14    

apparemment il y a a peut près le meme sys sous windows, mais je peut choisir entre faire une image partielle (64Ko) alors la je sais pas trop ce qu'il peut y avoir dans cette image (64 Ko!!) ou image du noyau ou image de la memoire complète.
A approfondir.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-08-2005 à 14:37:28    

ptitchep a écrit :

ça doit être pratique c'est vrai je vais me renseigner mais j'ai peut confiance en windows(tm)(r)(c), linux/unix est bcp mieux (pour ce que j'ai vu en cours) pour les developpeurs, windobe c'est pour la populace...
C'est qd meme bizare que le bug n'arrive que si je change de tâche, peut-etre est-ce un pauvre truc complètement imprévu du aux optimisations et mes bibliotheques, je c pas...
Le pb c'est que windows ne m'indique pas le type d'erreur (segmentation...) juste "voulez-vous envoyer le rapport d'erreur ainsi que toutes vos informations sur votre licence (pirate) à Bilou" et j'ai regardé le rapport d'erreur en question, je n'y ai vu que le nom des différents modules en mémoire au moment du crash avec leur version, je vois pas trop comment ils peuvent savoir qqchose sur mon erreur avec ça.


 
Ce genre de propos n'a pas trop sa place ici ... Ensuite, les rapports d'erreurs servent à récupérer des informations relatives à l'application qui tourne, donc forcément, si c'est une appli à toi qui provoque ca, ton appli ne sera pas dans la base de données d'erreurs connues de microsoft, mais dans le cas inverse, il se peut qu'effectivement (c'est assez rare) ca te donne une solution à ton problème. Ensuite, ce n'est pas parce que tu seras sous un unixoïde que le système de dira directement mieux que "segmentation fault" ... Il ne faut pas rêver, quand même ...
 
Après, si tu utilises un outil qui a des défauts (mais qui est, certes, libre) ne te plains pas du comportement de l'OS ...

Reply

Marsh Posté le 19-08-2005 à 15:54:35    

ok j'y vais un peu fort dsl

Citation :


Ensuite, ce n'est pas parce que tu seras sous un unixoïde que le système de dira directement mieux que "segmentation fault"  


justement j'aimerais bien qu'il me dise au moins "segmentation fault" plutot que de crasher sans explications.
Enfin bon de toute façon je fais avec, je suis incapable de me faire mon propre OS...

Citation :

Après, si tu utilises un outil qui a des défauts (mais qui est, certes, libre) ne te plains pas du comportement de l'OS ...


ça, je sais tjs pas si c mon outil ou moi... (sûrement les deux)
 
Autre question sans aucun rapport:
comment fais-tu pour que tes citations commencent par:
xxxxxxxx a ecrit:
 
au lieu de  
citation:


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 22-08-2005 à 10:36:32    

ptitchep a écrit :

justement j'aimerais bien qu'il me dise au moins "segmentation fault" plutot que de crasher sans explications.
Enfin bon de toute façon je fais avec, je suis incapable de me faire mon propre OS...


 
Bah, normalement, il doit te dire quelque chose comme "La mémoire ne peut pas être read" ou un autre message du genre qui signifie clairement que tu as un pointeur qui est parti en promenade un peu trop loin ou un problème de ce genre.
 

ptitchep a écrit :

ça, je sais tjs pas si c mon outil ou moi... (sûrement les deux)


 
C'est surtout ton debugger semble miteux, en tout cas (et auquel je faisais référence). Après, le compilo, j'imagine qu'il va bien, pour sa part.
 

ptitchep a écrit :

Autre question sans aucun rapport:
comment fais-tu pour que tes citations commencent par:
xxxxxxxx a ecrit:
 
au lieu de  
citation:


 
Ce sont les balises quotemsg qui sont insérées automatiquement quand tu réponds à un message déjà posté (tu as une icône au-dessus de chaque message pour voir le profil de l'auteur, modifier le post, y répondre, etc ...)

Reply

Marsh Posté le 22-08-2005 à 13:49:24    

ton crash peut être aussi dû a une invalidation du contexte OpenGl.
 
je m'explique: en DirectX, il est existe l'état de "lost state", où un évenment extérieur (style tu est en rendu fullscreen, et un alt-tab te minimize ton app) va faire que le contexe de rendu est perdu, et il faut alors le supprimmer/recréer en tout ou partie (certaines ressources seront persistantes au lost state, d'autres seront à détruire/reconstruire, comme les rendertargets etc...).
 
en OpenGl il semble y avoir le même problème (qui est géré par le GLUT, et les fonctions assigné au glut, qui vont bien qui seront appellés suivant les évenements), puisque si tu prends Quake 3 ou autre jeu OpenGl, tu fais un changement fenêtré/plein écran, il semble recharger le niveau, tu changes de résolution, pareil, etc...

Reply

Marsh Posté le 14-09-2005 à 18:49:55    

ok...
et comment je sais ce que je dois recharger? et quand?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 14-09-2005 à 18:50:35    

je vais creuser.
merci.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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