wiki:InsiaProgPerlProjetBomberStep2

Projet Perl Bomberman

Projet Perl - Bomberman réseau

Réalisation (2) - Animation des personnages

Boucle d'événement et mouvement simple

Dans un premier temps, vous allez uniquement animer les déplacements d'un personnage "statique", nous étudierons ses mouvements par la suite.

Vous devez d'abord mettre en place une boucle d'événement: il s'agit d'une boucle infinie dans laquelle votre programme attend à chaque tour un "événement" puis le traite, et ainsi de suite. Les événements qui nous intéressent pour le moment sont ceux émis par le clavier, et issus de votre fenêtre quand celle-ci est active.

Pour cela:

  • créez un objet SDL::Event
  • utilisez sa méthode ->wait() comme condition d'une boucle while()
  • dans la boucle, comparez son attribut ->type avec la constante SDL_KEYDOWN
  • affichez le contenu de ->key_name

Note: SDL a la fâcheuse habitude de désactiver les interruptions standard comme le Control+C pour arrêter un programme. Vous pouvez rétablir cette possibilité en effectuant $SIG{'INT'} = 'DEFAULT'; après la création de votre fenêtre.

Enfi chargez l'image du joueur (player-static.png), et faites en sorte que les appuis sur les flèches changent effectivement la position du joueur. Positionnez le joueur initialement en haut à gauche.

Animation simple

Si on veut animer le personnage, il va nous falloir alterner plusieurs images pour donner l'illusion de l'animation (en plus du mouvement). Pour simplifier le chargement de nombreuses images correspondant aux différentes séquences d'animation, on les rassemble dans une matrice au sein d'une même image (cf. player1.png en bas de page).

Nous modulerons la vitesse du personnage en jouant sur deux facteurs:

  • la vitesse d'affichage des images (voir plus loin pour la temporisation entre deux images)
  • la longeur (nombre d'images) de la séquence d'animation pour passer d'une case à l'autre

Pour que l'animation soit cyclique et sans saut, il sera souhaitable que la longueur de l'animation soit un multiple du nombre d'images fournies pour un "pas élémentaire" (5 dans notre cas).

Vous constaterez que pour un personnage il va falloir maintenir les informations suivantes (utilisez un tableau associatif):

  • la position logique du joueur, c'est-à-dire la ligne et la colonne sur l'échiquier
  • la direction du joueur, permettant de déterminer la séquence d'animation qui convient
  • la position dans une séquence d'animation, que nous ferons évoluer au cours du temps pour animer le personnage
my $seq_len = 10;
my %player = (
  'row' => 0, 'col' => 0,  # Position logique
  'dir' => 'd',            # Direction (l/r/u/d)
  'seq' => 0               # Séquencement (0 .. $seq_len-1)
);

Nous allons décider la convention suivante: dès qu'un événement clavier est interprété, la position logique du joueur est immédiatement mise à jour (du point de vue arbitrage, le joueur saute immédiatement sur la case suivante), mais la position graphique va être progressivement mise à jour pour refléter la nouvelle position logique.

Modifiez votre programme pour:

  • mettre à jour correctement la structure %player lors d'un événément clavier
  • afficher la bonne image du personnage en fonction de sa direction

Animation complète

Ensuite, il va falloir effectuer des modifications à l'écran alors qu'aucun n'événement n'a lieu: nous allons donc devoir modifier notre boucle d'événement pour ne pas attendre un événement, mais simplement regarder si un événement et présent, et le cas échéant procéder à l'animation en cours du personnage. Pour cela on remplacera la méthode SDL::Event::wait par poll. Vous aurez besoin de temporiser votre animation afin de contrôler sa vitesse, utilisez SDL::App::delay.

Nous allons utiliser la convention suivante: quand un événement clavier est détecté, nous démarrons l'animation en effectuant $player{'seq'} = $seq_len - 1. Ainsi, à chaque tour de boucle, si $player{'seq'} != 0 nous savons qu'il y a une animation en cours.

Modifiez votre fonction d'affichage pour:

  • prendre en compte le numéro de séquence pour choisir la bonne image du personnage
  • prendre en compte le numéro de séquence pour positionner graphiquement le personnage
Last modified 13 years ago Last modified on Mar 26, 2007, 12:52:20 PM

Attachments (2)

Download all attachments as: .zip