Je continue le refactoring de la méthode update:

  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:

  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:

  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:

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:

  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.