cyross-ruby-miyako 2.0.5.1.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. data/README +1092 -929
  2. data/Rakefile +7 -7
  3. data/defines.h +144 -144
  4. data/extern.h +29 -29
  5. data/install_miyako.rb +87 -87
  6. data/lib/Miyako/API/audio.rb +572 -198
  7. data/lib/Miyako/API/basic_data.rb +825 -573
  8. data/lib/Miyako/API/bitmap.rb +534 -507
  9. data/lib/Miyako/API/choices.rb +481 -475
  10. data/lib/Miyako/API/collision.rb +486 -460
  11. data/lib/Miyako/API/diagram.rb +586 -561
  12. data/lib/Miyako/API/drawing.rb +151 -151
  13. data/lib/Miyako/API/exceptions.rb +105 -0
  14. data/lib/Miyako/API/fixedmap.rb +462 -428
  15. data/lib/Miyako/API/font.rb +430 -403
  16. data/lib/Miyako/API/input.rb +456 -447
  17. data/lib/Miyako/API/layout.rb +636 -433
  18. data/lib/Miyako/API/map.rb +583 -529
  19. data/lib/Miyako/API/map_event.rb +222 -198
  20. data/lib/Miyako/API/modules.rb +357 -109
  21. data/lib/Miyako/API/movie.rb +166 -154
  22. data/lib/Miyako/API/parts.rb +276 -189
  23. data/lib/Miyako/API/plane.rb +205 -166
  24. data/lib/Miyako/API/screen.rb +341 -325
  25. data/lib/Miyako/API/shape.rb +443 -443
  26. data/lib/Miyako/API/sprite.rb +771 -752
  27. data/lib/Miyako/API/sprite_animation.rb +490 -481
  28. data/lib/Miyako/API/sprite_list.rb +1135 -0
  29. data/lib/Miyako/API/spriteunit.rb +168 -147
  30. data/lib/Miyako/API/story.rb +350 -300
  31. data/lib/Miyako/API/textbox.rb +770 -725
  32. data/lib/Miyako/API/utility.rb +419 -388
  33. data/lib/Miyako/API/viewport.rb +189 -139
  34. data/lib/Miyako/API/yuki.rb +1226 -996
  35. data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
  36. data/lib/Miyako/EXT/raster_scroll.rb +138 -138
  37. data/lib/Miyako/EXT/slides.rb +157 -157
  38. data/lib/Miyako/miyako.rb +201 -171
  39. data/lib/Miyako/miyako_require_only.rb +35 -0
  40. data/miyako_basicdata.c +590 -590
  41. data/miyako_bitmap.c +1225 -1225
  42. data/miyako_collision.c +403 -403
  43. data/miyako_drawing.c +187 -187
  44. data/miyako_font.c +334 -334
  45. data/miyako_hsv.c +830 -830
  46. data/miyako_input_audio.c +254 -0
  47. data/miyako_layout.c +191 -191
  48. data/miyako_no_katana.c +1078 -1074
  49. data/miyako_sprite2.c +431 -0
  50. data/miyako_transform.c +438 -438
  51. data/miyako_utility.c +288 -288
  52. data/sample/Animation1/m1ku.rb +68 -68
  53. data/sample/Animation2/lex.rb +96 -96
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
  55. data/sample/Room3/blue.rb +297 -297
  56. data/sample/Room3/ending.rb +180 -180
  57. data/sample/Room3/green.rb +220 -220
  58. data/sample/Room3/main.rb +119 -119
  59. data/sample/Room3/main_component.rb +59 -59
  60. data/sample/Room3/red.rb +227 -227
  61. data/sample/Room3/room3.rb +25 -27
  62. data/sample/Room3/title.rb +184 -184
  63. data/sample/ball_action_sample.rb +204 -204
  64. data/sample/blit_rop.rb +70 -70
  65. data/sample/cairo_sample.rb +25 -25
  66. data/sample/circle_collision_test.rb +66 -66
  67. data/sample/collision_test.rb +33 -33
  68. data/sample/collision_test2.rb +108 -108
  69. data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
  70. data/sample/fixed_map_test/readme.txt +72 -72
  71. data/sample/map_test/chara.rb +58 -58
  72. data/sample/map_test/main_parts.rb +69 -69
  73. data/sample/map_test/main_scene.rb +153 -153
  74. data/sample/map_test/map_manager.rb +75 -75
  75. data/sample/map_test/map_test.rb +23 -23
  76. data/sample/map_test/oasis.rb +71 -71
  77. data/sample/map_test/readme.txt +89 -89
  78. data/sample/map_test/route.rb +157 -157
  79. data/sample/map_test/town.rb +74 -74
  80. data/sample/polygon_test.rb +35 -35
  81. data/sample/rasterscroll.rb +24 -24
  82. data/sample/takahashi.rb +42 -42
  83. data/sample/textbox_sample.rb +189 -189
  84. data/sample/transform.rb +54 -54
  85. data/sample/utility_test.rb +73 -73
  86. data/sample/utility_test2.rb +61 -61
  87. data/sample/utility_test3.rb +64 -64
  88. data/sample/utility_test4.rb +73 -73
  89. data/uninstall_miyako.rb +19 -19
  90. data/win/miyako_no_katana.so +0 -0
  91. metadata +7 -2
