Class: Miyako::SpriteAnimation

Inherits:
Object
  • Object
show all
Includes:
Animation, Layout, SpriteBase, SingleEnumerable
Defined in:
lib/Miyako/API/sprite_animation.rb

Overview

アニメーション管理クラス

スプライトのアニメーションの構築・実行を管理するクラス

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from SingleEnumerable

#each, #length

Methods included from Layout

#add_snap_child, #bottom, #bottom!, #center, #center!, #centering, #centering!, #copy_layout, #delete_snap_child, #get_snap_children, #get_snap_sprite, #include_snap_child?, #init_layout, #layout_dispose, #left, #left!, #middle, #middle!, #move, #move!, #move_to, #move_to!, #on_move, #outside_bottom, #outside_bottom!, #outside_left, #outside_left!, #outside_right, #outside_right!, #outside_top, #outside_top!, #pos, #relative_move_to, #relative_move_to!, #reset_snap, #right, #right!, #segment, #set_layout_size, #set_snap_children, #set_snap_sprite, #size, #snap, #top, #top!, #update_layout

Methods included from Animation

[], []=, anim_hash, reset, start, stop, update, update_animation

Methods included from SpriteBase

#image_rect, #image_size, #oh=, #ow=, #ox, #ox=, #oy, #oy=, #part_rect, #render_d, #render_xy, #render_xy_to, #update

Constructor Details

#initialize(hash) ⇒ SpriteAnimation

インスタンスの作成

アニメーションを行うための初期設定を行う。 アニメーションは2種類の方法があり、

「一つのスプライトをow,ohプロパティで分割して、表示開始位置をずらすことでアニメーションを行う」方法と、

(RPGのキャラチップを想定。 以降、「単体アニメーション」と呼ぶ)

「複数枚のスプライトの配列を渡し、要素順に表示させることでアニメーションを行う」方法がある。

(いわゆる「ぱらぱら漫画」方式。 以降、「配列アニメーション」と呼ぶ)

「パターン番号」は、キャラクタパターン(画像を一定の大きさ(ow,oh)で切り分けた単位)の番号を意味する。

単体アニメーションのときは、画像の左上から0,1,2,…と数える。

配列アニメーションのときは、配列のインデックスがパターン番号となる。

利用できるパラメータは以下の通り

:sprite/:sprites => sprite|spriteの配列 アニメーションさせるスプライト(インスタンス単体もしくはインスタンスの配列)。必須パラメータ

:dir => :h|:v 単体アニメーションのとき、縦方向に位置をずらして表示させる(:h指定時)か、横方向か(:v指定時)を決定する。デフォルトは:h

:pattern_list => 表示させるパターン番号を指定するための配列。配列の要素の順にパターンが表示される

:loop => アニメーションを繰り返し更新するかどうかを示すフラグ。falseのときは、1回パターンを実行した後、アニメーションを終了する(true/false)

hash

パラメータ名とパラメータとのハッシュ

返却値

生成されたインスタンス


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/Miyako/API/sprite_animation.rb', line 66

