Xavier Nayrac

Accro au TDD, rubyiste mais pas que, maker, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Un space invaders avec Opal.rb - partie 12

| Comments

Niveau : intermédiaire

On commence aujourd’hui à ajouter les tirs du joueur. Le code que je vous propose est un brouillon, qu’il faudra améliorer successivement.

D’abord dans la classe Game, j’ajoute un champ @fires:

1
2
3
4
5
6
7
8
class Game

  def initialize
    @canvas = SpaceCanvas.new
    @player = Player.new
    @enemies = Enemies.new(@canvas.width)
    @fires = []
  end

On déclenchera la méthode fire lors d’un appui sur la barre d’espace (32):

1
2
3
4
5
6
7
8
9
10
11
  def init_keyboard
    %x(
      window.addEventListener("keydown",
        function(e) {
          if(e.keyCode == 32) { #{fire} }
          if(e.keyCode == 37) { #{@player.move_left} }
          if(e.keyCode == 39) { #{@player.move_right} }
        },
        false);
    )
  end

Voici la méthode fire, qui ajoute simplement un objet à la collection:

1
2
3
  def fire
    @fires << Fire.new(@player.x, @player.y)
  end

Et maintenant une méthode qui met à jour les tirs du joueur:

1
2
3
4
5
6
7
  def update_fires
    @fires.each do |fire|
      fire.update_position
      @canvas.draw_fire(fire)
    end
    @fires.select! {|fire| fire.y >= 0 }
  end

La dernière ligne de cette méthode supprime de la collection les tirs qui ne sont plus visibles à l’écran.

Pour finir, voici la classe Fire:

app/fire.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Fire
  WIDTH = 4
  DELTA = 5

  attr_reader :x, :y

  def initialize(x, y)
    @x = x
    @y = y
  end

  def w; WIDTH; end

  def h; WIDTH; end

  def color; "white"; end

  def update_position
    @y -= DELTA
  end
end

Tout ce code pose un certain nombre de problèmes sur lesquels je reviendrais dans les prochains jours. Demain je pense que je mettrais le code sur Github.

À demain.

Articles connexes

Commentaires