Class: Chingu::Animation

Inherits:
Object
  • Object
show all
Defined in:
lib/chingu/animation.rb

Overview

The Animation-class helps you load and manage a tileanimation. A Tileanimation is a file where all the frames are put after eachother.

An easy to use program to create tileanimations is tilestudio.sourceforge.net/ or www.humanbalance.net/gale/us/

TODO: Support frames in invidual image-files? Is autodetection of width / height possible?

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Animation

Create a new Animation.

- loop: [true|false]. After the last frame is used, start from the beginning.
- bounce: [true|false]. After the last frame is used, play it backwards untill the first frame is used again, then start playing forwards again.
- file:   Tile-file to cut up animation frames from. Could be a full path or just a name -- then it will look for media_path(file)
- width:  width of each frame in the tileanimation
- height:  width of each frame in the tileanimation
- size: [x,y] specify width/height with 1 argument (an array)
- delay: milliseconds between each frame
- step: [steps] move animation forward [steps] frames each time we call #next


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/chingu/animation.rb', line 27

def initialize(options)
  options = {:step => 1, :loop => true, :bounce => false, :width => 32, :height => 32, :index => 0, :delay => 100}.merge(options)
  
  @loop = options[:loop]
  @bounce = options[:bounce]
  @file = options[:file]
  @height = options[:height]
  @width = options[:width]
  @index = options[:index]
  @delay = options[:delay]
  @step = options[:step] || 1
  @dt = 0
  
  if options[:size]
    @width = options[:size][0]
    @height = options[:size][1]
  end
  
  @file = media_path(@file)  unless File.exist?(@file)
  
  @frame_actions = []
  @frames = Gosu::Image.load_tiles($window, @file, @width, @height, true)
end

Instance Attribute Details

#bounceObject

Returns the value of attribute bounce.



13
14
15
# File 'lib/chingu/animation.rb', line 13

def bounce
  @bounce
end

#delayObject

Returns the value of attribute delay.



13
14
15
# File 'lib/chingu/animation.rb', line 13

def delay
  @delay
end

#framesObject

Returns the value of attribute frames.



13
14
15
# File 'lib/chingu/animation.rb', line 13

def frames
  @frames
end

#loopObject

Returns the value of attribute loop.



13
14
15
# File 'lib/chingu/animation.rb', line 13

def loop
  @loop
end

#stepObject

Returns the value of attribute step.



13
14
15
# File 'lib/chingu/animation.rb', line 13

def step
  @step
end

Instance Method Details

#[](index) ⇒ Object

Fetch a frame or frames:

@animation[0]       # returns first frame
@animation[0..2]    # returns a new Animation-instance with first, second and third frame


71
72
73
74
# File 'lib/chingu/animation.rb', line 71

def [](index)
  return @frames[index]               if  index.is_a?(Fixnum)
  return self.new_from_frames(index)  if  index.is_a?(Range)
end

#firstObject

Returns first frame (GOSU::Image) from animation



54
55
56
# File 'lib/chingu/animation.rb', line 54

def first
  @frames.first
end

#imageObject

Get the current frame (a Gosu#Image)



79
80
81
# File 'lib/chingu/animation.rb', line 79

def image
  @frames[@index]
end

#lastObject

Returns last frame (GOSU::Image) from animation



61
62
63
# File 'lib/chingu/animation.rb', line 61

def last
  @frames.last
end

#new_from_frames(range) ⇒ Object

Returns a new animation with the frames from the original animation. Specify which frames you want with “range”, for example “0..3” for the 4 first frames.



96
97
98
99
100
101
102
103
# File 'lib/chingu/animation.rb', line 96

def new_from_frames(range)
  new_animation = self.dup
  new_animation.frames = []
  range.each do |nr|
    new_animation.frames << self.frames[nr]
  end
  return new_animation
end

#nextObject Also known as: next!

Propelles the animation forward. Usually called in #update within the class which holds the animation. Animation#next() will look at bounce and loop flags to always return a correct frame (a Gosu#Image)



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/chingu/animation.rb', line 109

def next
  if (@dt += $window.milliseconds_since_last_tick) > @delay
    @dt = 0
    @previous_index = @index
    @index += @step
    
    # Has the animation hit end or beginning... time for bounce or loop?
    if (@index >= @frames.size || @index < 0)
      if @bounce
        @step *= -1   # invert number
        @index += @step
      elsif @loop
        @index = 0	
      else
        @index = @previous_index # no bounce or loop, use previous frame
      end
    end
    @frame_actions[@index].call	if	@frame_actions[@index]
  end
  @frames[@index]
end

#on_frame(frames, &block) ⇒ Object

Execute a certain block of code when a certain frame in the animation is active. This could be used for pixel perfect animation/movement.



144
145
146
147
148
149
150
# File 'lib/chingu/animation.rb', line 144

def on_frame(frames, &block)
  if frames.kind_of? Array
    frames.each { |frame| @frame_actions[frame] = block }
  else
    @frame_actions[frames] = block
  end
end

#reset!Object

Resets the animation, re-starts it at frame 0 returns itself.



87
88
89
90
# File 'lib/chingu/animation.rb', line 87

def reset!
  @index = 0
  self
end

#retrofyObject

Initialize non-blurry zoom on frames in animation



135
136
137
138
# File 'lib/chingu/animation.rb', line 135

def retrofy
  frames.each { |frame| frame.retrofy }
  self
end