#
# statemachine demo
#
$sprites = []
def main()
Sprite.new(2, 5)
Sprite.new(5, 14)
Sprite.new(10, 2)
animate
nil
end
# each sprite must wait some number of frames,
# then 'pop' up 3 steps, down 3 steps, and disappear
class Sprite
def step()
if @state == 0 #sleep for @wait frames
@wait -= 1
if @wait == 0
@state = 1
@wait = 0
end
elsif @state == 1 #move forward two
@wait += 1
@x += 2
if @wait == 2
@state = 2
@wait = 0
end
elsif @state == 2 #move back two
@wait += 1
@x -= 2
if @wait == 2
@state = 3
end
else
self.die() #then die
end
end
def initialize(x, wait)
@x = x
@wait = wait
@state = 0
$sprites.push self
end
def get_x()
@x
end
def die()
$sprites.delete self
end
end
def render
frame = [' ']*39
for s in $sprites
frame[s.get_x] = '*'
end
puts frame.join
end
def animate ()
20.times do # 20 frames of animation
render()
sprites = $sprites.clone
sprites.each do |s|
s.step()
end
end
end
main