Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, 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