Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1539 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  problème de souris OpenGL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème de souris OpenGL

n°1177879
ptitchep
Posté le 17-08-2005 à 14:02:43  profilanswer
 

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
mood
Publicité
Posté le 17-08-2005 à 14:02:43  profilanswer
 

n°1177898
ptitchep
Posté le 17-08-2005 à 14:17:31  profilanswer
 

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
n°1177976
_darkalt3_
Proctopathe
Posté le 17-08-2005 à 15:17:10  profilanswer
 

Y'a pas de secret, faut debugger !


---------------
Töp of the plöp
n°1178031
ptitchep
Posté le 17-08-2005 à 16:03:14  profilanswer
 

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
n°1178035
ptitchep
Posté le 17-08-2005 à 16:06:24  profilanswer
 

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
n°1178042
theshockwa​ve
I work at a firm named Koslow
Posté le 17-08-2005 à 16:12:34  profilanswer
 

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
n°1178043
jlighty
Posté le 17-08-2005 à 16:12:59  profilanswer
 

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


Message édité par jlighty le 17-08-2005 à 16:13:24
n°1178059
ptitchep
Posté le 17-08-2005 à 16:30:48  profilanswer
 

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
n°1178072
jlighty
Posté le 17-08-2005 à 16:39:21  profilanswer
 

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

n°1178076
ptitchep
Posté le 17-08-2005 à 16:44:10  profilanswer
 

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
mood
Publicité
Posté le 17-08-2005 à 16:44:10  profilanswer
 

n°1178195
matafan
Posté le 17-08-2005 à 18:35:50  profilanswer
 

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


Message édité par matafan le 17-08-2005 à 18:36:18
n°1178267
ptitchep
Posté le 17-08-2005 à 20:15:03  profilanswer
 

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
n°1178281
jlighty
Posté le 17-08-2005 à 20:34:36  profilanswer
 

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

n°1178300
ptitchep
Posté le 17-08-2005 à 20:52:04  profilanswer
 

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
n°1178302
jlighty
Posté le 17-08-2005 à 20:54:12  profilanswer
 

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

n°1178317
ptitchep
Posté le 17-08-2005 à 21:16:25  profilanswer
 

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
n°1178320
jlighty
Posté le 17-08-2005 à 21:18:46  profilanswer
 

Quelles sont les instructions dans test_collision ?

n°1178321
ptitchep
Posté le 17-08-2005 à 21:18:50  profilanswer
 

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
n°1178324
jlighty
Posté le 17-08-2005 à 21:25:53  profilanswer
 

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 ?

n°1178385
ptitchep
Posté le 17-08-2005 à 23:49:49  profilanswer
 

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
n°1178387
jlighty
Posté le 17-08-2005 à 23:55:12  profilanswer
 

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);

n°1178401
ptitchep
Posté le 18-08-2005 à 00:53:55  profilanswer
 

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
n°1178432
matafan
Posté le 18-08-2005 à 04:37:41  profilanswer
 

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

n°1179137
ptitchep
Posté le 18-08-2005 à 20:33:50  profilanswer
 

comment ça à partir du core?


---------------
deluser --remove-home ptitchep
n°1179138
ptitchep
Posté le 18-08-2005 à 20:35:46  profilanswer
 

ç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
n°1179143
ptitchep
Posté le 18-08-2005 à 20:40:11  profilanswer
 

ç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
n°1179251
matafan
Posté le 18-08-2005 à 23:44:50  profilanswer
 

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.

n°1179487
ptitchep
Posté le 19-08-2005 à 12:15:41  profilanswer
 

ç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
n°1179491
ptitchep
Posté le 19-08-2005 à 12:21:14  profilanswer
 

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
n°1179628
theshockwa​ve
I work at a firm named Koslow
Posté le 19-08-2005 à 14:37:28  profilanswer
 

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

n°1179699
ptitchep
Posté le 19-08-2005 à 15:54:35  profilanswer
 

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
n°1181054
theshockwa​ve
I work at a firm named Koslow
Posté le 22-08-2005 à 10:36:32  profilanswer
 

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 ...)

n°1181206
bjone
Insert booze to continue
Posté le 22-08-2005 à 13:49:24  profilanswer
 

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

n°1199657
ptitchep
Posté le 14-09-2005 à 18:49:55  profilanswer
 

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


---------------
deluser --remove-home ptitchep
n°1199658
ptitchep
Posté le 14-09-2005 à 18:50:35  profilanswer
 

je vais creuser.
merci.


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  problème de souris OpenGL

 

Sujets relatifs
Problème de scrollbar[J2EE] [i18n / l10n] Problème avec l'internationalisation
Problème de loadingProblème de clic sur un object movieClip
[résolu]probleme avec $_FILES lors d'un upload[XML]probleme de parseur avec la DTD
Petit problème[VB.NET] Probleme form
Probléme de saisi de caractére !!Probleme avec mon systeme de pages
Plus de sujets relatifs à : problème de souris OpenGL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR