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 11

| Comments

Niveau : intermédiaire

Je continue le refactoring de la méthode update:

1
2
3
4
5
6
7
8
9
10
  def update
    @enemies.each do |e|
      if e.x <= 10 || e.x + e.w >= 690
        change_enemies_direction
        enemies_down
        break
      end
    end
    @enemies.map {|enemy| enemy.move(@direction) }
  end

Je n’aime pas la condition multiple après le if. Je préfère:

1
2
3
4
5
6
7
8
9
10
  def update
    @enemies.each do |enemy|
      if side?(enemy)
        change_enemies_direction
        enemies_down
        break
      end
    end
    @enemies.map {|enemy| enemy.move(@direction) }
  end

C’est bien mieux. La définition de la méthode side? pourrait être:

1
2
3
4
5
  private

  def side?(enemy)
    enemy.x <= 10 || enemy.x + enemy.w >= 690
  end

Mais il reste des nombres magiques. En particulier le nombre 690, qui signifie 10 pixel avant la largeur du canvas. J’ai donc besoin d’ajouter ces notions à la classe Enemies:

1
2
3
4
5
6
7
8
9
10
class Enemies
  include Enumerable
  ENEMIES_PER_ROW = 10
  SIDE_MARGIN = 10

  def initialize(world_width)
    @world_width = world_width
    .
    .
    .

La méthode side? devient donc:

1
2
3
  def side?(enemy)
    enemy.x <= SIDE_MARGIN || enemy.x + enemy.w >= @world_width - SIDE_MARGIN
  end

C’est pas encore le top, mais ça ira pour l’instant. On voir pouvoir ajouter quelques nouvelles fonctionnalités.

À demain.

Articles connexes

Commentaires