Missions liées au déplacement

Vous avez comme mission de

  • faire se déplacer notre personnage avec une animation ?
  • faire se déplacer l’autre perso « ordi » automatiquement ?

Vous êtes à la bonne place !

cm 2020-02-12 NSI missions laby_3

On va en effet changer de manière de tester si on peut se déplacer, ou pas, sans regarder dans la grille, mais en se déplaçant d’un quart de case à chaque fois ! Comment ?

Il nous faut des rectangles pour gérer des collisions :

  • Créer une fonction creer_rectangles() qui renvoie liste de rectangles « virtuels » que notre personnage ne pourra pas franchir :
    • créer une liste d’abord vide,
    • parcourir la grille comme dans la fonction d’affichage :
      • si à une certaine ligne et à une certaine colonne, il y a un mur (un 1 dans la grille à cet endroit), rajouter à la liste un rectangle
        pygame.Rect(x_coin, y_coin, taille, taille)
  • Appeler cette fonction avec murs = creer_rectangles() et :
    • rajouter un rectangle à cette liste pour qu’on ne puisse pas aller au dessus du depart
    • rajouter un rectangle à cette liste pour qu’on ne puisse pas aller au dessous de l’arrivee
  • créer un rectangle perso_rect, sorte de « hitbox » qui contient le personnage,
  • à chaque passage dans la boucle, on va :
    • tester si en bougeant notre rectangle perso_rect dans la direction choisie, on a une collision ou pas avec la liste de rectangles murs avec
      if perso_rect.move(vect[direc]).collideliste(murs) > -1:
    • Si ce test est ok, c’est qu’on peut avancer et bouger notre perso_rect dans la direction choisie avec
      perso_rect.move_ip(vect[direc])
    • Sinon on ne bouge pas !

Une direction choisie ? Un quart de case ?

Je vous propose une version avec un peu de maths (un vecteur pour le déplacement).

Vous avez vu ci-dessus un vect[direc].

On va, par exemple, utiliser une variable direc et suivant ses valeurs, on a la direction :

  • Si direc == 0 on va à droite,
  • si direc == 1 on va vers le haut,
  • si direc == 2 à gauche,
  • si enfin direc == 3, en bas.

On va fixer notre vitesse à un quart de case et utiliser une liste vect :

v = taille // 4 # vitesse
# pour la nouvelle gestion des déplacements
vect = [(v, 0), (0, -v), (- v, 0), (0, v)] # D, H, G, B

Ainsi les tests ci-dessus fonctionnent ! Et on bouge bien d’un quart de case dans la direction voulue.

Comment gérer alors les déplacements ?

Il suffit de changer la valeur de direc avec les touches du clavier !

Le personnage bougera alors à chaque fois dans la direction voulue si c’est possible.

Mais ça va trop vite !

Oui, on va freiner ça en glissant dans notre code :

clock = pygame.time.Clock()

puis en rajoutant dans la boucle perpétuelle :

clock.tick(10)

pour avoir 10 images par seconde.

Je ne vois pas le rapport avec les missions !

Alors pour le déplacement automatique, il suffit de poser à chaque fois la direction un cran plus à gauche, et sinon, de tester une direction de plus en plus à droite tant qu’il y a collision…

Et mon animation ?

Il suffit d’avoir une liste de sprites pour chaque direction, qui contient des surfaces découpées dans la spritesheet avec des :

feuille.subsurface(rectangle_choisi)

feuille est la spritesheet déjà chargée en mémoire sous forme de surface,
rectangle_choisi un quadruplet (x_coin, y_coin, largeur_du_rect, hauteur_du_rect)
On a ainsi une liste de surfaces et on gère un curseur d’animation : on l’incrémente à chaque déplacement, ainsi on change d’image !
On « blite » un élément de la liste dans le rectangle perso_rect du personnage.

tp_spriteSheet_64

N'hésitez-pas à poser une question, ou faire avancer le schmilblick

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.