Étape 5: Déplacement des personnages à travers la page
Pour déplacer le réservoir, j’ai défini une position un x pour le dessin. Puisque je traitais avec des personnages qui étaient cinq pixels de large, je pourrais faire une division entière de la citerne x position de figurer dehors l’où j’attire chaque caractère personnalisé.Aussi, je voudrais prendre juste un modulo du x position (tankx % 5) pour comprendre comment passer les morceaux autour du réservoir. Si le modulo était nulle, je voudrais dessiner les personnages et définir les bits des caractères. Mais si le modulo est non nul, cela signifie que les caractères étaient déjà sur l’écran, et je pouvais juste redéfinir les bits. Aussi, je voudrais porter un espace à gauche à vide sur n’importe quel dessin préalable du caractère personnalisé 0 (celui le plus à gauche) chaque fois que j’étais « déplacer » les personnages.
Donc, pour commencer, j’ai initialiserait la position tankx à une valeur qui diviserait proprement par cinq.
int tankx = -15 ;
int tankcharx ;
int tankchary = 1 ;
Puis, au sein de la fonction loop(), je ferais la division et le modulo pour comprendre ce que dessiner, et apprendre à dessiner. (Se méfier de la façon dont le modulo d’un nombre négatif fonctionne.)
Une autre façon de procéder, avec le recul, consisterait à faire tankx toujours non négatif et déplacer la position de caractère de x par -3 avant le rendu.
C’est la partie du code loop() qui obtient les personnages sur l’écran. Dans un meilleur rendu de ce code, j’ai pris en compte les fonctions de dessin dans une fonction safeDrawCharAt qui effectue la vérification de la position. Mais ici, vous voyez le rendu plus âgé où je faisais la position de vérification en ligne. À tout moment, les caractères pouvant être hors de l’écran, j’ai dû faire une vérification de la position avant tout appel setCursor() ou write().
tankcharx = tankx / BITS_PER_CHAR ;
Interprétation initiale, aucune rotation de marches
Si ((tankx % BITS_PER_CHAR) == 0) {}
Passage intégral est en marche, besoin de dessiner un espace vide où la citerne a été modifié
Si (tankcharx > = 1) {}
lcd.setCursor (tankcharx-1, tankchary) ;
LCD.Write(' ') ;
}
Si (tankcharx > = 0 & & tankcharx < = 7) {}
lcd.setCursor (tankcharx, tankchary) ;
LCD.Write((Byte)0) ;
}
Si (tankcharx + 1 > = 0 & & tankcharx + 1 < = 7) {}
lcd.setCursor (tankcharx + 1, tankchary) ;
LCD.Write((Byte)1) ;
}
Si (tankcharx + 2 > = 0 & & tankcharx + 2 < = 7) {}
lcd.setCursor (tankcharx + 2, tankchary) ;
LCD.Write((Byte)2) ;
}
Si (tankcharx + 3 > = 0 & & tankcharx + 3 < = 7) {}
lcd.setCursor (tankcharx + 3, tankchary) ;
LCD.Write((Byte)3) ;
}
}