Le carburant n’est pas infini. Chaque fois qu’on actionne le jetpack il consomme un peu de carburant.

Utilisation du carburant

Au début du jeu le jetpack est rempli à 100% :

def defaults(args)
  args.state.hero ||= {
    # ...
    jetpack_power: 100,
  }

On met en place une zone d’information en bas de l’écran qui est fermée par une plateforme qui fait la longueur de l’écran :

def defaults(args)
  args.state.platforms ||= [
    # ...
    { x: 0, y: 130, w: 1280, h: 12, path: 'sprites/tile.png' },
  ]

La zone d’info est d’une couleur différente de la zone de jeu, et on écrit le pourcentage en ajoutant un hash dans args.outputs.labels :

def render(args)
  args.outputs.solids << { x: 0, y: 130, w: 1280, h: 610, r: 0, g: 0, b: 0 }
  args.outputs.solids << { x: 0, y: 0, w: 1280, h: 130, r: 60, g: 60, b: 70 }
  # ...
  args.outputs.labels << {
    x: 200,
    y: 45,
    size_px: 40,
    alignment_enum: 0,
    vertical_alignment_enum: 0,
    text: "POWER #{args.state.hero.jetpack_power.to_i}%",
    r: 255,
    g: 255,
    b: 255,
  }
end

On retire un peu de carburant à chaque usage du jetpack. Et quand on arrive à zéro, c’est la panne sèche :

def input(args)
  # ...
  if args.inputs.keyboard.control || args.inputs.controller_one.y
    if args.state.hero.jetpack_power > 0
      args.state.hero.impulse = IMPULSE
      args.state.hero.jetpack_power -= 0.1
    end
  end
end

On rend le tout plus visuel avec une barre de puissance à la place du pourcentage en nombre. Au départ entièrement jaune, le rouge se dévoile au fur et à mesure de la consommation :

args.outputs.solids << { x: 305, y: 54, w: 600, h: 27, r: 255, g: 0, b: 0 }
args.outputs.solids << { x: 305, y: 54, w: args.state.hero.jetpack_power * 6, h: 27, r: 255, g: 255, b: 0 }

Récupération de carburant

Pour récupérer du carburant pour le jetpack je place des bidons d’essence à certains endroits :

  args.state.fuel ||= [
    { x:700, y: 432, w: 25, h: 30, path: 'sprites/fuel.png', used: false },
    { x:700, y: 582, w: 25, h: 30, path: 'sprites/fuel.png', used: false },
  ]

On affiche comme d’habitude :

  args.outputs.sprites << args.state.fuel

Et on met à jour le nécessaire lorsqu’une collision est détectée entre un bidon d’essence et le personnage :

  args.state.fuel.each do |f|
    if args.state.hero.intersect_rect?(f)
      args.state.hero.jetpack_power += 20
      args.state.hero.jetpack_power = args.state.hero.jetpack_power.clamp(0, 100)
      f.used = true
    end
  end
  args.state.fuel.reject!(&:used)

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