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

#hide, #image_rect, #image_size, #ox, #oy, #part_rect, #render_xy, #render_xy_to, #show, #update

Constructor Details

#initialize(hash) ⇒ SpriteAnimation

インスタンスの作成

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

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

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

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

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

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

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

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

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

:sprite => 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
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/Miyako/API/sprite_animation.rb', line 66

def initialize(hash)
  init_layout
  @units = Array.new
  @slist = nil

  hash[:dir] ||= :h
  @dir   = hash[:dir]
  s = hash[:sprite]
  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

  @slist = Array.new
  if s.kind_of?(Sprite)
    @now = s.to_unit unless @now
    set_layout_size(s.ow, s.oh)
    move_to!(s.x, s.y)
    s.snap(self)
    s.left!.top!
    @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)
    first = s[0]
    @now = first.to_unit unless @now
    set_layout_size(first.ow, first.oh)
    move_to!(first.x, first.y)
    @slist = s.map{|ss|
      ss.snap(self)
      ss.left!.top!
    }
    @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| s }
    @units = Array.new(@pats){|pat|
      u = @slist[pat].to_unit.dup
      px = pat % (@pat_len / @pat_olen)
      if @dir == :h
        u.oy = @slist[pat].oh * @plist[px]
      else
        u.ox = @slist[pat].ow * @plist[px]
      end
      u
    }
  elsif @slist.length < @pats
    tmp = @slist
    @slist = @slist.cycle.take(@pats)
    @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
  else
    @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
  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 = @units[0]
  @now.move_to!(@slist[@plist[@pnum]].x + @move_offset[@pnum][0],
                @slist[@plist[@pnum]].y + @move_offset[@pnum][1])
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)



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

def bitmap
  return @now.bitmap
end

#broad_rectObject

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

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

返却値

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



469
470
471
# File 'lib/Miyako/API/sprite_animation.rb', line 469

def broad_rect
  return self.rect
end

#characterObject

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

返却値

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



322
323
324
# File 'lib/Miyako/API/sprite_animation.rb', line 322

def character
  return @cnum
end

#character=(cnum) ⇒ Object

cnum

キャラクター番号



304
305
306
307
308
# File 'lib/Miyako/API/sprite_animation.rb', line 304

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

#charactersObject

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

返却値

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



328
329
330
# File 'lib/Miyako/API/sprite_animation.rb', line 328

def characters
  return @chrs
end

#disposeObject

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



474
475
476
477
478
479
480
481
482
# File 'lib/Miyako/API/sprite_animation.rb', line 474

def dispose
  @slist.clear
  @units.each{|u| u.bitmap = nil}
  @units.clear
  @waits.clear
  @plist.clear
  @move_offset.clear
  @pos_offset.clear
end

#exec?Boolean

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

返却値

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

Returns:

  • (Boolean)


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

def exec?
  return @exec
end

#hObject

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

返却値

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



259
260
261
# File 'lib/Miyako/API/sprite_animation.rb', line 259

def h
  return @now.oh
end

#initialize_copy(obj) ⇒ Object

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

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



226
227
228
229
230
231
232
233
234
235
# File 'lib/Miyako/API/sprite_animation.rb', line 226

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

#move_character(d) ⇒ Object

あとで書く

d

あとで書く

返却値

あとで書く



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

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

#ohObject

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

返却値

スプライトのoh



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

def oh
  return @now.oh
end

#owObject

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

返却値

スプライトのow



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

def ow
  return @now.ow
end

#patternObject

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

返却値

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



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

def pattern
  return @plist[@pnum]
end

#pattern=(pnum) ⇒ Object

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

pnum

パターン番号



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

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

#patternsObject

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

返却値

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



296
297
298
# File 'lib/Miyako/API/sprite_animation.rb', line 296

def patterns
  return @pats
end

#rectObject

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

返却値

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



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

def rect
  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のときは描画されない。



491
492
# File 'lib/Miyako/API/sprite_animation.rb', line 491

def render
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ではないインスタンス)



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

def render_to(dst)
end

#resetObject

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

返却値

自分自身



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

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

#set_chrObject

:nodoc:



415
416
417
418
419
420
421
422
423
# File 'lib/Miyako/API/sprite_animation.rb', line 415

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

#set_patObject

:nodoc:



411
412
413
# File 'lib/Miyako/API/sprite_animation.rb', line 411

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

#startObject

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

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

返却値

自分自身



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

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

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

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

返却値

自分自身



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

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個のブロックを渡せば、スプライトに補正をかけることが出来る

返却値

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



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

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

#to_unitObject

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

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

返却値

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



442
443
444
# File 'lib/Miyako/API/sprite_animation.rb', line 442

def to_unit
  return @now.dup
end

#toggle_execObject

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

返却値

自分自身



366
367
368
369
370
371
372
373
# File 'lib/Miyako/API/sprite_animation.rb', line 366

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

#update_animationObject

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

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

返却値

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



380
381
# File 'lib/Miyako/API/sprite_animation.rb', line 380

def update_animation
end

#update_frameObject

:nodoc:



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

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:



263
264
265
# File 'lib/Miyako/API/sprite_animation.rb', line 263

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

#update_wait_counterObject

:nodoc:



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

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

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

返却値

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



253
254
255
# File 'lib/Miyako/API/sprite_animation.rb', line 253

def w
  return @now.ow
end

#xObject

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

返却値

x 座標の値



241
242
243
# File 'lib/Miyako/API/sprite_animation.rb', line 241

def x
  return @now.x
end

#yObject

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

返却値

y 座標の値



247
248
249
# File 'lib/Miyako/API/sprite_animation.rb', line 247

def y
  return @now.y
end