Executer des opérations juste avant la fonctions pointée par glutKeyboardFunc ? [Résolu]

Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
- - Dernière réponse : KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
- 15 juil. 2005 à 10:20
Est-il possible d'executer des opérations juste avant la fonctions pointée par glutKeyboardFunc ?


En gros ma fonction met une variable à -0.5 en fonction de la touche
appuyée et je voudrais que toutes les variables sooient inits à 0 juste
avant que le clavier soit détecté, à chaque boucle du prog. C'est
pour créer un effet d'allé venue sur la variable en question. Elle est
à -0.5 uniquement quand la touche en question est à l'état bas, sinon
elle est à 0.

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
3
Merci
Je crois que g trouvé l'astuce pour les touches : Ce n'est ptet pas
pour rien qu'y a une fonction glutKeyboardUpFunc qui repère quand on
lache une touche ! C'est exactement ce qu'il me fallait !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 206 internautes nous ont dit merci ce mois-ci

Commenter la réponse de mondrone
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005
0
Merci
Peut etre avec glutIdleFunc ?

glutIdleFunc
La fonction glutIdleFunc établit la fonction de rappel au repos (il n'y a pas d'autres activités).


<OL start=0>
<OL start=0>
<OL start=0>
<OL start=0>
<OL start=0>
<OL>
<LI>Usage</LI></OL></OL></OL></OL></OL>
void glutIdleFunc ( void (*func) ( void ));


func ,

Identifie la nouvelle fonction de rappel pour le repos.


<LI value=0>Description</LI></OL>
La fonction glutIdleFunc établit la fonction de rappel au repos de telle sorte que GLUT peut effectuer des tâches de traitement en arrière-plan ou effectuer une animation continue lorsque aucun événement n'est reçu. La fonction de rappel n'a aucun paramètre. Cette fonction est continuellement appelé lorsque aucun événement n'est reçu. La fenêtre courante et le menu courant ne sont pas changés avant l'appel à la fonction de rappel. Les applications utilisant plusieurs fenêtres ou menus doivent explicitement établir fenêtre courante et le menu courant, et ne pas se fier à l'état courant.


On doit éviter les calculs dans une fonction de rappel pour le repos afin de minimiser les effets sur le temps de réponse interactif.
Commenter la réponse de whikie
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
G deja essayé tel kel, mais ca ne marche pas. Alors, une question : les
fonctions de gestion du clavier et de la souris sont-elles paramétrées
pour fonctionner en interruptions ou en scrutation ?

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Salut j'ai pas tout saisi....

Tu veux executer une fontion avant le tout premier appel a la fonction de keyboard ? :
-> place ton code avant de faire l'appel a glutKeyboardFunc(...) dans le main.

Tu veux executer une fontion a chaque appel de la fonction de keyboard ? :
->place ton code a l'entree de la fonction keyboard(..)

Si aucun de ces cas, explique plus en detail...

KeniiyK
Commenter la réponse de KeniiyK
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Si tu veux, je veux en fait placer ma fonction dans la boucle principal
du prog, mais juste avant l'appel éventuel de la fonction keyboard, de
manière a ce que la fonction s'execute meme quand keyboard ne s'execute
pas, mais kelle s'execute chronologiquement juste avant keyboard quand
celle-ci doit s'effectuer. En gros g un tableau de valeurs. Chaque case
doit etre mise à -0.5 quand on frappe la touche en question (genre case
0 pour 'A', case 1 pour 'B' ....), mais chaque case ne doit rester à
-0.5 que le temps ou la touche est pressée !



G pensé à foutre ma reinit du tableau dans l'idle, avec une condition
sur une variable que je fout à 1 au début du keyb et à 0 à la fin, mais
je voudrais savoir si ya pas plus simple ? Pour ca il faut surtout que
la fonction keyboard soit appelée par scrutation et non ninterruption.

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Je sais pas si j'ai tou saisi (desole g du mal ce soir....) mais sinon appelles ta func dans l'idleFunc et au debut de keyboardFunc.... c pa ca ? bon.... explique chronologiquement les appels de function que tu voudrais avoir...

KeniiyK
Commenter la réponse de KeniiyK
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
OK. Voila mon problème, avec du code ca passera peut etre mieux.



Cette fonction est celle pointée par glutkeyboardfunc :



void Touches(unsigned char key, int x, int y)

