Class: AniRuby::Animation

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

Overview

Has a AniRuby::Frames colletion, with a simple counter to keep track of current frame plus looping and pausing functionality

Instance Attribute Summary collapse

Drawing collapse

Utility collapse

Instance Method Summary collapse

Constructor Details

#initialize(spritesheet, frame_w, frame_h, *durations, retro: false, loop: true) ⇒ Animation

Create a new animation

Parameters:

  • spritesheet (String)

    Path to the spritesheet file

  • frame_w (Integer)

    The width of each individual frame

  • frame_h (Integer)

    The height of each individual frame

  • durations (Float)

    The duration of the frames in MS (0.5 is half a second, 1.0 a second, etc). If there’s more than one duration provided they will be mapped to each frame of the animation. The default for each frame is 0.1. If the value is negative it’ll default to 0.1.

  • retro (Boolean) (defaults to: false)

    If true, the animation will not be interpolated when scaled

  • loop (Boolean) (defaults to: true)

    If true, the animation will loop indefinitely



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/aniruby/animation.rb', line 26

def initialize(spritesheet,
               frame_w, frame_h,
               *durations,
               retro: false,
               loop: true)
  @frame_w = frame_w
  @frame_h = frame_h

  @loop = loop
  @pause = false

  @cursor = 0
  @step = 1

  @frames = AniRuby::Frames.new(Gosu::Image.load_tiles(spritesheet,
                                                       @frame_w,
                                                       @frame_h,
                                                       retro: retro))

  # Default to 0.1 if the duration is negative
  durations.map! { |dur| dur.negative? ? 0.1 : dur }

  # TODO: Maybe I could shorten this, adding an extra argument to
  #       AniRuby::Frames
  if durations.one?
    @frames.each { |frame| frame.duration = durations[0]}
  else
    @frames.each_with_index do |frame, idx|
      # Set each frame to the duration provided, if there's no provide
      # duration for all frames then we'll leave it at the default
      frame.duration = durations[idx] unless durations[idx].nil?
    end
  end
end

Instance Attribute Details

#cursorInteger

Returns The current frame index of the animation.

Returns:

  • (Integer)

    The current frame index of the animation



8
9
10
# File 'lib/aniruby/animation.rb', line 8

def cursor
  @cursor
end

#framesAniRuby::Frames

Returns The collection of frames this animation uses.

Returns:



6
7
8
# File 'lib/aniruby/animation.rb', line 6

def frames
  @frames
end

#loopBoolean

Returns The loop parameter.

Returns:

  • (Boolean)

    The loop parameter



10
11
12
# File 'lib/aniruby/animation.rb', line 10

def loop
  @loop
end

Instance Method Details

#current_frameAniRuby::Frame

Get the current frame

Returns:



203
204
205
# File 'lib/aniruby/animation.rb', line 203

def current_frame
  @frames[@cursor % @frames.count]
end

#done?Boolean

Note:

This method will return true in intervals if the animation loops

Is the animation finished?

Returns:

  • (Boolean)


185
186
187
188
189
# File 'lib/aniruby/animation.rb', line 185

def done?
  return true if @cursor == @frames.count - 1

  false
end

#draw(x, y, z = 0, scale_x = 1, scale_y = 1, color = Gosu::Color::WHITE, mode = :default) ⇒ Object

Draw the animation

