Pour rendre le jeu plus attractif je vais ajouter quelques animations.

Une flamme à l’utilisation du jetpack

Le code est brut et un peu naïf, mais je n’ai pas besoin de plus.

  def render_jetpack_flame
    return if state.hero.impulse < 0.2

    flame = {
      x: state.hero.facing == :left ? state.hero.x + 14 : state.hero.x - 1,
      y: state.hero.y - 15,
      w: 16, h: 40
    }

    if state.hero.impulse > 3
      flame.merge!({ path: 'sprites/flame-0.png'})
    elsif state.hero.impulse > 2
      flame.merge!({ path: 'sprites/flame-1.png'})
    elsif state.hero.impulse > 1
      flame.merge!({ path: 'sprites/flame-2.png'})
    elsif state.hero.impulse > 0.6
      flame.merge!({ path: 'sprites/flame-3.png'})
    elsif state.hero.impulse > 0.2
      flame.merge!({ path: 'sprites/flame-4.png'})
    end

    outputs.sprites << flame
  end

J’aurais peut-être pu m’éviter de calculer l’emplacement de la flamme par rapport au personnage (suivant que celui-ci est tourné vers la gauche ou la droite) en ancrant le sprite en son milieu et non pas par sa coordonnée bas/gauche comme c’est le cas par défaut.

Mort d’un alien

Lorsqu’un alien est touché par notre laser, on joue une animation pour sa dispartion, comme on avait fait pour son apparition dans cet article.

J’ajoute un hash pour contenir les sprites :

    state.aliens_disparition ||= []

    outputs.sprites << state.aliens_disparition

    state.aliens.each do |alien|
      if alien.dead
        state.aliens_disparition << alien.dup.merge({
          start_looping_at: Kernel.tick_count,
          finished: false,
        })
        audio[:explosion] = { input: "sounds/explosion.wav" }
        next
      end

      # ...
    end

Et j’utilise la méthode frame_index pour l’animation proprement dite :

    state.aliens_disparition.each do |alien|
      sprite_index = alien.start_looping_at.frame_index(7, 8, false)
      if sprite_index
        alien.path = "sprites/disparition-#{sprite_index}.png"
      else
        alien.finished = true
        state.aliens_pool[alien.id].alive = false
      end
    end
    state.aliens_disparition.reject!(&:finished)

Et d’autres encore

Sur le même principe (utilisation de frame_index) j’ajoute une animation pour :

  • le rotor du jetpack
  • le personnage en marche
  • l’explosion d’un baril de fuel

Références

  1. Vous trouverez le code de Jetpack Hero sur github
  2. Documentation de DragonRuby


/ / / / / / / / / /


Cet article fait partie d’une série :

  1. Jetpack Hero
  2. Partie II
  3. Une platforme, des collisions
  4. Première animation du personnage
  5. Ajouter des platformes
  6. Du carburant pour le jetpack
  7. Collecte de minerai
  8. Effets sonores
  9. Du rangement avec la classe Game
  10. Apparition des aliens
  11. Tir du personnage
  12. On dégomme de l’alien
  13. GAME OVER
  14. Les aliens bougent enfin
  15. Plusieurs petites animations
  16. Un score et des vies