{if(key==27)exit(0);

if(key>='a' && key<='z')

positions_y[key-'a']=-0.5;

if(key==' ')

positions_y[26]=-0.5;

old_key=key;

}



Comme tu le vois, a chaque fois qu'on frappe une lettre ou espace, une
variable (qui était à 0) s'affecte à -0.5 . Mois je
voudrais que cette affectation ne dure que pendant le temps ou la
touche en question est enfoncée.

CAD : tu appuie sur 'A', ca affecte poisitions_y[0] à -0.5, et
l'affectation dure, c'est à dire la variable n'as pas de nouvelle
affectation. Quand tu relache la touche donc ici 'A' (quand je dis 'A',
c 'a' en fait mais pas d'importance) la variable est réaffectée à 0.



Pour ce faire j'aurais voulue si tu veux un schéma de ce type là :



position_y[old_key-'a']=0; //Réalloue automatiquement l'ancienne touche à 0

=>appel éventuel de la fonction touche (cad si elle doit etre appelée car une touche a été frappée)
=>A pour effet de mettre la bonne variable à -0.5



Mais je ne ais pas ou placer l'instruction qui est censée venir se loger juste avant Touche()



J'espère que cette fois j'ai expliqué correctement mon problème. LOL et merci pour ta patience !
<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Ok je vois now... c'était rude !!!!, le probleme c'est que GLUT n'est pas multi-threadé donc tant que tu appuies sur une touche GLUT sera dans la keyboardFunc et pas dans une autre.... donc meme si tu arrive a resoudre tes affectations, quand tu sera dans une autre func cela voudra dire que tu as relache la touche et donc 0 dans ta variable....
Il vaudrai mieux que tu fasses position_y[key-'a']=-(position_y[key-'a']+0.5); ainsi chaque appui d'une touche change l'affectation sans rester appuyé...

KeniiyK
Commenter la réponse de KeniiyK
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Par contre, comment se fait-il que la fonction keyboard semble avoir un
raté au départ ? Je m'explique : elle prend bien le premier appui, puis
si tu laise appuyé elle pause un peu genre 1/4 de seconde avant de
repartir et la elle enchaine sans interruption. Pkoi la pause ?

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Je croi que c'est fait expres.... ouvre un document texte et reste appuyé sur une touche tu aura le meme effet. Car au sinon le temps que tu lache la touche en pensant n'y appuyer qu'une seule fois l'ordi aurai le temps d'en enregistrer 10000....

KeniiyK
Commenter la réponse de KeniiyK
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
mais dans un jeu video genre doomlike, quand tu avancen c fluide tout le tps !

et je n'ai jamais eu ce problème quand je faisait du basic (LOL)

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Ben voui mais c'est GLUT..... c'est de base... apres si tu veux faire un truc qui envoie un minimum tu fais pas avec GLUT...., tu prends Qt par exemple.. (c tro bien)...

KeniiiyK

PS : sui sur que Doom a pas ete code avec GLUT ....
Commenter la réponse de KeniiyK
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Je ne pense pas que GLUT existait deja du tps de DOOM 1 de toute manière!

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Mais t'aurais pas plutot une solution avec GLUT LOL ?

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Ben euh non... qd je commence un nouveau prg avec OpenGL maintenant, j'utilise Qt...

Desole

KeniiyK
Commenter la réponse de KeniiyK
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
et Qt n'a pas ce pb ? Paske sous TurboC (LOL je sais c vieux), sous DOS
et sans OpenGL, je l'avais deja ce probleme ! donc je me demande s'il
ne vien pas a la base du langage C...

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
bon, en tout cas pour le 1° pb c a dire le sujet du message, g trouvé
la solution. Le seul pb restant étant que j'utilise un compteur. Je
n'aime pas ca car le compteur dépend de la fréquence du PC. Donc, sous
GLUT n'y aurait-il pas par hasard une manière d'obtenir la fréquence,
ou alors simplement le nombre d'opérations par seconde ou par
milliseconde ? Je sais que de telles infos sont directement dispo sous
DOS, mais sos GLUT ?

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
Content que ca marche, pour Qt, surement qu'il y une tempo aussi pour l'appui repeter mais bon je l'utilise surtout pour l'IHM et par ce qu'elle integre "directment" OpenGL.

KeniiyK
Commenter la réponse de KeniiyK