Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## walking.seq.rb
- index 1
- repeat do
- rest 0.1
- succ
- rest 0.1
- succ
- rest 0.1
- pred
- rest 0.1
- pred
- cancel
- end
- ## animator.rb
- class Animator
- class Builder
- def initialize
- @_list = []
- @_depth = 0
- end
- def render
- @_list
- end
- def _cmd(sym, *params)
- @_list << [@_depth, sym, *params]
- end
- def _depth_succ
- @_depth += 1
- end
- def _depth_pred
- @_depth -= 1
- end
- def _import(data)
- instance_eval(data); self
- end
- def index(n)
- _cmd(:index, n.to_i)
- end
- def succ(n=1)
- _cmd(:succ, n.to_i)
- end
- def pred(n=1)
- _cmd(:pred, n.to_i)
- end
- def rest(n)
- _cmd(:rest, n.to_i)
- end
- def repeat
- @_list << _cmd(:repeat)
- _depth_succ
- yield
- _depth_pred
- @_list << _cmd(:end)
- end
- def cancel
- _cmd(:cancel)
- end
- def self.build(data)
- new._import(data)
- end
- end
- def initialize
- clear
- end
- def clear
- @_list = nil
- @_list_index = 0
- @_depth = 0
- @_depth_flags = [[]]
- @_depth_vars = [{}]
- end
- def depth_succ
- @_depth += 1
- @_depth_flags.push([])
- @_depth_vars.push({})
- end
- def depth_pred
- @_depth -= 1
- @_depth_flags.pop
- @_depth_vars.pop
- end
- def depth_vars
- @_depth_vars[@_depth]
- end
- def depth_flags
- @_depth_flags[@_depth]
- end
- def exec_command(cmd)
- dp, op, *params = *cmd
- case op
- when :index # set the index
- @index = params.first
- when :succ # increment index
- @index += params.first
- when :pred # decrement index
- @index -= params.first
- when :rest # sleep for a period
- @rest = (params.first * Graphics.frame_rate).to_i
- when :repeat
- depth_succ
- depth_flags << :repeat
- depth_vars[:line] = @_list_index
- when :cancel
- depth_pred
- when :end
- if depth_flags.include?(:repeat)
- @_list_index = depth_vars[:line]
- else
- depth_flags.delete(:repeat)
- end
- end
- end
- def current_line
- @_list[@_list_index]
- end
- def update
- if @rest > 0
- @rest -= 1
- else
- if @_list
- while @_list.size > @_list_index
- exec_command(current_line)
- while current_line[0] > @_depth #.depth
- @_list_index += 1
- break if @_list.size < @_list_index
- end
- end
- end
- end
- end
- end
- require 'pp'
- pp Animator::Builder.build(File.read("../../data/sequence/animation/walking.seq.rb")).render
Advertisement
Add Comment
Please, Sign In to add comment