10-14 Gestion des déplacements de la voiture

 

Qu’une touche ait été activée ou non, la voiture continue son déplacement (sauf si elle est arrêtée). Evidemment, si un changement de direction ou de vitesse a été demandé, il est pris en compte.

 

On commence par analyser la vitesse de la voiture. On se rappelle qu’il y a 6 niveaux :

 

Vitesse

Pixels / 50èmes

Pixels / sec

0

0

0

1

0.25

12.5

2

0.5

25

3

1

50

4

2

100

5

3

150

 

La vitesse 0 est bien sure la position arrêtée. Les vitesses 1 et 2 sont un peu plus délicates à gérer. En effet, le programme boucle tous les 50èmes de seconde, les déplacements sont donc analysés tous ces lapses de temps. Les vitesses 1 et 2 font moins de 1 pixel de déplacement par 50èmes de seconde, il faut donc les temporiser. Donc on prévoit un compteur qu’on décrémente à chaque boucle et quand le compteur atteint 0 on déplace la voiture de 1 pixel en X et/ou Y. Pour la vitesse 1 il faut 4 boucles et pour la vitesse 2 seulement 2. Ces paramètres ont été placés dans les constantes :

 

VITEDEL1 EQU 4                  ; Délai pour la vitesse 1

VITEDEL2 EQU 2                  ; Délai pour la vitesse 2

 

Les compteurs sont ensuite réinitialisés avec ces valeurs pour assurer une continuité dans le déplacement. Une fois le délai passé, la vitesse est considérée comme la vitesse 3 pour un déplacement d’un pixel en X et/ou Y. 

 

DEPL     LD A,(VITESSE)         ; A = vitesse de la voiture

         LD C,A

         OR A                   ; Vitesse nulle?

         JP Z,COURSE2           ; oui => on reboucle la course

 

         CP 2                   ; Analyse par rapport à vitesse 2

         JR C,DEPL1             ; Vitesse = 1 => DEPL1

         JR Z,DEPL2             ; Vitesse = 2 => DEPL2

         JP DEPL3               ; Vitesse = 3 => DEPL3

 

DEPL1    LD HL,DELAIV1          ; HL pointe le délai pour la vitesse 1

         LD A,(HL)              ; A = délai

         DEC A                  ; délai - 1

         LD (HL),A

         JP NZ,COURSE2          ; Si délai pas passé, on reboucle

         LD A,VITEDEL1

         LD (HL),A              ; Réinitialisation du délai

         LD C,3                 ; Même traitement que pour vitesse 3

         JP DEPL3

 

DEPL2    LD HL,DELAIV2          ; HL pointe le délai pour la vitesse 2

         LD A,(HL)              ; A = délai

         DEC A                  ; délai - 1

         LD (HL),A

         JP NZ,COURSE2          ; Si délai pas passé, on reboucle

         LD A,VITEDEL2

         LD (HL),A              ; Réinitialisation du délai

         LD C,3                 ; Même traitement que pour vitesse 3

         JP DEPL3

 

La vitesse est décrémentée de 2 avant d’être placée dans BC pour le nombre de pixels de déplacement. Ensuite tout dépend de l’angle :

 

 

Angle

Coord. X

Coord. Y

0

X + BC

Inchangée

1

X + BC

Y + BC

2

Inchangée

Y + BC

3

X – BC

Y + BC

4

X – BC

Inchangée

5

X – BC

Y – BC

6

Inchangée

Y – BC

7

X + BC

Y – BC

 

Les X sont incrémentés vers la droite et les Y vers de bas (car ils suivent les n° de segments et de ligne). L’analyse de l’angle se fait par dichotomie. On analyse l’angle par rapport à 3, s’il est inférieur on l’analyse par rapport à 1, sinon par rapport à 5, …

 

