Espace d'Asher256

La gestion du clavier en QBasic





Tutoriel écrit par Asher256
URL: http://qbworld.asher256.com

La plupart des développeurs QuickBasic utilisent la fonction INKEY$, mais son implémentation directe dans plusieurs structures conditionnelles successives pose souvent problème. Pourquoi ?

Voici un exemple d’implémentation déconseillée avec INKEY$ :

DO
        IF INKEY$="a" THEN PRINT "AAAAAAAAAAAA"
        IF INKEY$="b" THEN PRINT "BBBBBBBBBBBB"
        IF INKEY$="c" THEN PRINT "CCCCCCCCCCCC"
        IF INKEY$="d" THEN PRINT "DDDDDDDDDDDD"
LOOP UNTIL INKEY$ = CHR$(27)    ' Quitte si la touche Échap est pressée

Ce code ne fonctionne pas correctement. À chaque appel, la fonction INKEY$ extrait un caractère du tampon clavier (keyboard buffer). Si vous l’invoquez plusieurs fois au cours d’un même cycle de boucle, chaque condition ‘IF’ évalue une valeur différente. Pour résoudre ce problème, il faut affecter le retour de la fonction à une variable unique (par exemple C$) au début de la boucle, puis évaluer cette variable :

DO
        C$ = INKEY$     ' Affectation du caractère à la variable C$

        IF C$="a" THEN PRINT "AAAAAAAAAAAA"
        IF C$="b" THEN PRINT "BBBBBBBBBBBB"
        IF C$="c" THEN PRINT "CCCCCCCCCCCC"
        IF C$="d" THEN PRINT "DDDDDDDDDDDD"
LOOP UNTIL C$ = CHR$(27)    ' Quitte si la touche Échap est pressée

Désormais, le traitement s’exécute de manière cohérente.

Si vous souhaitez prendre en compte les caractères en majuscules et en minuscules sans dupliquer vos structures conditionnelles (par exemple éviter d’écrire systématiquement ‘IF C$ = « a » OR C$ = « A »‘), vous pouvez utiliser la fonction LCASE$. Celle-ci convertit une chaîne de caractères en minuscules. Il suffit alors de l’appliquer à votre variable lors du test :

IF LCASE$(c$) = "a" THEN (...)

Les touches directionnelles

Dans le cadre du développement d’un jeu vidéo, la gestion des déplacements se fait généralement via les touches directionnelles du clavier plutôt que par des touches alphabétiques.

La détection d’une touche directionnelle via INKEY$ renvoie une chaîne de deux caractères. Le premier est un caractère nul, CHR$(0), indiquant une touche étendue, et le second correspond au code de balayage (scan code) de la touche.

La syntaxe s’établit comme suit :

CHR$(0) + CHR$(code_de_balayage)

Voici un exemple d’implémentation :

DO
        C$ = INKEY$
        IF c$ = CHR$(0) + CHR$(72) THEN PRINT "Flèche haut..."
        IF c$ = CHR$(0) + CHR$(80) THEN PRINT "Flèche bas..."
        IF c$ = CHR$(0) + CHR$(75) THEN PRINT "Flèche gauche..."
        IF c$ = CHR$(0) + CHR$(77) THEN PRINT "Flèche droite..."
LOOP UNTIL C$ = CHR$(27)
END

Note : Le préfixe CHR$(0) est indispensable pour identifier les codes étendus.