@@ -1,481 +1,490 @@
1
- # -*- encoding: utf-8 -*-
2
- =begin
3
- --
4
- Miyako v1.5
5
- Copyright (C) 2007-2009 Cyross Makoto
6
-
7
- This library is free software; you can redistribute it and/or
8
- modify it under the terms of the GNU Lesser General Public
9
- License as published by the Free Software Foundation; either
10
- version 2.1 of the License, or (at your option) any later version.
11
-
12
- This library is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- Lesser General Public License for more details.
16
-
17
- You should have received a copy of the GNU Lesser General Public
18
- License along with this library; if not, write to the Free Software
19
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- ++
21
- =end
22
-
23
- module Miyako
24
- #==アニメーション管理クラス
25
- #スプライトのアニメーションの構築・実行を管理するクラス
26
- class SpriteAnimation
27
- include SpriteBase
28
- include Animation
29
- include Layout
30
- include SingleEnumerable
31
-
32
- attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
33
-
34
- #===インスタンスの作成
35
- #アニメーションを行うための初期設定を行う。
36
- #アニメーションは2種類の方法があり、
37
- #
38
- #「一つのスプライトをow,ohプロパティで分割して、表示開始位置をずらすことでアニメーションを行う」方法と、
39
- #
40
- #(RPGのキャラチップを想定。 以降、「単体アニメーション」と呼ぶ)
41
- #
42
- #「複数枚のスプライトの配列を渡し、要素順に表示させることでアニメーションを行う」方法がある。
43
- #
44
- #(いわゆる「ぱらぱら漫画」方式。 以降、「配列アニメーション」と呼ぶ)
45
- #
46
- #「パターン番号」は、キャラクタパターン(画像を一定の大きさ(ow,oh)で切り分けた単位)の番号を意味する。
47
- #
48
- #単体アニメーションのときは、画像の左上から0,1,2,...と数える。
49
- #
50
- #配列アニメーションのときは、配列のインデックスがパターン番号となる。
51
- #
52
- #
53
- #
54
- #利用できるパラメータは以下の通り
55
- #
56
- #:sprite => sprite|spriteの配列 アニメーションさせるスプライト(インスタンス単体もしくはインスタンスの配列)。必須パラメータ
57
- #
58
- #:dir => :h|:v 単体アニメーションのとき、縦方向に位置をずらして表示させる(:h指定時)か、横方向か(:v指定時)を決定する。デフォルトは:h
59
- #
60
- #:pattern_list => 表示させるパターン番号を指定するための配列。配列の要素の順にパターンが表示される
61
- #
62
- #:loop => アニメーションを繰り返し更新するかどうかを示すフラグ。falseのときは、1回パターンを実行した後、アニメーションを終了する(true/false)
63
- #
64
- #_hash_:: パラメータ名とパラメータとのハッシュ
65
- #返却値:: 生成されたインスタンス
66
- def initialize(hash)
67
- init_layout
68
- @units = Array.new
69
- @slist = nil
70
-
71
- hash[:dir] ||= :h
72
- @dir = hash[:dir]
73
- s = hash[:sprite]
74
- hash[:pattern_list] ||= nil
75
- @plist = hash[:pattern_list]
76
- hash[:wait] ||= 0
77
- wait = hash[:wait]
78
- hash[:move_offset] ||= nil
79
- @move_offset = hash[:move_offset]
80
- hash[:position_offset] ||= nil
81
- @pos_offset = hash[:position_offset]
82
- hash[:align] ||= :max
83
- @align = hash[:align]
84
- hash[:loop] ||= true
85
- @loop = hash[:loop]
86
-
87
- @pat_len = 1
88
- @pat_olen = 1
89
- @chr_len = 1
90
- @chr_olen = 1
91
-
92
- @slist = Array.new
93
- if s.kind_of?(Sprite)
94
- @now = s.to_unit unless @now
95
- set_layout_size(s.ow, s.oh)
96
- move_to(s.x, s.y)
97
- s.snap(self)
98
- s.left
99
- s.top
100
- @pat_len = @dir == :h ? s.h : s.w
101
- @pat_olen = @dir == :h ? s.oh : s.ow
102
- @chr_len = @dir == :h ? s.w : s.h
103
- @chr_olen = @dir == :h ? s.ow : s.oh
104
- @pats = @pat_len / @pat_olen
105
- elsif s.kind_of?(Array)
106
- first = s[0]
107
- @now = first.to_unit unless @now
108
- set_layout_size(first.ow, first.oh)
109
- move_to(first.x, first.y)
110
- @slist = s.map{|ss|
111
- ss.snap(self)
112
- ss.left.top
113
- }
114
- @pat_len = @slist.length
115
- @pats = @slist.length
116
- else
117
- raise MiyakoError, "Illegal sprite list for SpriteAnimation."
118
- end
119
-
120
- if @plist
121
- if @align == :min
122
- @pats = @plist.length if @pats > @plist.length
123
- else
124
- @pats = @plist.length if @pats < @plist.length
125
- end
126
- else
127
- @plist = Array.new unless @plist
128
- end
129
-
130
- if @move_offset
131
- if @align == :min
132
- @pats = @move_offset.length if @pats > @move_offset.length
133
- else
134
- @pats = @move_offset.length if @pats < @move_offset.length
135
- end
136
- else
137
- @move_offset = Array.new
138
- end
139
-
140
- if @pos_offset
141
- if @align == :min
142
- @pats = @pos_offset.length if @pats > @pos_offset.length
143
- else
144
- @pats = @pos_offset.length if @pats < @pos_offset.length
145
- end
146
- else
147
- @pos_offset = Array.new
148
- end
149
-
150
- if wait.kind_of?(Array)
151
- @waits = wait.collect{|w| w.kind_of?(Float) ? WaitCounter.new(w) : w }
152
- if @align == :min
153
- @pats = @waits.length if @pats > @waits.length
154
- else
155
- @pats = @waits.length if @pats < @waits.length
156
- end
157
- else
158
- @waits = Array.new
159
- end
160
-
161
- if @plist.length == 0
162
- @pats.times{|p| @plist.push(p)}
163
- elsif @plist.length < @pats
164
- @plist = @plist.cycle.take(@pats)
165
- end
166
-
167
- if @slist.length == 0
168
- @slist = Array.new(@pats){|pat| s }
169
- @units = Array.new(@pats){|pat|
170
- u = @slist[pat].to_unit.dup
171
- px = pat % (@pat_len / @pat_olen)
172
- if @dir == :h
173
- u.oy = @slist[pat].oh * @plist[px]
174
- else
175
- u.ox = @slist[pat].ow * @plist[px]
176
- end
177
- u
178
- }
179
- elsif @slist.length < @pats
180
- tmp = @slist
181
- @slist = @slist.cycle.take(@pats)
182
- @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
183
- else
184
- @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
185
- end
186
-
187
- if @move_offset.length == 0
188
- @move_offset = Array.new(@pats){|pat| Point.new(0,0) }
189
- elsif @move_offset.length < @pats
190
- @move_offset = @move_offset.cycle.take(@pats)
191
- end
192
-
193
- if @pos_offset.length == 0
194
- @pos_offset = Array.new(@pats){|pat| 0 }
195
- elsif @pos_offset.length < @pats
196
- @pos_offset = @pos_offset.cycle.take(@pats)
197
- end
198
-
199
- if @waits.length == 0
200
- if wait.kind_of?(Integer)
201
- @waits = Array.new(@pats){|pat| wait}
202
- elsif wait.kind_of?(Float)
203
- @waits = Array.new(@pats){|pat| WaitCounter.new(wait)}
204
- else
205
- raise MiyakoError, "Illegal wait counter for SpriteAnimation."
206
- end
207
- elsif @waits.length < @pats
208
- @waits = @waits.cycle.take(@pats)
209
- end
210
-
211
- @chrs = @chr_len / @chr_olen
212
-
213
- @cnum = 0
214
- @pnum = 0
215
- @cnt = 0
216
- @exec = false
217
- @visible = true
218
-
219
- @now = @units[0]
220
- @now.move_to(@slist[@plist[@pnum]].x + @move_offset[@pnum][0],
221
- @slist[@plist[@pnum]].y + @move_offset[@pnum][1])
222
- end
223
-
224
- attr_accessor :visible
225
-
226
- #=== 現在表示しているスプライトの x 座標の値を取得する
227
- #返却値:: x 座標の値
228
- def x
229
- return @now.x
230
- end
231
-
232
- #=== 現在表示しているスプライトの y 座標の値を取得する
233
- #返却値:: y 座標の値
234
- def y
235
- return @now.y
236
- end
237
-
238
- #=== 現在表示しているスプライトの幅を取得する
239
- #返却値:: 現在表示しているスプライトの幅(ピクセル単位)
240
- def w
241
- return @now.ow
242
- end
243
-
244
- #=== 現在表示しているスプライトの高さを取得する
245
- #返却値:: 現在表示しているスプライトの高さ(ピクセル単位)
246
- def h
247
- return @now.oh
248
- end
249
-
250
- def update_layout_position #:nodoc:
251
- @units.each{|u| u.move_to(*@layout.pos)}
252
- end
253
-
254
- #===現在表示しているスプライトのowを取得する
255
- #返却値:: スプライトのow
256
- def ow
257
- return @now.ow
258
- end
259
-
260
- #===現在表示しているスプライトのohを取得する
261
- #返却値:: スプライトのoh
262
- def oh
263
- return @now.oh
264
- end
265
-
266
- #===表示するパターンの番号を変更する
267
- #_pnum_:: パターン番号
268
- def pattern=(pnum)
269
- @pnum = pnum if pnum < @pats
270
- set_pat
271
- @cnt = @waits[@plist[@pnum]] if @exec
272
- return self
273
- end
274
-
275
- #===現在表示しているパターンを取得する
276
- #返却値:: 現在表示しているスプライトのインスタンス
277
- def pattern
278
- return @plist[@pnum]
279
- end
280
-
281
- #===キャラクター番号を設定する
282
- #キャラクター番号(アニメーションさせるときに表示させるパターン群インデックス)
283
- #を設定する。範囲外のキャラクター番号が設定された時は何も行わない
284
- #_cnum_:: キャラクター番号
285
- def character=(cnum)
286
- return self if (cnum < 0 || cnum >= @chrs)
287
- @cnum = cnum
288
- set_chr
289
- end
290
-
291
- #===あとで書く
292
- #_d_:: あとで書く
293
- #返却値:: あとで書く
294
- def move_character(d)
295
- @cnum = (@cnum + d) % @chrs
296
- @cnum = @cnum + @chrs if @cnum < 0
297
- set_chr
298
- return self
299
- end
300
-
301
- #===現在のキャラクター番号を取得する
302
- #返却値:: キャラクター番号(0以上の整数)
303
- def character
304
- return @cnum
305
- end
306
-
307
- #===アニメーションを開始する
308
- #パターンがリセットされていないときは、一時停止から復帰した時と同じ動作をする
309
- #返却値:: 自分自身
310
- def start
311
- return self if @exec
312
- set_pat
313
- if @dir == :h
314
- @now.oy += @pos_offset[@pnum]
315
- else
316
- @now.ox += @pos_offset[@pnum]
317
- end
318
- @cnt = @waits[@plist[@pnum]]
319
- @cnt.start if @cnt.kind_of?(WaitCounter)
320
- @exec = true
321
- return self
322
- end
323
-
324
- #===アニメーションを停止する
325
- #停止しても、表示していたパターンはリセットされていない
326
- #返却値:: 自分自身
327
- def stop
328
- return self unless @exec
329
- if @dir == :h
330
- @now.oy -= @pos_offset[@pnum]
331
- else
332
- @now.ox -= @pos_offset[@pnum]
333
- end
334
- @cnt.stop if @cnt.kind_of?(WaitCounter)
335
- @exec = false
336
- return self
337
- end
338
-
339
- #===アニメーションの開始・停止を切り替える
340
- #返却値:: 自分自身
341
- def toggle_exec
342
- if @exec
343
- stop
344
- else
345
- start
346
- end
347
- return self
348
- end
349
-
350
- #===アニメーションの更新を行う
351
- #アニメーションのカウントをチェックし、カウントが終了したときは新しいパターンに切り替えて、カウントを開始する
352
- #すべてのパターンのアニメーションが終了すれば、最初のパターンに戻り、カウントを開始する
353
- #但し、インスタンス生成時に:loop->falseを設定していれば、アニメーションを終了する
354
- #返却値:: アニメーションパターンが切り替わればtrue、切り替わらないとき、アニメーションが終了したときはfalseを返す
355
- def update_animation
356
- end
357
-
358
- def update_frame #:nodoc:
359
- if @cnt > 0
360
- @cnt -= 1
361
- return false
362
- end
363
- @pnum = (@pnum + 1) % @pats
364
- if @loop == false && @pnum == 0
365
- stop
366
- return false
367
- end
368
- set_pat
369
- @cnt = @waits[@plist[@pnum]]
370
- return true
371
- end
372
-
373
- def update_wait_counter #:nodoc:
374
- return false if @cnt.waiting?
375
- @pnum = (@pnum + 1) % @pats
376
- if @loop == false && @pnum == 0
377
- stop
378
- return false
379
- end
380
- set_pat
381
- @cnt = @waits[@plist[@pnum]]
382
- @cnt.start
383
- return true
384
- end
385
-
386
- def set_pat #:nodoc:
387
- @now = @units[@plist[@pnum]]
388
- end
389
-
390
- def set_chr #:nodoc:
391
- @units.each{|u|
392
- if @dir == :h
393
- u.ox = @chr_olen * @cnum
394
- else
395
- u.oy = @chr_olen * @cnum
396
- end
397
- }
398
- end
399
-
400
- #===アニメーションのパターンをリセットする
401
- #返却値:: 自分自身
402
- def reset
403
- @pnum = 0
404
- @cnt = 0
405
- return self
406
- end
407
-
408
- #===アニメーションが実行中かを返す
409
- #返却値:: アニメーションが実行されていれば true
410
- def exec?
411
- return @exec
412
- end
413
-
414
- #===現在実行中のパターンの元になったスプライトユニットを返す
415
- #得られるインスタンスは複写していないので、インスタンスの値を調整するには、dupメソッドで複製する必要がある
416
- #返却値:: 現在表示しているスプライトユニット
417
- def to_unit
418
- return @now
419
- end
420
-
421
- #=== 現在実行中のパターンの画像を返す
422
- #返却値:: 現在表示している画像(bitmap)
423
- def bitmap
424
- return @now.bitmap
425
- end
426
-
427
- #===現在実行中のパターンの元になったインスタンスを返す
428
- #取得するパターンは、元になったインスタンスのto_spriteメソッドを呼び出した時の値となる
429
- #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
430
- #返却値:: 現在表示しているスプライト
431
- def to_sprite(&block)
432
- return @slist[@plist[@pnum]].to_sprite(&block)
433
- end
434
-
435
- #===現在表示しているスプライトの大きさを矩形で取得する
436
- #返却値:: 生成された矩形(Rect構造体のインスタンス)
437
- def rect
438
- return Rect.new(@now.x, @now.y, @now.ow, @now.oh)
439
- end
440
-
441
- #===現在表示しているスプライトの最大の大きさを矩形で取得する
442
- #現在のパターンの大きさと同じため、rectメソッドの値と同一となる
443
- #返却値:: 生成された矩形(Rect構造体のインスタンス)
444
- def broad_rect
445
- return self.rect
446
- end
447
-
448
- #===インスタンスに束縛されているオブジェクトを解放する
449
- def dispose
450
- @slist.clear
451
- @units.each{|u| u.bitmap = nil}
452
- @units.clear
453
- @waits.clear
454
- @plist.clear
455
- @move_offset.clear
456
- @pos_offset.clear
457
- end
458
-
459
- #===アニメーションの現在の画像を画面に描画する
460
- #転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。
461
- #画面の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。
462
- #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
463
- #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
464
- #ブロックの引数は、|インスタンスのSpriteUnit|となる。
465
- #visibleメソッドの値がfalseのときは描画されない。
466
- def render
467
- end
468
-
469
- #===アニメーションの現在の画像を画像に描画する
470
- #転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。
471
- #転送先の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。
472
- #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
473
- #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
474
- #ブロックの引数は、|インスタンスのSpriteUnit,転送先のSpriteUnit|となる。
475
- #visibleメソッドの値がfalseのときは描画されない。
476
- #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
477
- def render_to(dst)
478
- end
479
- end
480
- end
481
-
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ module Miyako
24
+ #==アニメーション管理クラス
25
+ #スプライトのアニメーションの構築・実行を管理するクラス
26
+ class SpriteAnimation
27
+ include SpriteBase
28
+ include Animation
29
+ include Layout
30
+ include SingleEnumerable
31
+
32
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
33
+
34
+ #===インスタンスの作成
35
+ #アニメーションを行うための初期設定を行う。
36
+ #アニメーションは2種類の方法があり、
37
+ #
38
+ #「一つのスプライトをow,ohプロパティで分割して、表示開始位置をずらすことでアニメーションを行う」方法と、
39
+ #
40
+ #(RPGのキャラチップを想定。 以降、「単体アニメーション」と呼ぶ)
41
+ #
42
+ #「複数枚のスプライトの配列を渡し、要素順に表示させることでアニメーションを行う」方法がある。
43
+ #
44
+ #(いわゆる「ぱらぱら漫画」方式。 以降、「配列アニメーション」と呼ぶ)
45
+ #
46
+ #「パターン番号」は、キャラクタパターン(画像を一定の大きさ(ow,oh)で切り分けた単位)の番号を意味する。
47
+ #
48
+ #単体アニメーションのときは、画像の左上から0,1,2,...と数える。
49
+ #
50
+ #配列アニメーションのときは、配列のインデックスがパターン番号となる。
51
+ #
52
+ #
53
+ #
54
+ #利用できるパラメータは以下の通り
55
+ #
56
+ #:sprite => sprite|spriteの配列 アニメーションさせるスプライト(インスタンス単体もしくはインスタンスの配列)。必須パラメータ
57
+ #
58
+ #:dir => :h|:v 単体アニメーションのとき、縦方向に位置をずらして表示させる(:h指定時)か、横方向か(:v指定時)を決定する。デフォルトは:h
59
+ #
60
+ #:pattern_list => 表示させるパターン番号を指定するための配列。配列の要素の順にパターンが表示される
61
+ #
62
+ #:loop => アニメーションを繰り返し更新するかどうかを示すフラグ。falseのときは、1回パターンを実行した後、アニメーションを終了する(true/false)
63
+ #
64
+ #_hash_:: パラメータ名とパラメータとのハッシュ
65
+ #返却値:: 生成されたインスタンス
66
+ def initialize(hash)
67
+ init_layout
68
+ @units = Array.new
69
+ @slist = nil
70
+
71
+ hash[:dir] ||= :h
72
+ @dir = hash[:dir]
73
+ s = hash[:sprite]
74
+ hash[:pattern_list] ||= nil
75
+ @plist = hash[:pattern_list]
76
+ hash[:wait] ||= 0
77
+ wait = hash[:wait]
78
+ hash[:move_offset] ||= nil
79
+ @move_offset = hash[:move_offset]
80
+ hash[:position_offset] ||= nil
81
+ @pos_offset = hash[:position_offset]
82
+ hash[:align] ||= :max
83
+ @align = hash[:align]
84
+ hash[:loop] ||= true
85
+ @loop = hash[:loop]
86
+
87
+ @pat_len = 1
88
+ @pat_olen = 1
89
+ @chr_len = 1
90
+ @chr_olen = 1
91
+
92
+ @slist = Array.new
93
+ if s.kind_of?(Sprite)
94
+ @now = s.to_unit unless @now
95
+ set_layout_size(s.ow, s.oh)
96
+ move_to!(s.x, s.y)
97
+ s.snap(self)
98
+ s.left!.top!
99
+ @pat_len = @dir == :h ? s.h : s.w
100
+ @pat_olen = @dir == :h ? s.oh : s.ow
101
+ @chr_len = @dir == :h ? s.w : s.h
102
+ @chr_olen = @dir == :h ? s.ow : s.oh
103
+ @pats = @pat_len / @pat_olen
104
+ elsif s.kind_of?(Array)
105
+ first = s[0]
106
+ @now = first.to_unit unless @now
107
+ set_layout_size(first.ow, first.oh)
108
+ move_to!(first.x, first.y)
109
+ @slist = s.map{|ss|
110
+ ss.snap(self)
111
+ ss.left!.top!
112
+ }
113
+ @pat_len = @slist.length
114
+ @pats = @slist.length
115
+ else
116
+ raise MiyakoTypeError, "Illegal sprite list for SpriteAnimation."
117
+ end
118
+
119
+ if @plist
120
+ if @align == :min
121
+ @pats = @plist.length if @pats > @plist.length
122
+ else
123
+ @pats = @plist.length if @pats < @plist.length
124
+ end
125
+ else
126
+ @plist = Array.new unless @plist
127
+ end
128
+
129
+ if @move_offset
130
+ if @align == :min
131
+ @pats = @move_offset.length if @pats > @move_offset.length
132
+ else
133
+ @pats = @move_offset.length if @pats < @move_offset.length
134
+ end
135
+ else
136
+ @move_offset = Array.new
137
+ end
138
+
139
+ if @pos_offset
140
+ if @align == :min
141
+ @pats = @pos_offset.length if @pats > @pos_offset.length
142
+ else
143
+ @pats = @pos_offset.length if @pats < @pos_offset.length
144
+ end
145
+ else
146
+ @pos_offset = Array.new
147
+ end
148
+
149
+ if wait.kind_of?(Array)
150
+ @waits = wait.collect{|w| w.kind_of?(Float) ? WaitCounter.new(w) : w }
151
+ if @align == :min
152
+ @pats = @waits.length if @pats > @waits.length
153
+ else
154
+ @pats = @waits.length if @pats < @waits.length
155
+ end
156
+ else
157
+ @waits = Array.new
158
+ end
159
+
160
+ if @plist.length == 0
161
+ @pats.times{|p| @plist.push(p)}
162
+ elsif @plist.length < @pats
163
+ @plist = @plist.cycle.take(@pats)
164
+ end
165
+
166
+ if @slist.length == 0
167
+ @slist = Array.new(@pats){|pat| s }
168
+ @units = Array.new(@pats){|pat|
169
+ u = @slist[pat].to_unit.dup
170
+ px = pat % (@pat_len / @pat_olen)
171
+ if @dir == :h
172
+ u.oy = @slist[pat].oh * @plist[px]
173
+ else
174
+ u.ox = @slist[pat].ow * @plist[px]
175
+ end
176
+ u
177
+ }
178
+ elsif @slist.length < @pats
179
+ tmp = @slist
180
+ @slist = @slist.cycle.take(@pats)
181
+ @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
182
+ else
183
+ @units = Array.new(@pats){|pat| @slist[pat].to_unit.dup }
184
+ end
185
+
186
+ if @move_offset.length == 0
187
+ @move_offset = Array.new(@pats){|pat| Point.new(0,0) }
188
+ elsif @move_offset.length < @pats
189
+ @move_offset = @move_offset.cycle.take(@pats)
190
+ end
191
+
192
+ if @pos_offset.length == 0
193
+ @pos_offset = Array.new(@pats){|pat| 0 }
194
+ elsif @pos_offset.length < @pats
195
+ @pos_offset = @pos_offset.cycle.take(@pats)
196
+ end
197
+
198
+ if @waits.length == 0
199
+ if wait.kind_of?(Integer)
200
+ @waits = Array.new(@pats){|pat| wait}
201
+ elsif wait.kind_of?(Float)
202
+ @waits = Array.new(@pats){|pat| WaitCounter.new(wait)}
203
+ else
204
+ raise MiyakoTypeError, "Illegal counter class for SpriteAnimation."
205
+ end
206
+ elsif @waits.length < @pats
207
+ @waits = @waits.cycle.take(@pats)
208
+ end
209
+
210
+ @chrs = @chr_len / @chr_olen
211
+
212
+ @cnum = 0
213
+ @pnum = 0
214
+ @cnt = 0
215
+ @exec = false
216
+ @visible = true
217
+
218
+ @now = @units[0]
219
+ @now.move_to!(@slist[@plist[@pnum]].x + @move_offset[@pnum][0],
220
+ @slist[@plist[@pnum]].y + @move_offset[@pnum][1])
221
+ end
222
+
223
+ def initialize_copy(obj) #:nodoc:
224
+ @units = @units.deep_dup
225
+ @slist = @slist.deep_dup
226
+ @plist = @plist.dup
227
+ @move_offset = @move_offset.dup
228
+ @pos_offset = @pos_offset.dup
229
+ @now = @units[@plist[@pnum]]
230
+ copy_layout
231
+ end
232
+
233
+ attr_accessor :visible
234
+
235
+ #=== 現在表示しているスプライトの x 座標の値を取得する
236
+ #返却値:: x 座標の値
237
+ def x
238
+ return @now.x
239
+ end
240
+
241
+ #=== 現在表示しているスプライトの y 座標の値を取得する
242
+ #返却値:: y 座標の値
243
+ def y
244
+ return @now.y
245
+ end
246
+
247
+ #=== 現在表示しているスプライトの幅を取得する
248
+ #返却値:: 現在表示しているスプライトの幅(ピクセル単位)
249
+ def w
250
+ return @now.ow
251
+ end
252
+
253
+ #=== 現在表示しているスプライトの高さを取得する
254
+ #返却値:: 現在表示しているスプライトの高さ(ピクセル単位)
255
+ def h
256
+ return @now.oh
257
+ end
258
+
259
+ def update_layout_position #:nodoc:
260
+ @units.each{|u| u.move_to!(*@layout.pos)}
261
+ end
262
+
263
+ #===現在表示しているスプライトのowを取得する
264
+ #返却値:: スプライトのow
265
+ def ow
266
+ return @now.ow
267
+ end
268
+
269
+ #===現在表示しているスプライトのohを取得する
270
+ #返却値:: スプライトのoh
271
+ def oh
272
+ return @now.oh
273
+ end
274
+
275
+ #===表示するパターンの番号を変更する
276
+ #_pnum_:: パターン番号
277
+ def pattern=(pnum)
278
+ @pnum = pnum if pnum < @pats
279
+ set_pat
280
+ @cnt = @waits[@plist[@pnum]] if @exec
281
+ return self
282
+ end
283
+
284
+ #===現在表示しているパターンを取得する
285
+ #返却値:: 現在表示しているスプライトのインスタンス
286
+ def pattern
287
+ return @plist[@pnum]
288
+ end
289
+
290
+ #===キャラクター番号を設定する
291
+ #キャラクター番号(アニメーションさせるときに表示させるパターン群インデックス)
292
+ #を設定する。範囲外のキャラクター番号が設定された時は何も行わない
293
+ #_cnum_:: キャラクター番号
294
+ def character=(cnum)
295
+ return self if (cnum < 0 || cnum >= @chrs)
296
+ @cnum = cnum
297
+ set_chr
298
+ end
299
+
300
+ #===あとで書く
301
+ #_d_:: あとで書く
302
+ #返却値:: あとで書く
303
+ def move_character(d)
304
+ @cnum = (@cnum + d) % @chrs
305
+ @cnum = @cnum + @chrs if @cnum < 0
306
+ set_chr
307
+ return self
308
+ end
309
+
310
+ #===現在のキャラクター番号を取得する
311
+ #返却値:: キャラクター番号(0以上の整数)
312
+ def character
313
+ return @cnum
314
+ end
315
+
316
+ #===アニメーションを開始する
317
+ #パターンがリセットされていないときは、一時停止から復帰した時と同じ動作をする
318
+ #返却値:: 自分自身
319
+ def start
320
+ return self if @exec
321
+ set_pat
322
+ if @dir == :h
323
+ @now.oy += @pos_offset[@pnum]
324
+ else
325
+ @now.ox += @pos_offset[@pnum]
326
+ end
327
+ @cnt = @waits[@plist[@pnum]]
328
+ @cnt.start if @cnt.kind_of?(WaitCounter)
329
+ @exec = true
330
+ return self
331
+ end
332
+
333
+ #===アニメーションを停止する
334
+ #停止しても、表示していたパターンはリセットされていない
335
+ #返却値:: 自分自身
336
+ def stop
337
+ return self unless @exec
338
+ if @dir == :h
339
+ @now.oy -= @pos_offset[@pnum]
340
+ else
341
+ @now.ox -= @pos_offset[@pnum]
342
+ end
343
+ @cnt.stop if @cnt.kind_of?(WaitCounter)
344
+ @exec = false
345
+ return self
346
+ end
347
+
348
+ #===アニメーションの開始・停止を切り替える
349
+ #返却値:: 自分自身
350
+ def toggle_exec
351
+ if @exec
352
+ stop
353
+ else
354
+ start
355
+ end
356
+ return self
357
+ end
358
+
359
+ #===アニメーションの更新を行う
360
+ #アニメーションのカウントをチェックし、カウントが終了したときは新しいパターンに切り替えて、カウントを開始する
361
+ #すべてのパターンのアニメーションが終了すれば、最初のパターンに戻り、カウントを開始する
362
+ #但し、インスタンス生成時に:loop->falseを設定していれば、アニメーションを終了する
363
+ #返却値:: アニメーションパターンが切り替わればtrue、切り替わらないとき、アニメーションが終了したときはfalseを返す
364
+ def update_animation
365
+ end
366
+
367
+ def update_frame #:nodoc:
368
+ if @cnt > 0
369
+ @cnt -= 1
370
+ return false
371
+ end
372
+ @pnum = (@pnum + 1) % @pats
373
+ if @loop == false && @pnum == 0
374
+ stop
375
+ return false
376
+ end
377
+ set_pat
378
+ @cnt = @waits[@plist[@pnum]]
379
+ return true
380
+ end
381
+
382
+ def update_wait_counter #:nodoc:
383
+ return false if @cnt.waiting?
384
+ @pnum = (@pnum + 1) % @pats
385
+ if @loop == false && @pnum == 0
386
+ stop
387
+ return false
388
+ end
389
+ set_pat
390
+ @cnt = @waits[@plist[@pnum]]
391
+ @cnt.start
392
+ return true
393
+ end
394
+
395
+ def set_pat #:nodoc:
396
+ @now = @units[@plist[@pnum]]
397
+ end
398
+
399
+ def set_chr #:nodoc:
400
+ @units.each{|u|
401
+ if @dir == :h
402
+ u.ox = @chr_olen * @cnum
403
+ else
404
+ u.oy = @chr_olen * @cnum
405
+ end
406
+ }
407
+ end
408
+
409
+ #===アニメーションのパターンをリセットする
410
+ #返却値:: 自分自身
411
+ def reset
412
+ @pnum = 0
413
+ @cnt = 0
414
+ return self
415
+ end
416
+
417
+ #===アニメーションが実行中かを返す
418
+ #返却値:: アニメーションが実行されていれば true
419
+ def exec?
420
+ return @exec
421
+ end
422
+
423
+ #===現在実行中のパターンの元になったスプライトユニットを返す
424
+ #得られるインスタンスは内部でしようしてるものの複写
425
+ #返却値:: 現在表示しているスプライトユニット
426
+ def to_unit
427
+ return @now.dup
428
+ end
429
+
430
+ #=== 現在実行中のパターンの画像を返す
431
+ #返却値:: 現在表示している画像(bitmap)
432
+ def bitmap
433
+ return @now.bitmap
434
+ end
435
+
436
+ #===現在実行中のパターンの元になったインスタンスを返す
437
+ #取得するパターンは、元になったインスタンスのto_spriteメソッドを呼び出した時の値となる
438
+ #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
439
+ #返却値:: 現在表示しているスプライト
440
+ def to_sprite(&block)
441
+ return @slist[@plist[@pnum]].to_sprite(&block)
442
+ end
443
+
444
+ #===現在表示しているスプライトの大きさを矩形で取得する
445
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
446
+ def rect
447
+ return Rect.new(@now.x, @now.y, @now.ow, @now.oh)
448
+ end
449
+
450
+ #===現在表示しているスプライトの最大の大きさを矩形で取得する
451
+ #現在のパターンの大きさと同じため、rectメソッドの値と同一となる
452
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
453
+ def broad_rect
454
+ return self.rect
455
+ end
456
+
457
+ #===インスタンスに束縛されているオブジェクトを解放する
458
+ def dispose
459
+ @slist.clear
460
+ @units.each{|u| u.bitmap = nil}
461
+ @units.clear
462
+ @waits.clear
463
+ @plist.clear
464
+ @move_offset.clear
465
+ @pos_offset.clear
466
+ end
467
+
468
+ #===アニメーションの現在の画像を画面に描画する
469
+ #転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。
470
+ #画面の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。
471
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
472
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
473
+ #ブロックの引数は、|インスタンスのSpriteUnit|となる。
474
+ #visibleメソッドの値がfalseのときは描画されない。
475
+ def render
476
+ end
477
+
478
+ #===アニメーションの現在の画像を画像に描画する
479
+ #転送元の描画範囲は、src側SpriteUnitの(ox,oy)を起点に、src側(ow,oh)の範囲で転送する。
480
+ #転送先の描画範囲は、src側SpriteUnitの(x,y)を起点に設定にする。
481
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る)
482
+ #(ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない)
483
+ #ブロックの引数は、|インスタンスのSpriteUnit,転送先のSpriteUnit|となる。
484
+ #visibleメソッドの値がfalseのときは描画されない。
485
+ #_dst_:: 転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)
486
+ def render_to(dst)
487
+ end
488
+ end
489
+ end
490
+