Utiliser D.Input pour la saisie de texte [Code Inside] [DirectX] - C++ - Programmation
Marsh Posté le 09-04-2002 à 17:16:49
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
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]
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
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
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]
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'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
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]