def initialize(hash)
  init_layout
  @slist = nil

  hash[:dir] ||= :h
  @dir   = hash[:dir]
  s = hash[:sprite] || hash[:sprites]
  hash[:pattern_list] ||= nil
  @plist = hash[:pattern_list]
  hash[:wait] ||= 0
  wait = hash[:wait]
  hash[:move_offset] ||= nil
  @move_offset = hash[:move_offset]
  hash[:position_offset] ||= nil
  @pos_offset = hash[:position_offset]
  hash[:align] ||= :max
  @align = hash[:align]
  hash[:loop] ||= true
  @loop = hash[:loop]

  @pat_len  = 1
  @pat_olen = 1
  @chr_len  = 1
  @chr_olen = 1

  @changed  = false

  @slist = Array.new
  if s.kind_of?(Sprite)
    @pat_len  = @dir == :h ? s.h  : s.w
    @pat_olen = @dir == :h ? s.oh : s.ow
    @chr_len  = @dir == :h ? s.w  : s.h
    @chr_olen = @dir == :h ? s.ow : s.oh
    @pats     = @pat_len / @pat_olen
  elsif s.kind_of?(Array)
    @slist = s.dup
    @pat_len  = @slist.length
    @pats     = @slist.length
  else
    raise MiyakoTypeError, "Illegal sprite list for SpriteAnimation."
  end

  if @plist
    if @align == :min
      @pats = @plist.length if @pats > @plist.length
    else
      @pats = @plist.length if @pats < @plist.length
    end
  else
    @plist = Array.new unless @plist
  end

  if @move_offset
    if @align == :min
      @pats = @move_offset.length if @pats > @move_offset.length
    else
      @pats = @move_offset.length if @pats < @move_offset.length
    end
  else
    @move_offset = Array.new
  end

  if @pos_offset
    if @align == :min
      @pats = @pos_offset.length if @pats > @pos_offset.length
    else
      @pats = @pos_offset.length if @pats < @pos_offset.length
    end
  else
    @pos_offset = Array.new
  end

  if wait.kind_of?(Array)
    @waits = wait.collect{|w| w.kind_of?(Float) ? WaitCounter.new(w) : w }
    if @align == :min
      @pats = @waits.length if @pats > @waits.length
    else
      @pats = @waits.length if @pats < @waits.length
    end
  else
    @waits = Array.new
  end

  if @plist.length == 0
    @pats.times{|p| @plist.push(p)}
  elsif @plist.length < @pats
    @plist = @plist.cycle.take(@pats)
  end

  if @slist.length == 0
    @slist = Array.new(@pats){|pat|
      u = s.dup
      px = pat % (@pat_len / @pat_olen)
      if @dir == :h
        u.oy = u.oh * @plist[px]
      else
        u.ox = u.ow * @plist[px]
      end
      u
    }
  elsif @slist.length < @pats
    @slist = @slist.cycle.take(@pats)
  end

  if @move_offset.length == 0
    @move_offset = Array.new(@pats){|pat| Point.new(0,0) }
  elsif @move_offset.length < @pats
    @move_offset = @move_offset.cycle.take(@pats)
  end

  if @pos_offset.length == 0
    @pos_offset = Array.new(@pats){|pat| 0 }
  elsif @pos_offset.length < @pats
    @pos_offset = @pos_offset.cycle.take(@pats)
  end

  if @waits.length == 0
    if wait.kind_of?(Integer)
      @waits = Array.new(@pats){|pat| wait}
    elsif wait.kind_of?(Float)
      @waits = Array.new(@pats){|pat| WaitCounter.new(wait)}
    else
      raise MiyakoTypeError, "Illegal counter class for SpriteAnimation."
    end
  elsif @waits.length < @pats
    @waits = @waits.cycle.take(@pats)
  end

  @chrs  = @chr_len / @chr_olen

  @cnum  = 0
  @pnum  = 0
  @cnt   = 0
  @exec  = false
  @visible = true

  @now = @slist[@plist[@pnum]]

  first = @slist[0]
  set_layout_size(first.ow, first.oh)
  move_to!(first.x, first.y)
  @slist.each{|ss| ss.move_to!(first.x, first.y) }
end

Instance Attribute Details

#visibleObject

レンダリングの可否(true->描画 false->非描画)


32
33
34
# File 'lib/Miyako/API/sprite_animation.rb', line 32

def visible
  @visible
end

Instance Method Details

#bitmapObject

現在実行中のパターンの画像を返す

返却値

現在表示している画像(bitmap)


440
441
442
# File 'lib/Miyako/API/sprite_animation.rb', line 440

def bitmap
  return @now.bitmap
end

#broad_rectObject

現在表示しているスプライトの最大の大きさを矩形で取得する

現在のパターンの大きさと同じため、rectメソッドの値と同一となる

返却値

生成された矩形(Rect構造体のインスタンス)


462
463
464
# File 'lib/Miyako/API/sprite_animation.rb', line 462

def broad_rect
  return self.rect
end

#changed?Boolean

先の更新でパターンが更新されたかどうかを返す

返却値

true/false

Returns:

  • (Boolean)

421
422
423
# File 'lib/Miyako/API/sprite_animation.rb', line 421

def changed?
  return @changed
end

#characterObject

現在のキャラクター番号を取得する

返却値

キャラクター番号(0以上の整数)


308
309
310
# File 'lib/Miyako/API/sprite_animation.rb', line 308

def character
  return @cnum
end

#character=(cnum) ⇒ Object

キャラクター番号を設定する

キャラクター番号(アニメーションさせるときに表示させるパターン群インデックス) を設定する。範囲外のキャラクター番号が設定された時は何も行わない

cnum

キャラクター番号


290
291
292
293
294
# File 'lib/Miyako/API/sprite_animation.rb', line 290

def character=(cnum)
  return self if (cnum < 0 || cnum >= @chrs)
  @cnum = cnum
  set_chr
end

#charactersObject

キャラクター数を取得する

返却値

キャラクター数(0以上の整数)


314
315
316
# File 'lib/Miyako/API/sprite_animation.rb', line 314

def characters
  return @chrs
end

#disposeObject

インスタンスに束縛されているオブジェクトを解放する


467
468
469
470
471
472
473
# File 'lib/Miyako/API/sprite_animation.rb', line 467

def dispose
  @slist.clear
  @waits.clear
  @plist.clear
  @move_offset.clear
  @pos_offset.clear
end

#exec?Boolean

アニメーションが実行中かを返す

返却値

アニメーションが実行されていれば true