(see also #draw_rot)

Parameters:

  • x (Integer)

    The X coordinate

  • y (Integer)

    The Y coordinate

  • z (Integer) (defaults to: 0)

    The Z order

  • scale_x (Float) (defaults to: 1)

    The horizontal scale factor

  • scale_y (Float) (defaults to: 1)

    The vertical scale factor

  • color (Gosu::Color) (defaults to: Gosu::Color::WHITE)

    The color to usw when drawing

  • mode (:default, :additive) (defaults to: :default)

    The blending mode



104
105
106
107
108
109
110
111
112
# File 'lib/aniruby/animation.rb', line 104

def draw(x, y, z = 0,
         scale_x = 1,
         scale_y = 1,
         color = Gosu::Color::WHITE,
         mode = :default)
  frame = @frames[@cursor]

  frame.sprite.draw(x, y, z, scale_x, scale_y, color, mode)
end

#draw_rot(x, y, z = 0, angle = 0, center_x = 0.5, center_y = 0.5, scale_x = 1, scale_y = 1, color = Gosu::Color::WHITE, mode = :default) ⇒ Object

Draw the animation rotated, with its rotational center at (x, y).

(see also #draw)

Parameters:

  • x (Integer)

    The X coordinate

  • y (Integer)

    The Y coordinate

  • z (Integer) (defaults to: 0)

    The Z order

  • angle (Float) (defaults to: 0)

    The angle. in degrees

  • center_x (Float) (defaults to: 0.5)

    the relative horizontal rotation origin

  • center_y (Float) (defaults to: 0.5)

    the relative vertical rotation origin

  • scale_x (Float) (defaults to: 1)

    The horizontal scale factor

  • scale_y (Float) (defaults to: 1)

    The vertical scale factor

  • color (Gosu::Color) (defaults to: Gosu::Color::WHITE)

    The color to usw when drawing

  • mode (:default, :additive) (defaults to: :default)

    The blending mode



128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/aniruby/animation.rb', line 128

def draw_rot(x, y, z = 0,
             angle = 0,
             center_x = 0.5,
             center_y = 0.5,
             scale_x = 1,
             scale_y = 1,
             color = Gosu::Color::WHITE,
             mode = :default)
  frame = @frames[@cursor]

  frame.sprite.draw_rot(x, y, z, angle, center_x, center_y, scale_x, scale_y, color, mode)
end

#duration(ms) ⇒ Object

Set the duration for all frames in the animation

Parameters:

  • ms (Float)

    The new duration in milliseconds



175
176
177
178
179
# File 'lib/aniruby/animation.rb', line 175

def duration(ms)
  @frames.each { |frame| frame.duration = ms }

  self
end

#frame_expired?Boolean

Has the current frame’s duration expired?

Returns:

  • (Boolean)


210
211
212
213
214
215
216
217
# File 'lib/aniruby/animation.rb', line 210

def frame_expired?
  now = Gosu.milliseconds / 1000.0
  @last_frame ||= now

  if (now - @last_frame) > @frames[@cursor].duration
    @last_frame = now
  end
end

#heightInteger Also known as: h

Get the height of the current frame’s image

Returns:

  • (Integer)


73
74
75
# File 'lib/aniruby/animation.rb', line 73

def height
  @frames[@cursor].height
end

#pauseObject

Pause the animation

(see also #resume)



148
149
150
151
152
# File 'lib/aniruby/animation.rb', line 148

def pause
  @pause = true

  self
end

#paused?Boolean

Is the animation paused?

Returns:

  • (Boolean)


194
195
196
197
198
# File 'lib/aniruby/animation.rb', line 194

def paused?
  return true if @pause

  false
end

#resetObject Also known as: reset!

Set the animation to the beginning frame



164
165
166
167
168
# File 'lib/aniruby/animation.rb', line 164

def reset
  @cursor = 0

  self
end

#resumeObject

Resume the animation

(see also #pause)



157
158
159
160
161
# File 'lib/aniruby/animation.rb', line 157

def resume
  @pause = false

  self
end

#updateObject

Update the animation, advancing the frame counter. Note that this won’t do do anything if the animation is paused or has finished



83
84
85
86
87
88
89
90
91
# File 'lib/aniruby/animation.rb', line 83

def update
  return unless frame_expired? && !paused?

  if !done?
    @cursor += @step
  elsif done? && @loop
    @cursor = 0
  end
end

#widthInteger Also known as: w

Get the width of the current frame’s image

Returns:

  • (Integer)


64
65
66
# File 'lib/aniruby/animation.rb', line 64

def width
  @frames[@cursor].width
end