#1 Le 23/05/2007, à 21:46
- gilbert
[C++] lire le clavier dans un programme OpenGL
Bonjour,
je dois développer un petit jeu pour linux, j'utilise feisty, du genre arkanoid, et je dois utiliser freeglut 3 (imposé).
Voilà, mon jeu fonctionne très bien, mais je veux ajouter désormais un high score, et lorsque le joueur a réalisé le nombre de points nécessaire pour y entrer, je lui demande son pseudo, qui sera inscrit dans un fichier avec les points qu'il a fait.
Toute ma méthode fonctionne correctement excepté une seule chose : la saisie du pseudo.
j'utilisais dans un premier temps la fonction void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y)), j'arrive donc à lire le clavier, et stoquer dans un string le pseudo entré, mais le problème est que je ne peux jamais sortir de mon traitement, et si je passe NULL à glutKeyboardFunc pour arrêter le callback, alors le jeu se bloque.
J'ai alors essayé une autre solution : lire le buffer clavier du pc avec un syscall que j'ai fait en assembleur, la fonction 3 de l'interruption 80h .Cette fois-ci plus de bloquage, mais en fait, il ne lit pas le buffer clavier du pc, mais bien le texte saisi depuis la console.
Alors ma question est: est-ce que quelqu'un sait comment lire le clavier depuis une application OpenGL ? Que ce soit directement le buffer contenant les make et break codes ou bien un bufer un peu plus haut niveau avec déjà des codes ascii, où y a-t-il une solution vraiment haut-niveau qui évite de plonger si bas dans le système?
Merci d'avance pour votre aide. Gilbert
Simplement moi-même..
Hors ligne
#2 Le 24/05/2007, à 00:53
- Link31
Re : [C++] lire le clavier dans un programme OpenGL
si je passe NULL à glutKeyboardFunc pour arrêter le callback, alors le jeu se bloque.
Forcément, si glut appelle une fonction à l'adresse NULL, ça faire une erreur de segmentation...
J'ai alors essayé une autre solution : lire le buffer clavier du pc avec un syscall que j'ai fait en assembleur, la fonction 3 de l'interruption 80h
Essaie avec quelque chose comme ça :
bool b;
std::string nom;
void uneFonctionQuelconque()
{
b = false;
while (jeu->run());
b = true;
}
void appuiTouche(unsigned char key, int x, int y)
{
if (b)
{
if (key != 13)
{
nom += key;
// afficher la nouvelle lettre à l'écran
}
else
{
b = false;
// faire ce qu'il y a à faire avec le nom ici
}
}
}
int main()
{
glutKeyboardFunc(appuiTouche);
glutMainLoop();
}
Dernière modification par Link31 (Le 24/05/2007, à 00:53)
Hors ligne
#3 Le 24/05/2007, à 19:24
- gilbert
Re : [C++] lire le clavier dans un programme OpenGL
Salut!
C'est justement ceci que j'avais fait! et ça fonctionne très bien jusqu'au moment ou je n'ai plus besoin de tester le clavier.. En fait il ne retourne jamais de appuiTouche...
C'est pour ça que je suis un peu perdu
Simplement moi-même..
Hors ligne
#4 Le 24/05/2007, à 19:44
- Link31
Re : [C++] lire le clavier dans un programme OpenGL
Le callback appuiTouche sera toujours appelé à chaque appui d'une touche à partir du moment où il est défini. D'où l'utilité du "if (b)".
Quand tu veux tester les touches pressées par l'utilisateur, définis b comme vrai. Ainsi la condition "if (b)" sera vérifiée et le code de gestion du clavier sera exécuté.
Quand tu n'as plus besoin de t'occuper du clavier, disons quand l'utilisateur appuie sur entrée (code 13 si je me souviens bien), il faut définir b comme faux. Ainsi la condition "if (b)" sera désormais fausse et au prochain appui d'une touche, rien ne se passera (la fonction appuiTouche quittera tout de suite après le "if" faux).
Normalement ça devrais fonctionner, aurais-tu oublié quelque chose ? Ou est-ce de ma faute ?
Hors ligne
#5 Le 24/05/2007, à 19:52
- NicoA380
Re : [C++] lire le clavier dans un programme OpenGL
En fait il ne retourne jamais de appuiTouche...
Tu veux dire que la fonction de callback n'est jamais appelée ?
Qu'il appel ce cesse cette fonction ?
Qu'il n'en sort pas ? (ça n'a pas de sens)
Hors ligne
#6 Le 24/05/2007, à 20:44
- gilbert
Re : [C++] lire le clavier dans un programme OpenGL
En fait, la structure qui appelle glutKeyboardFunc est déjà définie, et je veux la modifier en cours d'exécution de glutMainLoop... est-ce possible? C'est ce que je fais, je redéfinis la fonction à appeler par glutKeyboardFunc et je l'appelle, et là, il appelle sans cesse cette fonction, même quand je ne le désire plus.
Simplement moi-même..
Hors ligne
#7 Le 24/05/2007, à 21:47
- NicoA380
Re : [C++] lire le clavier dans un programme OpenGL
Il ne faut pas faire ça, mais faire une seule fonction de calback qui a un switch (ou if/else if) en fonction du mode du jeu (jeu/menu/prompt pseudo) défini par un enum ou des #DEFINE, et une variable global qui stock l'état courant.
A l'intérieur des blocs du switch, sois tu traites directement, soit tu appels tes fonctions keyboard_jeu(...), keyboard_menu(...), keyboard_prompt(...) qui sont tes anciennes fonctions callback que tu voulais changer en cours d'exécution.
Hors ligne