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

Instance Method Summary collapse

Constructor Details

#initialize(spritesheet, frame_w, frame_h, retro = false, loop = true, *durations) ⇒ 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

  • 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

  • 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.



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
# File 'lib/aniruby/animation.rb', line 26

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

  @loop = loop

  @position = 0
  @pause = false

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

  # 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

#framesAniRuby::Frames

Returns The collection of frames this animation uses.

Returns:



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

def frames
  @frames
end

#loopBoolean

Returns The loop parameter.

Returns:

  • (Boolean)

    The loop parameter



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

def loop
  @loop
end

#positionInteger

Returns The current frame index of the animation.

Returns:

  • (Integer)

    The current frame index of the animation



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

def position
  @position
end

Instance Method Details

#current_frameAniRuby::Frame

Get the current frame

Returns:



192
193
194
# File 'lib/aniruby/animation.rb', line 192

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

#done?Boolean

Note:

This method will return true in intervals if the animation loops

Is the animation finished?

Returns:

  • (Boolean)


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

def done?
  true if @position == @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 #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



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/aniruby/animation.rb', line 94

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

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

  @position = 0 if @loop && done?
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 #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



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/aniruby/animation.rb', line 120

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[@current_frame]

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

  # Loop the animation
  @position = 0 if @loop && done?
end

#duration(ms) ⇒ Object

Set the duration for all frames in the animation

Parameters:

  • ms (Float)

    The new duration in milliseconds



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

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

  self
end

#frame_expired?Boolean

Has the current frame’s duration expired?

Returns:

  • (Boolean)


197
198
199
200
201
202
203
204
# File 'lib/aniruby/animation.rb', line 197

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

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

#heightInteger Also known as: h

Get the height of the current frame’s image

Returns:

  • (Integer)


69
70
71
# File 'lib/aniruby/animation.rb', line 69

def height
  @frames[@position].height
end

#pauseObject

Pause the animation

(see #resume)



139
140
141
142
143
# File 'lib/aniruby/animation.rb', line 139

def pause
  @pause = true

  self
end

#paused?Boolean

Is the animation paused?

Returns:

  • (Boolean)


183
184
185
186
187
# File 'lib/aniruby/animation.rb', line 183

def paused?
  return true if @pause

  false
end

#resetObject

Set the animation to the beginning frame



155
156
157
158
159
# File 'lib/aniruby/animation.rb', line 155

def reset
  @position = 0

  self
end

#resumeObject

Resume the animation

(see #pause)



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

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



77
78
79
80
81
# File 'lib/aniruby/animation.rb', line 77

def update
  return if done? || paused?

  @position += 1 if frame_expired?
end

#widthInteger Also known as: w

Get the width of the current frame’s image

Returns:

  • (Integer)


60
61
62
# File 'lib/aniruby/animation.rb', line 60

def width
  @frames[@position].width
end