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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°123642
antsite
Je me souviens
Posté le 09-04-2002 à 15:15:50  profilanswer
 

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]

mood
Publicité
Posté le 09-04-2002 à 15:15:50  profilanswer
 

n°123724
antsite
Je me souviens
Posté le 09-04-2002 à 17:16:49  profilanswer
 

: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

n°123751
archangel
Un homme Une vision
Posté le 09-04-2002 à 18:13:59  profilanswer
 

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
n°123753
antsite
Je me souviens
Posté le 09-04-2002 à 18:15:32  profilanswer
 

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

n°123923
LeGreg
Posté le 09-04-2002 à 23:17:17  profilanswer
 

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

n°123925
LeGreg
Posté le 09-04-2002 à 23:19:02  profilanswer
 

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

n°124048
antsite
Je me souviens
Posté le 10-04-2002 à 10:03:30  profilanswer
 

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]

n°124083
LeGreg
Posté le 10-04-2002 à 10:35:40  profilanswer
 

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


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

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

 

Sujets relatifs
[C++] Console + séquences d'échappement (+Telnet inside)[C++] Utiliser une police externe non système
Textarea, une ligne de code que je ne connais pas svpComment envoyer un message ICQ par Deplhi?(sans utiliser icq bien sur)
[PHP] formater le texte[PHP]Comment restreindre une page ? (sans utiliser .htaccess..)
[VC++] SDK directX?Centrer et clipper du texte avec DirectX
Un bon éditeur de code XML ? 
Plus de sujets relatifs à : [DirectX] Utiliser D.Input pour la saisie de texte [Code Inside]


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