IceDragon200

animator.rb

Dec 30th, 2013
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.62 KB | None | 0 0
  1. ## walking.seq.rb
  2. index 1
  3. repeat do
  4.   rest 0.1
  5.   succ
  6.   rest 0.1
  7.   succ
  8.   rest 0.1
  9.   pred
  10.   rest 0.1
  11.   pred
  12.   cancel
  13. end
  14.  
  15. ## animator.rb
  16. class Animator
  17.  
  18.   class Builder
  19.  
  20.     def initialize
  21.       @_list = []
  22.       @_depth = 0
  23.     end
  24.  
  25.     def render
  26.       @_list
  27.     end
  28.  
  29.     def _cmd(sym, *params)
  30.       @_list << [@_depth, sym, *params]
  31.     end
  32.  
  33.     def _depth_succ
  34.       @_depth += 1
  35.     end
  36.  
  37.     def _depth_pred
  38.       @_depth -= 1
  39.     end
  40.  
  41.     def _import(data)
  42.       instance_eval(data); self
  43.     end
  44.  
  45.     def index(n)
  46.       _cmd(:index, n.to_i)
  47.     end
  48.  
  49.     def succ(n=1)
  50.       _cmd(:succ, n.to_i)
  51.     end
  52.  
  53.     def pred(n=1)
  54.       _cmd(:pred, n.to_i)
  55.     end
  56.  
  57.     def rest(n)
  58.       _cmd(:rest, n.to_i)
  59.     end
  60.  
  61.     def repeat
  62.       @_list << _cmd(:repeat)
  63.       _depth_succ
  64.       yield
  65.       _depth_pred
  66.       @_list << _cmd(:end)
  67.     end
  68.  
  69.     def cancel
  70.       _cmd(:cancel)
  71.     end
  72.  
  73.     def self.build(data)
  74.       new._import(data)
  75.     end
  76.  
  77.   end
  78.  
  79.   def initialize
  80.     clear
  81.   end
  82.  
  83.   def clear
  84.     @_list = nil
  85.     @_list_index = 0
  86.     @_depth = 0
  87.     @_depth_flags = [[]]
  88.     @_depth_vars = [{}]
  89.   end
  90.  
  91.   def depth_succ
  92.     @_depth += 1
  93.     @_depth_flags.push([])
  94.     @_depth_vars.push({})
  95.   end
  96.  
  97.   def depth_pred
  98.     @_depth -= 1
  99.     @_depth_flags.pop
  100.     @_depth_vars.pop
  101.   end
  102.  
  103.   def depth_vars
  104.     @_depth_vars[@_depth]
  105.   end
  106.  
  107.   def depth_flags
  108.     @_depth_flags[@_depth]
  109.   end
  110.  
  111.   def exec_command(cmd)
  112.     dp, op, *params = *cmd
  113.     case op
  114.     when :index # set the index
  115.       @index = params.first
  116.     when :succ # increment index
  117.       @index += params.first
  118.     when :pred # decrement index
  119.       @index -= params.first
  120.     when :rest # sleep for a period
  121.       @rest = (params.first * Graphics.frame_rate).to_i
  122.     when :repeat
  123.       depth_succ
  124.       depth_flags << :repeat
  125.       depth_vars[:line] = @_list_index
  126.     when :cancel
  127.       depth_pred
  128.     when :end
  129.       if depth_flags.include?(:repeat)
  130.         @_list_index = depth_vars[:line]
  131.       else
  132.         depth_flags.delete(:repeat)
  133.       end
  134.     end
  135.   end
  136.  
  137.   def current_line
  138.     @_list[@_list_index]
  139.   end
  140.  
  141.   def update
  142.     if @rest > 0
  143.       @rest -= 1
  144.     else
  145.       if @_list
  146.         while @_list.size > @_list_index
  147.           exec_command(current_line)
  148.           while current_line[0] > @_depth #.depth
  149.             @_list_index += 1
  150.             break if @_list.size < @_list_index
  151.           end
  152.         end
  153.       end
  154.     end
  155.   end
  156.  
  157. end
  158.  
  159. require 'pp'
  160. pp Animator::Builder.build(File.read("../../data/sequence/animation/walking.seq.rb")).render
Advertisement
Add Comment
Please, Sign In to add comment