10-13 Gestion du clavier et du joystick

 

C’est seulement maintenant que l’on analyse si une touche a été appuyée ou si le joystick a été activé. L’ordre de priorité est le suivant :

 

  1. Clavier
  2. Joystick 1
  3. Joystick 2

 

Pour le clavier, on analyse les touches k,l, d et c + majuscules. Pour les joysticks, on analyse les directions gauche, droite, haut et bas. Mais au final, le programme fera appel au même code de gestion des déplacements. L’analyse des touches se fait par le vecteur &BB1B qui ne fait que récupérer les valeurs sans attendre, car si aucune touche n’est appuyée, il faut quand même que la voiture continue de se déplacer.

 

TOUCHES  CALL &BB1B             ; Regarde si une touche est appuyée

         JR NC,JOYSTICK         ; Si pas de touches => JOYSTICK

 

         CP 'd'                 ; d = D = Plus vite

         JR Z,TOUCHEP           ; dans ce cas => TOUCHEP

         CP 'D'                

         JR Z,TOUCHEP          

         CP 'c'                 ; c = C = Moins vite

         JR Z,TOUCHEM           ; dans ce cas => TOUCHEM

         CP 'C'

         JR Z,TOUCHEM

         CP 'k'                 ; k = K = Gauche

         JR Z,TOUCHEG           ; dans ce cas => TOUCHEG

         CP 'K'

         JR Z,TOUCHEG

         CP 'l'                 ; l = L = Droite

         JR Z,TOUCHED           ; dans ce cas => TOUCHED

         CP 'L'

         JR Z,TOUCHED

         CP 'q'                 ; q = Q = termine la course

         JP Z,INITVAR           ; dans ce cas => INITVAR

         CP 'Q'

         JP Z,INITVAR

         JP DEPL                ; Sinon touche ignorée => DEPL

 

L’analyse du joystick se fait par le vecteur &BB24 qui là aussi se contente de récupérer les valeurs des 2 joysticks. Le premier est placé dans les registres A et H, et le deuxième dans L. On se contente ici de récupérer les valeurs de directions contenues dans les bits 0 à 3 :

 

JOYSTICK CALL &BB24             ; Lecture de l'état du joystick

         OR A                   ; A = H = état du joystick 1

         JR NZ,JOYSTIC2         ; joystick actif => JOYSTIC2

         LD A,L                 ; A <= L = état du joystick 2         

         OR A                   ; joystick 2 actif?

         JR Z,DEPL              ; non => joystick ignoré => DEPL

 

JOYSTIC2 RRA                    ; Bit 0 = HAUT

         JR C,TOUCHEP           ; dans ce cas => TOUCHEP

         RRA                    ; Bit 1 = BAS

         JR C,TOUCHEM           ; dans ce cas => TOUCHEM

         RRA                    ; Bit 2 = GAUCHE

         JR C,TOUCHEG           ; dans ce cas => TOUCHEG

         RRA                    ; Bit 3 = DROITE

         JR C,TOUCHED           ; dans ce cas => TOUCHED

         JP DEPL                ; autres = ignorés => DEPL

 

TOUCHEP augmente la vitesse de la voiture, dont la variable est VITESSE. Toutefois celle-ci ne peut dépasser la vitesse maximum paramétrée dans les constantes : VITESMAX. On voit ici l’intérêt des constantes, car on n’a pas à se soucier de leur valeur.

 

TOUCHEP  LD HL,VITESSE          ; HL pointe la vitesse de la voiture

         LD A,(HL)              ; A = vitesse

         CP VITESMAX            ; Vitesse maximum atteinte?

         JR Z,TOUCHFIN          ; oui => TOUCHFIN

         INC A                  ; non => vitesse + 1

         LD (HL),A              ; vitesse mémorisée

         JP TOUCHFIN            ; => TOUCHFIN

 

A contrario, TOUCHEM diminue la vitesse de la voiture. Et là, la limite basse est 0.

 

TOUCHEM  LD HL,VITESSE          ; HL pointe la vitesse de la voiture

         LD A,(HL)              ; A = vitesse

         OR A                   ; vitesse minimum 0 atteinte?

         JR Z,TOUCHFIN          ; oui => TOUCHFIN

         DEC A                  ; non => vitesse - 1

         LD (HL),A              ; vitesse mémorisée

         JP TOUCHFIN            ; => TOUCHFIN

 

TOUCHEG fait tourner la voiture à gauche, ce qui revient à diminuer l’angle de 1. Toutefois, si l’angle est de –1, on le remet à 7 (%0000 0111).

 

TOUCHEG  LD HL,ANGLE            ; HL pointe l'angle de la voiture

         LD A,(HL)              ; A = angle

         DEC A                  ; Angle - 1 = tourne à gauche

         AND %00000111          ; 8 angles => 0 - 1 = 7

         LD (HL),A              ; Nouvel angle mémorisé

         JP TOUCHFIN            ; => TOUCHFIN

 

Et TOUCHED tourne à droite (ANGLE + 1). Si l’angle dépasse 7 il est remis à 0 par le AND ( 8 = %0000 1000 AND %0000 0111 = 0).

 

TOUCHED  LD HL,ANGLE            ; HL pointe l'angle de la voiture

         LD A,(HL)              ; A = angle

         INC A                  ; Angle + 1 = tourne à droite

         AND %00000111          ; 8 angles => 7 + 1 = 0

         LD (HL),A              ; Nouvel angle mémorisé

 

Si une de ces touches a été reconnue, la variable CHRONO est mise à 1 pour indiquer que le chronomètre est actif. Si cette variable était déjà à 1, cela ne change rien.

 

TOUCHFIN LD A,1

         LD (CHRONO),A          ; Chronomètre actif

 

 

<< RETOUR  ---  SUITE : Gestion des déplacements de la voiture >>