DEPL3    DEC C                  ; Vitesse - 2 pour déplacements en pixels

         DEC C                 

         LD B,0                 ; BC = nombre de pixels de déplacement

         LD A,(ANGLE)           ; A = angle de la voiture

 

         CP 3                   ; Analyse par rapport à angle 3

         JR Z,DEPLANG3          ; Angle = 3 => DEPLANG3

         JR C,DEPLANG2          ; < 3 => DEPLANG2

 

         CP 5                   ; Analyse par rapport à angle 5

         JR Z,DEPLANG5          ; Angle = 5 => DEPLANG5

         JR C,DEPLANG4          ; Angle < 5 => = 4 => DEPLANG4

 

         CP 6                   ; Analyse par rapport à angle 6

         JR Z,DEPLANG6          ; Angle = 6 => DEPLANG6, sinon angle = 7

 

         LD HL,(XVOITURE)       ; HL = coordonnée X de la voiture

         ADD HL,BC              ; HL <= HL + nombre de pixels de déplacement

         LD (XVOITURE),HL       ; mémorisation de la coordonnée X

         LD HL,YVOITURE

         LD A,(HL)              ; A = coordonnée Y de la voiture

         SUB C                  ; A <= A - nombre de lignes de déplacement

         LD (HL),A              ; mémorisation de la coordonnée Y

         JP COURSE2             ; Rebouclage

 

DEPLANG0 LD HL,(XVOITURE)       ; HL = coordonnée X de la voiture

         ADD HL,BC              ; HL <= HL + nombre de pixels de déplacement

         LD (XVOITURE),HL       ; mémorisation de la coordonnée X

         JP COURSE2             ; Rebouclage

 

DEPLANG1 LD HL,(XVOITURE)       ; HL = coordonnée X de la voiture

         ADD HL,BC              ; HL <= HL + nombre de pixels de déplacement

         LD (XVOITURE),HL       ; mémorisation de la coordonnée X

         LD HL,YVOITURE

         LD A,(HL)              ; A = coordonnée Y de la voiture

         ADD C                  ; A <= A + nombre de lignes de déplacement

         LD (HL),A              ; mémorisation de la coordonnée Y

         JP COURSE2             ; Rebouclage

 

DEPLANG2 CP 1                   ; Analyse par rapport à angle 1

         JR C,DEPLANG0          ; Angle < 1 => DEPLANG0

         JR Z,DEPLANG1          ; Angle = 1 => DEPLANG1, sinon angle = 2

 

         LD HL,YVOITURE

         LD A,(HL)              ; A = coordonnée Y de la voiture

         ADD C                  ; A <= A + nombre de lignes de déplacement

         LD (YVOITURE),A        ; mémorisation de la coordonnée Y

         JP COURSE2             ; Rebouclage

 

DEPLANG3 LD HL,YVOITURE

         LD A,(HL)              ; A = coordonnée Y de la voiture

         ADD C                  ; A <= A + nombre de lignes de déplacement

         LD (HL),A              ; mémorisation de la coordonnée Y

         LD HL,(XVOITURE)       ; HL = coordonnée X de la voiture

         SBC HL,BC              ; HL <= HL - nombre de pixels de déplacement

         LD (XVOITURE),HL       ; mémorisation de la coordonnée X

         JP COURSE2             ; Rebouclage

 

DEPLANG4 LD HL,(XVOITURE)       ; HL = coordonnée X de la voiture

         XOR A                  ; Carry = 0

         SBC HL,BC              ; HL <= HL - nombre de pixels de déplacement

         LD (XVOITURE),HL       ; mémorisation de la coordonnée X       

         JP COURSE2             ; Rebouclage

 

DEPLANG5 LD HL,(XVOITURE)       ; HL = coordonnée X de la voiture

         SBC HL,BC              ; HL <= HL - nombre de pixels de déplacement

         LD (XVOITURE),HL       ; mémorisation de la coordonnée X

         LD HL,YVOITURE

         LD A,(HL)              ; A = coordonnée Y de la voiture

         SUB C                  ; A <= A - nombre de lignes de déplacement

         LD (HL),A              ; mémorisation de la coordonnée Y

         JP COURSE2             ; Rebouclage

 

DEPLANG6 LD HL,YVOITURE

         LD A,(HL)              ; A = coordonnée Y de la voiture

         SUB C                  ; A <= A - nombre de lignes de déplacement

         LD (HL),A              ; mémorisation de la coordonnée Y

         JP COURSE2             ; Rebouclage

 

 

<< RETOUR  ---  SUITE : Les sous-programmes >>