Returns:

  • (Boolean)

427
428
429
# File 'lib/Miyako/API/sprite_animation.rb', line 427

def exec?
  return @exec
end

#hObject

現在表示しているスプライトの高さを取得する

返却値

現在表示しているスプライトの高さ(ピクセル単位)


245
246
247
# File 'lib/Miyako/API/sprite_animation.rb', line 245

def h
  return @now.oh
end

#hideObject


507
508
509
510
# File 'lib/Miyako/API/sprite_animation.rb', line 507

def hide
  @visible = false
  self
end

#initialize_copy(obj) ⇒ Object

複写時に呼び出されるメソッド

複写と同時に、本インスタンスに対するスナップの関係を解消するが、 新しいパターンスプライトとスナップをやり直す


213
214
215
216
217
218
219
220
221
# File 'lib/Miyako/API/sprite_animation.rb', line 213

def initialize_copy(obj)
  @slist = @slist.deep_dup
  @plist = @plist.dup
  @move_offset = @move_offset.dup
  @pos_offset = @pos_offset.dup
  @now = @slist[@plist[@pnum]]
  copy_layout
  @slist.each{|s| s.snap(self)}
end

#move_character(d) ⇒ Object

あとで書く

d

あとで書く

返却値

あとで書く


299
300
301
302
303
304
# File 'lib/Miyako/API/sprite_animation.rb', line 299

def move_character(d)
  @cnum = (@cnum + d) % @chrs
  @cnum = @cnum + @chrs if @cnum < 0
  set_chr
  return self
end

#ohObject

現在表示しているスプライトのohを取得する

返却値

スプライトのoh


261
262
263
# File 'lib/Miyako/API/sprite_animation.rb', line 261

def oh
  return @now.oh
end

#owObject

現在表示しているスプライトのowを取得する

返却値

スプライトのow


255
256
257
# File 'lib/Miyako/API/sprite_animation.rb', line 255

def ow
  return @now.ow
end

#patternObject

現在表示しているパターンを取得する

返却値

現在表示しているスプライトのインスタンス


276
277
278
# File 'lib/Miyako/API/sprite_animation.rb', line 276

def pattern
  return @plist[@pnum]
end

#pattern=(pnum) ⇒ Object

表示するパターンの番号を変更する

pnum

パターン番号


267
268
269
270
271
272
# File 'lib/Miyako/API/sprite_animation.rb', line 267

def pattern=(pnum)
  @pnum = pnum if pnum < @pats
  set_pat
  @cnt = @waits[@plist[@pnum]] if @exec
  return self
end

#patternsObject

アニメーションのパターン数を取得する

返却値

パターン数(0以上の整数)


282
283
284
# File 'lib/Miyako/API/sprite_animation.rb', line 282

def patterns
  return @pats
end

#rectObject

現在表示しているスプライトの大きさを矩形で取得する

返却値

生成された矩形(Rect構造体のインスタンス)


454
455
456
457
# File 'lib/Miyako/API/sprite_animation.rb', line 454

def rect
  v = @slist[@plist[@pnum]]
  return Rect.new(@now.x, @now.y, @now.ow, @now.oh)
end

#renderObject

アニメーションの現在の画像を画面に描画する

転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。 画面の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。 ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る) (ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない) ブロックの引数は、|インスタンスのSpriteUnit|となる。 visibleメソッドの値がfalseのときは描画されない。


482
483
484
485
486
# File 'lib/Miyako/API/sprite_animation.rb', line 482

def render
  return self unless @visible
  return self unless @now
  @now.render_d(*@move_offset[@pnum])
end

#render_to(dst) ⇒ Object

アニメーションの現在の画像を画像に描画する

転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。 転送先の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。 ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る) (ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない) ブロックの引数は、|インスタンスのSpriteUnit,転送先のSpriteUnit|となる。 visibleメソッドの値がfalseのときは描画されない。

dst

転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)


496
497
498
499
500
# File 'lib/Miyako/API/sprite_animation.rb', line 496

def render_to(dst)
  return self unless @now
  pos = @now.move(*@move_offset[@pnum])
  @now.render_xy_to(dst, *pos)
end

#resetObject

アニメーションのパターンをリセットする

返却値

自分自身


413
414
415
416
417
# File 'lib/Miyako/API/sprite_animation.rb', line 413

def reset
  @pnum = 0
  @cnt  = 0
  return self
end

#set_chrObject

:nodoc:


401
402
403
404
405
406
407
408
409
# File 'lib/Miyako/API/sprite_animation.rb', line 401

def set_chr #:nodoc:
  @slist.each{|u|
    if @dir == :h
      u.ox = @chr_olen * @cnum
    else
      u.oy = @chr_olen * @cnum
    end
  }
end

#set_patObject

:nodoc:


