Page 1 sur 1

Problème bizarre avec le clavier

Publié : jeu. 26/juil./2007 13:47
par Octavius
Salut! J'ai un problème bizarre avec la gestion du clavier, en fait je me demande si ce n'est pas un bug de PB... (Je travaille avec PB 4.02) Voici mon code :

Code : Tout sélectionner

;initialisation
InitKeyboard()
InitSprite()
OpenScreen(800,600,32,"Hello")

;variables
down.b=0
right.b=0
one.b=0

;boucle principale
Repeat

;examen du clavier
ExamineKeyboard()

;attribution de différentes valeurs aux variables en fonction de la touche pressée
If KeyboardPushed(#PB_Key_Down)<>0
down=1
Else
down=0
EndIf
If KeyboardPushed(#PB_Key_Right)<>0
right=1
Else
right=0
EndIf
If KeyboardPushed(#PB_Key_1)<>0
one=1
Else
one=0
EndIf

;dessiner du texte
StartDrawing(ScreenOutput())
DrawText(4,4,"down : "+Str(down)+" ; right : "+Str(right)+" ; one : "+Str(one))
StopDrawing()

;commandes d'affichage du résultat, puis réinitialisation
FlipBuffers()
ClearScreen(RGB(255,255,255))

Until KeyboardPushed(#PB_Key_Escape)
J'ai simplifié mon code, il provient d'une tentative de création d'un jeu de plate-forme en 2D (ce qui est très dur en fait!).

Bref, ici le principe c'est que quand on appuie sur une touche, on change une variable correspondant à la touche et qu'ensuite on dessine cette valeur sur un écran.

Donc lorsque je presse deux touches simultanément, par exemple EnBas et ADroite, ça fonctionne bien. Mais lorsque je presse les trois en même temps EnBas, ADroite et Touche1, ça ne marche pas et Touche1 est ignorée. Or Touche1 fonctione bien toute seule ou avec une seule autre touche.

Je croyais au début que c'était peut-être parce que PB ne prennait pas à en compte lorsque 3 touches ou plus étaient activées... Mais non! Ca fonctionne bien les 3 en même temps si je remplace EnBas et ADroite par ToucheS et ToucheD par exemple!

J'ai essayé de déplacer ExamineKeyboard() ou d'en mettre plusieurs dans la boucle, mais ça ne marche pas mieux... Je n'y comprends rien.

Alors comment puis-je résoudre ce problème ? S'il n'est pas résolvable, comment puis-je le contourner ?

Publié : jeu. 26/juil./2007 13:54
par Crystal Noir
ben moi avec ton code si j'appuie sur bas droite et 1 en même temps ca marche j'ai bien mes trois variables à 1....j'utilise le pb 4.02 aussi.

Par contre c'est le 1 (ou &) pas le pavé numérique, on est bien d'accord.

Publié : jeu. 26/juil./2007 13:57
par Octavius
Oui on est bien d'accord sur la touche 1/&

Je suis perplexe, ça fonctionne chez toi et pas chez moi....... :?

Est-ce que ça peut venir de mon PC ? D'une configuration de mon clavier ?

Publié : jeu. 26/juil./2007 13:59
par Crystal Noir
je dois dire que je n'en ai aucune idée :(

Publié : jeu. 26/juil./2007 14:07
par Octavius
C'est bien triste...

Je travaille en PB sur mon ordinateur portable, étant donné que tu as dis que ça marchait chez toi j'ai fait un exécutable et je l'ai mis sur mon ordinateur fixe... Et là ça marche! Mais toujours impossible de le faire fonctionner sur mon portable... :? C'est plutôt gênant quand je dois débugger mon programme...

Publié : jeu. 26/juil./2007 14:38
par Octavius
J'ai fait des recherches, apparemment ça viendrait d'un truc appellé ghosting ou buffer, qui serait interne au clavier et qui empêche qu'il y ait trop de touches simultanément pressées prises en compte.

J'ai un ordinateur portable, donc il est impensable de remplacer le clavier ou de m'encombrer d'un clavier externe, avez-vous des infos pour modifier ces configurations ?

Ca serait utile à savoir à l'avenir pour les futurs programmeurs débutants qui se retrouverait devant ce genre d'erreur con sans comprendre d'où ça vient...

L'idéal serait d'avoir une procédure interne au programme du jeu qui puisse modifier ce ghosting du clavier. J'en appelle solennellement aux programmeurs les plus avancés. :?

Publié : jeu. 26/juil./2007 14:51
par ATHOW
J'ai un problème similaire sur un jeu de ski auquel je jouais : certaines figures m'étaient interdites car il fallait presser simultanément deux touches fléchées + deux touches genre "X" et "C".

Je m'étais bien renseigné, apparement on peut rien y faire : ce type de propriétés du clavier n'est pas paramètrable, mille fois hélas...

Par contre, pour ton appli, tu peux prévoir le coup et permettre à l'utilisateur de configurer les touches, c'est pas super sorcier.

Genre pour le jeu auquel je jouais, j'avais remplacé les touches fléchées par "I,J,K,L", et tout roulait sans problème !

Publié : jeu. 26/juil./2007 16:33
par Octavius
Ce n'est pas paramétrable ?! Mais que c'est con... Si tu t'es renseigné, tu dois avoir des infos supplémentaires ou des liens ? Ca m'intéresserait d'en savoir plus sur le sujet même si on ne peut rien y faire (par exemple éviter de se faire avoir si on achète un clavier...)

IJKL c'est une bonne idée :)

Publié : jeu. 26/juil./2007 16:43
par ATHOW
Mes recherches remontent à loin... mais j'ai trouvé ça vite fait qui explique le phénomène : http://forum.hardware.fr/hfr/HardwarePe ... 7975_1.htm

Un des gars donne un exemple de clavier à acheter pour ne pas avoir ce problème (faut-il le croire ?).

Publié : jeu. 26/juil./2007 16:55
par Octavius
Merci!

Il y a qqun qui dit qqch de très intéressant, en fait il s'agit de l'explication fondamentale du problème. Je la mets ici au cas où qqun fasse des recherches sur ce forum PB :
Il faut savoir que, du point de vue cablage, les touches sont arrangées comme dans un tableau (correspondent vaguement à l'ordre sur le clavier), et qu'appuyer une touche fait simplement contact entre le fil de la colonne et celui de la ligne.

Tant que des touches de la même ligne ou même colonne sont enfoncées, c'est simple.
Mais si des touches couvrant plusieurs lignes ET colonnes sont enfoncées, eh ben... une autre combinaison d'appuis pourrait faire les même contacts, donc le clavier il sait pas (et il le fait savoir).

Les seules touches cablées individuellement sont les touches dites modificatrice car elles sont faites pour être appuyées en même temps: Shift, Control, Alt, Windows, et peut-être Caps Lock et Num Lock.
(gauche et droite sont distinctes)

C'est pour ça qu'il faut les utiliser de préférence (enfin pas Windows hein :D ).
Par conséquent, plus le clavier est gros et cher et plus il y a de chances que les touches soient mieux individualisées, ce qui explique pourquoi ça marchait sur mon ordi fixe (clavier externe) et pas sur mon ordi portable où il y a relativement peu de place pour le câblage du clavier.

Publié : jeu. 26/juil./2007 17:14
par Mytic
Merci >ATHOW< et >Octavius< pour cette info, au moins comme ça je vais considéré se détaille dans mes programmes :D

Publié : jeu. 26/juil./2007 18:16
par ATHOW
Le mieux reste de toujours donner le choix des touches à l'utilisateur !

Ca permet de contenter tout le monde, les gauchers, les manchots, et ceux qui ont un petit... clavier. :D

Publié : jeu. 26/juil./2007 20:10
par Ollivier
Ouais sans trop avoir lu les liens, j'ai voulu dans le passé faire de mon clavier (portable ou pas, ça ne change pas trop, c'est le constructeur clavier qui change) un clavier de synthé.

Et j'ai eu à peu près le même problème, 4 touches maxi simultanément. L'histoire du câblage comme un tableau, concorde bien avec l'analyse que j'avais faite. (J'avais fait une boucle For Next dans un autre Basic pour tester tous les codes touche de balayage simultanément) J'avais plein de combinaison possibles. Par contre, je ne savais pas encore vraiment si ça pouvait être différent d'un clavier à l'autre. A la limite, il y a du code source sur le forum pour recevoir les infos d'une joystick analogique. 15€ en grande surface et zoup le problème est réglé!

Pour le synthé, c'est une autre histoire :(