[DirectX] Utiliser D.Input pour la saisie de texte [Code Inside]

Utiliser D.Input pour la saisie de texte [Code Inside] [DirectX] - C++ - Programmation

Marsh Posté le 09-04-2002 à 15:15:50    

J'ai une application DirectX dans laquelle DDraw & DInput sont correctement initalisés.
En fait le problème est lui suivant : quand j'appuie sur une touche, il fait comme si j'appuyais plusieurs fois dessus, ce qui est très embêtant lorsque l'on saisi du texte (lettres en double/triple).
Voici mon code :
 
void KbInput(void)
{
 #define KEYDOWN(name,key) (name[key] & 0x80)
 char buffer[256];
 
 lpDIkeyboard->GetDeviceState(sizeof(buffer),&buff
 
er);
 
 if(KEYDOWN(buffer,DIK_C))
 {
  int n;
  n = strlen(txt);
  txt[n] = 'c';
  txt[n+1] = '\0';
 
  if(lpDDSBack->GetDC(&hdc) == DD_OK)
  {
   TextOut(hdc,0,0,txt,strlen(txt));
   lpDDSBack->ReleaseDC(hdc);
  }
  lpDDSPrimary->Flip(NULL,0);
 }
 Sleep(1000 / 30);
}
 
donc ici cela m'écrit "cc" au lieu de "c" quand je presse la touche 'C'
et dans la boucle des messages de mon appli :
 
while(GetMessage(&msg,NULL,0,0))
{
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 KbInput();
}
 
Le problème vient du Sleep() et de l'appel dans la boucle des messages, mais j'ai "copié" ce procédé d'un exemple de microsoft (je suis newbie 100%) et je ne sais pas comment faire autrement.
Tout n'est peut être pas clair alors si vous voulez plus de précisions, demandez.
Merci
  ANT

 

[jfdsdjhfuetppo]--Message édité par antsite--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 09-04-2002 à 15:15:50   

Reply

Marsh Posté le 09-04-2002 à 17:16:49    

:bounce:  
Comment vous faites vous qui utilisez Direct Input pour demander par exemple au joueur son Nom / Pseudo ? C'est juste ça que je souhaite faire !
merci

Reply

Marsh Posté le 09-04-2002 à 18:13:59    

Plutot que de le faire avec un keydown essaie avec un keyup, tu devrais obtenir de meilleurs résultats

 

[jfdsdjhfuetppo]--Message édité par archangel--[/jfdsdjhfuetppo]


---------------
J'suis timide - Prêt à mourir, mais pas à vivre - Je suis vraiement très fatigué ... - more than meets the eye
Reply

Marsh Posté le 09-04-2002 à 18:15:32    

Je ne connais pas la Macro équivalente au keyup...

Reply

Marsh Posté le 09-04-2002 à 23:17:17    

Quand tu fais GetDeviceState tu as l'etat "immediat"
du clavier. donc tant que tu restes appuye sur la touche
KEYDOWN sera vrai.
 
Ce que tu veux avoir c'est l'etat du buffer clavier
qui accumule les evenements appuis/relachements
avec GetDeviceData..
 
Va lire en detail la doc DirectX qui explique
tout ca.. (buffered and immediate)
 
LEGREG

Reply

Marsh Posté le 09-04-2002 à 23:19:02    

Je t'invite egalement a aller voir
les exemples du SDK (qui sont plutot nombreux
et couvrent de nombreux aspects).
 
LEGREG

Reply

Marsh Posté le 10-04-2002 à 10:03:30    

J'ai en effet vu un exmple du SDK pour GetDeviceData met ça revient quasiment au même, donc j'en ai conclu (dite le moi si je me trompe) que pour du texte à saisir il est plus simple et mieux d'utiliser non pas DInput mais le traditionel WM_KEYDOWN et que Direct Input et plus fait pour les jeux et la gestion des touches non pas de texte mais du genre flèce du haut, bas,... qui dans ce cas sont mieux adaptées pour ces problèmes de répétition (dans tous les exemples DInput que j'ai vu, a chaque qu'ils parlaient du clavier c'était pour les flèches ou echap mais pas pour afficher du texte...)
enfin merci
   ANT

 

[jfdsdjhfuetppo]--Message édité par antsite--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 10-04-2002 à 10:35:40    

antsite a écrit a écrit :

J'ai en effet vu un exmple du SDK pour GetDeviceData met ça revient quasiment au même, donc j'en ai conclu (dite le moi si je me trompe) que pour du texte à saisir il est plus simple et mieux d'utiliser non pas DInput mais le traditionel WM_KEYDOWN et que Direct Input et plus fait pour les jeux et la gestion des touches non pas de texte mais du genre flèce du haut, bas,... qui dans ce cas sont mieux adaptées pour ces problèmes de répétition (dans tous les exemples DInput que j'ai vu, a chaque qu'ils parlaient du clavier c'était pour les flèches ou echap mais pas pour afficher du texte...)
enfin merci




 
Le comportement de GetDeviceData
est quasiment equivalent a celui des evenements Windows:
 
Tu lui demandes: remplis mon tableau d'evenement
avec ce qui est arrive depuis la derniere fois
Ainsi si tu tapes "salut"
tu auras dans ton tableau d'evenements:
s down, s up, a down, a up, l down, l up, u down, u up, t down, t up.
En plusieurs passes evidemment puisqu'il est probable
que en tapant a vitesse normale tu couvres plusieurs
frames :D.
 
D'autre part, l'etat "immediat" par getdevicestate contrairement aux evenements bufferises est vraiment un etat immediat.
C'est a dire si tu sondes ton clavier a intervalles trop eloignes, tu risques de passer a cote d'un evenement clavier
(up + down tres rapides).
 
LEGREG

Reply

Sujets relatifs:

Leave a Replay

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