397
398
399
# File 'lib/Miyako/API/sprite_animation.rb', line 397

def set_pat #:nodoc:
  @now = @slist[@plist[@pnum]]
end

#showObject


502
503
504
505
# File 'lib/Miyako/API/sprite_animation.rb', line 502

def show
  @visible = true
  self
end

#startObject

アニメーションを開始する

パターンがリセットされていないときは、一時停止から復帰した時と同じ動作をする

返却値

自分自身


321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/Miyako/API/sprite_animation.rb', line 321

def start
  return self if @exec
  set_pat
  if @dir == :h
    @now.oy += @pos_offset[@pnum]
  else
    @now.ox += @pos_offset[@pnum]
  end
  @cnt = @waits[@plist[@pnum]]
  @cnt.start if @cnt.kind_of?(WaitCounter)
  @exec = true
  return self
end

#stopObject

アニメーションを停止する

停止しても、表示していたパターンはリセットされていない

返却値

自分自身


338
339
340
341
342
343
344
345
346
347
348
# File 'lib/Miyako/API/sprite_animation.rb', line 338

def stop
  return self unless @exec
  if @dir == :h
    @now.oy -= @pos_offset[@pnum]
  else
    @now.ox -= @pos_offset[@pnum]
  end
  @cnt.stop if @cnt.kind_of?(WaitCounter)
  @exec = false
  return self
end

#to_sprite(&block) ⇒ Object

現在実行中のパターンの元になったインスタンスを返す

取得するパターンは、元になったインスタンスのto_spriteメソッドを呼び出した時の値となる 引数1個のブロックを渡せば、スプライトに補正をかけることが出来る

返却値

現在表示しているスプライト


448
449
450
# File 'lib/Miyako/API/sprite_animation.rb', line 448

def to_sprite(&block)
  return @slist[@plist[@pnum]].to_sprite(&block)
end

#to_unitObject

現在実行中のパターンの元になったスプライトユニットを返す

得られるインスタンスは内部でしようしてるものの複写

返却値

現在表示しているスプライトユニット


434
435
436
# File 'lib/Miyako/API/sprite_animation.rb', line 434

def to_unit
  return @now.dup
end

#toggle_execObject

アニメーションの開始・停止を切り替える

返却値

自分自身


352
353
354
355
356
357
358
359
# File 'lib/Miyako/API/sprite_animation.rb', line 352

def toggle_exec
  if @exec
    stop
  else
    start
  end
  return self
end

#update_animationObject

アニメーションの更新を行う

アニメーションのカウントをチェックし、カウントが終了したときは新しいパターンに切り替えて、カウントを開始する すべてのパターンのアニメーションが終了すれば、最初のパターンに戻り、カウントを開始する 但し、インスタンス生成時に:loop->falseを設定していれば、アニメーションを終了する

返却値

アニメーションパターンが切り替わればtrue、切り替わらないとき、アニメーションが終了したときはfalseを返す


366
367
# File 'lib/Miyako/API/sprite_animation.rb', line 366

def update_animation
end

#update_frameObject

:nodoc:


369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'lib/Miyako/API/sprite_animation.rb', line 369

def update_frame #:nodoc:
  if @cnt > 0
    @cnt -= 1
    return false
  end
  @pnum = (@pnum + 1) % @pats
  if @loop == false && @pnum == 0
    stop
    return false
  end
  set_pat
  @cnt = @waits[@plist[@pnum]]
  return true
end

#update_layout_positionObject

:nodoc:


249
250
251
# File 'lib/Miyako/API/sprite_animation.rb', line 249

def update_layout_position #:nodoc:
  @slist.each{|u| u.move_to!(*@layout.pos) }
end

#update_wait_counterObject

:nodoc:


384
385
386
387
388
389
390
391
392
393
394
395
# File 'lib/Miyako/API/sprite_animation.rb', line 384

def update_wait_counter #:nodoc:
  return false if @cnt.waiting?
  @pnum = (@pnum + 1) % @pats
  if @loop == false && @pnum == 0
    stop
    return false
  end
  set_pat
  @cnt = @waits[@plist[@pnum]]
  @cnt.start
  return true
end

#wObject

現在表示しているスプライトの幅を取得する

返却値

現在表示しているスプライトの幅(ピクセル単位)


239
240
241
# File 'lib/Miyako/API/sprite_animation.rb', line 239

def w
  return @now.ow
end

#xObject

現在表示しているスプライトの x 座標の値を取得する

返却値

x 座標の値


227
228
229
# File 'lib/Miyako/API/sprite_animation.rb', line 227

def x
  return @now.x
end

#yObject

現在表示しているスプライトの y 座標の値を取得する

返却値

y 座標の値


233
234
235
# File 'lib/Miyako/API/sprite_animation.rb', line 233

def y
  return @now.y
end