Class: Bestguigui::Particles

Inherits:
Object
  • Object
show all
Defined in:
lib/bestguigui/particles.rb

Overview

Collection de particules (Bestguigui::Particle par défaut, mais le bloc de génération peut renvoyer n'importe quel objet qui répond à update(dt)/dead?/draw). Deux usages :

Explosion ponctuelle (comme un effet d'impact) :

@effect = Bestguigui::Particles.new { Bestguigui::Particle.new(
x: tx, y: ty, angle: Gosu.random(0, 360), size: Gosu.random(1, 5),
speed: Gosu.random(10, 200), fade_speed: Gosu.random(600, 1000)
) }
@effect.burst(50)
# chaque frame : @effect.update(dt) ; @effect.draw
# à retirer une fois @effect.empty?

Flux continu maintenu à une population cible (comme de la neige qui tombe en permanence à l'écran) :

@snow = Bestguigui::Particles.new(limit: 300) { spawn_snowflake }
@snow.update(dt) # regénère automatiquement ce qui a été retiré

burst accepte aussi un bloc ponctuel différent du générateur par défaut, utile pour une première génération étalée sur tout l'écran :

@snow.burst(300) { spawn_snowflake_anywhere_on_screen }

Instance Method Summary collapse

Constructor Details

#initialize(limit: nil, &spawn) ⇒ Particles

Returns a new instance of Particles.



26
27
28
29
30
# File 'lib/bestguigui/particles.rb', line 26

def initialize(limit: nil, &spawn)
  @particles = []
  @limit = limit
  @spawn = spawn
end

Instance Method Details

#burst(count, &override) ⇒ Object



32
33
34
35
# File 'lib/bestguigui/particles.rb', line 32

def burst(count, &override)
  generator = override || @spawn
  count.times { @particles << generator.call }
end

#drawObject



50
51
52
# File 'lib/bestguigui/particles.rb', line 50

def draw
  @particles.each(&:draw)
end

#empty?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/bestguigui/particles.rb', line 54

def empty?
  @particles.empty?
end

#sizeObject



58
59
60
# File 'lib/bestguigui/particles.rb', line 58

def size
  @particles.size
end

#update(dt) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/bestguigui/particles.rb', line 37

def update(dt)
  @particles.each { |particle| particle.update(dt) }
  @particles.reject!(&:dead?)

  # Reconstitue après avoir retiré les mortes de cette frame, pas avant
  # — sinon la population reste sous la limite pendant une frame de plus
  # à chaque fois que des particules meurent.
  if @limit
    missing = @limit - @particles.size
    burst(missing) if missing.positive?
  end
end