cyross-ruby-miyako-mswin32 2.0.5.1.1 → 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 (76) hide show
  1. data/README +1089 -929
  2. data/install_miyako.rb +87 -61
  3. data/lib/Miyako/API/audio.rb +572 -198
  4. data/lib/Miyako/API/basic_data.rb +825 -573
  5. data/lib/Miyako/API/bitmap.rb +534 -507
  6. data/lib/Miyako/API/choices.rb +481 -475
  7. data/lib/Miyako/API/collision.rb +486 -460
  8. data/lib/Miyako/API/diagram.rb +586 -561
  9. data/lib/Miyako/API/drawing.rb +151 -151
  10. data/lib/Miyako/API/exceptions.rb +105 -0
  11. data/lib/Miyako/API/fixedmap.rb +462 -428
  12. data/lib/Miyako/API/font.rb +430 -403
  13. data/lib/Miyako/API/input.rb +456 -447
  14. data/lib/Miyako/API/layout.rb +636 -433
  15. data/lib/Miyako/API/map.rb +583 -529
  16. data/lib/Miyako/API/map_event.rb +222 -198
  17. data/lib/Miyako/API/modules.rb +305 -109
  18. data/lib/Miyako/API/movie.rb +166 -154
  19. data/lib/Miyako/API/parts.rb +276 -189
  20. data/lib/Miyako/API/plane.rb +205 -166
  21. data/lib/Miyako/API/screen.rb +341 -325
  22. data/lib/Miyako/API/shape.rb +443 -443
  23. data/lib/Miyako/API/sprite.rb +771 -752
  24. data/lib/Miyako/API/sprite_animation.rb +490 -481
  25. data/lib/Miyako/API/sprite_list.rb +884 -0
  26. data/lib/Miyako/API/spriteunit.rb +168 -147
  27. data/lib/Miyako/API/story.rb +350 -300
  28. data/lib/Miyako/API/textbox.rb +770 -725
  29. data/lib/Miyako/API/utility.rb +419 -388
  30. data/lib/Miyako/API/viewport.rb +189 -139
  31. data/lib/Miyako/API/yuki.rb +1226 -996
  32. data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
  33. data/lib/Miyako/EXT/raster_scroll.rb +138 -138
  34. data/lib/Miyako/EXT/slides.rb +157 -157
  35. data/lib/Miyako/miyako.rb +201 -171
  36. data/lib/Miyako/miyako_no_katana.so +0 -0
  37. data/lib/Miyako/miyako_require_only.rb +35 -0
  38. data/sample/Animation1/m1ku.rb +68 -68
  39. data/sample/Animation2/lex.rb +96 -96
  40. data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
  41. data/sample/Room3/blue.rb +297 -297
  42. data/sample/Room3/ending.rb +180 -180
  43. data/sample/Room3/green.rb +220 -220
  44. data/sample/Room3/main.rb +119 -119
  45. data/sample/Room3/main_component.rb +59 -59
  46. data/sample/Room3/red.rb +227 -227
  47. data/sample/Room3/room3.rb +25 -27
  48. data/sample/Room3/title.rb +184 -184
  49. data/sample/ball_action_sample.rb +205 -204
  50. data/sample/blit_rop.rb +70 -70
  51. data/sample/cairo_sample.rb +25 -25
  52. data/sample/circle_collision_test.rb +66 -62
  53. data/sample/collision_test.rb +33 -33
  54. data/sample/collision_test2.rb +108 -104
  55. data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
  56. data/sample/fixed_map_test/readme.txt +72 -72
  57. data/sample/map_test/chara.rb +58 -58
  58. data/sample/map_test/main_parts.rb +69 -69
  59. data/sample/map_test/main_scene.rb +153 -153
  60. data/sample/map_test/map_manager.rb +75 -75
  61. data/sample/map_test/map_test.rb +23 -23
  62. data/sample/map_test/oasis.rb +71 -71
  63. data/sample/map_test/readme.txt +89 -89
  64. data/sample/map_test/route.rb +157 -157
  65. data/sample/map_test/town.rb +74 -74
  66. data/sample/polygon_test.rb +35 -35
  67. data/sample/rasterscroll.rb +24 -24
  68. data/sample/takahashi.rb +42 -42
  69. data/sample/textbox_sample.rb +189 -189
  70. data/sample/transform.rb +54 -54
  71. data/sample/utility_test.rb +73 -73
  72. data/sample/utility_test2.rb +61 -61
  73. data/sample/utility_test3.rb +64 -64
  74. data/sample/utility_test4.rb +73 -73
  75. data/uninstall_miyako.rb +19 -19
  76. metadata +5 -2
@@ -0,0 +1,884 @@
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
+ # スプライト関連クラス群
24
+ module Miyako
25
+ #==名前-本体ペアを構成する構造体用クラス
26
+ class ListPairStruct < Struct
27
+ # 構造体を配列に変換する
28
+ def to_ary
29
+ [self[0], self[1]]
30
+ end
31
+
32
+ # 構造体を配列に変換する
33
+ def to_a
34
+ self.to_ary
35
+ end
36
+
37
+ # 構造体を文字列に変換する
38
+ def to_s
39
+ "#{self[0]} : #{self[1]}"
40
+ end
41
+ end
42
+
43
+ #===名前-本体ペアを構成する構造体
44
+ #ハッシュのようにキー・バリュー構成を持たせるための構造体
45
+ #_name_:: 名前
46
+ #_body_:: 本体
47
+ ListPair = Struct.new(:name, :body)
48
+
49
+ #==複数スプライト管理(リスト)クラス
50
+ #複数のスプライトを、[名前,インスタンス]の一対一のリストとして持っておく。
51
+ #値の並びの基準は、名前の並びを配列にしたときのもの(SpriteList#valuesの値)に対応する
52
+ #Enumerableからmixinされたメソッド、Array・Hashクラスで使用されている一部メソッド、
53
+ #swapなどの独自メソッドを追加している
54
+ #(Enumerableからmixinされたメソッドでは、ブロック引数に[名前,インスタンス]の配列として渡される)
55
+ #render、render_toを用意し、一気に描画が可能。
56
+ #名前は配列として管理している。render時には、名前の順番に描画される。
57
+ #各要素のレイアウトは関与していない(そこがPartsとの違い)
58
+ #また、このクラスインスタンスのdup、cloneはディープコピー(配列の要素も複写)となっていることに注意。
59
+ class SpriteList
60
+ include SpriteBase
61
+ include Animation
62
+ include Enumerable
63
+
64
+ attr_accessor :visible
65
+
66
+ #===ハッシュを元にSpriteListを生成する
67
+ #ハッシュのキーをスプライト名にして生成する
68
+ #_hash_:: 生成元のハッシュ
69
+ #返却値:: 生成したインスタンス
70
+ def SpriteList.[](hash)
71
+ body = SpriteList.new
72
+ hash.each{|k, v| body.push(k ,v)}
73
+ end
74
+
75
+ #===ハッシュを元にSpriteListを生成する
76
+ #引数を省略すると空のSpriteListを生成する。
77
+ #要素が[スプライト名,スプライト]の配列となる配列を引数として渡すこともできる。
78
+ #ハッシュを引数として渡すと、キーをスプライト名とするSpriteListを生成する。
79
+ #_pairs_:: 生成元のインスタンス
80
+ #返却値:: 生成したインスタンス
81
+ def initialize(pairs = nil)
82
+ @names = []
83
+ @n2v = {}
84
+ if pairs.is_a?(Array)
85
+ pairs.each{|pair|
86
+ @names << pair[0]
87
+ @n2v[pair[0]] = ListPair.new(*pair)
88
+ }
89
+ elsif pairs.is_a?(Hash)
90
+ pairs.each{|key, value|
91
+ @names << key
92
+ @n2v[key] = ListPair.new(key, value)
93
+ }
94
+ end
95
+ @visible = true
96
+ end
97
+
98
+ #===内部で使用している配列などを新しいインスタンスに置き換える
99
+ #initialize_copy用で元・新インスタンスで配列などを共用している場合に対応
100
+ def reflesh
101
+ @names = []
102
+ @n2v = {}
103
+ end
104
+
105
+ def initialize_copy(obj) #:nodoc:
106
+ reflesh
107
+ obj.names.each{|name| self.push([name, obj[name].deep_dup]) }
108
+ @visible = obj.visible
109
+ end
110
+
111
+ #===スプライト以外のインスタンスを削除したSpriteListを生成する
112
+ #新しいSpriteListを作成し、本体がnilや、SpriteBaseもしくはSpritArrayモジュールを
113
+ #mixinしていない対を削除する。
114
+ #返却値:: 新しく生成したインスタンス
115
+ def sprite_only
116
+ ret = self.dup
117
+ ret.names.each{|name|
118
+ ret.delete(name) if !ret[name].class.include?(SpriteBase) &&
119
+ !ret[name].class.include?(SpriteArray)
120
+ }
121
+ return ret
122
+ end
123
+
124
+ #===スプライト以外のインスタンスを破壊的に削除する
125
+ #自分自身から、本体がnilや、SpriteBaseもしくはSpritArrayモジュールを
126
+ #mixinしていない対を削除する。
127
+ #返却値:: 自分自身を帰す
128
+ def sprite_only!
129
+ @names.each{|name|
130
+ if !@n2v[name].class.include?(SpriteBase) &&
131
+ !ret[name].class.include?(SpriteArray)
132
+ @n2v.delete(name)
133
+ @names.delete(name)
134
+ end
135
+ }
136
+ return self
137
+ end
138
+
139
+ #===ブロックを受け取り、リストの各要素にたいして処理を行う
140
+ #ブロック引数には、|[スプライト名,スプライト本体]|が渡ってくる
141
+ #名前が登録されている順に渡ってくる
142
+ #返却値:: 自分自身を帰す
143
+ def each
144
+ self.to_a.each{|pair| yield pair}
145
+ end
146
+
147
+ #===ブロックを受け取り、スプライト名リストの各要素にたいして処理を行う
148
+ #ブロック引数には、|スプライト名,スプライト本体|が渡ってくる
149
+ #名前が登録されている順に渡ってくる
150
+ #返却値:: 自分自身を帰す
151
+ def each_pair
152
+ @names.each{|name| yield *@n2v[name]}
153
+ end
154
+
155
+ #===ブロックを受け取り、名前リストの各要素にたいして処理を行う
156
+ #ブロック引数には、|スプライト名|が渡ってくる
157
+ #名前が登録されている順に渡ってくる
158
+ #返却値:: 自分自身を帰す
159
+ def each_name
160
+ @names.each{|name| yield name}
161
+ end
162
+
163
+ #===ブロックを受け取り、値リストの各要素にたいして処理を行う
164
+ #ブロック引数には、|スプライト本体|の配列として渡ってくる
165
+ #名前が登録されている順に渡ってくる
166
+ #返却値:: 自分自身を帰す
167
+ def each_value
168
+ @names.each{|name| yield @n2v[name].body}
169
+ end
170
+
171
+ #===ブロックを受け取り、配列インデックスにたいして処理を行う
172
+ #ブロック引数には、|スプライト名に対応する配列インデックス|の配列として渡ってくる
173
+ #0,1,2,...の順に渡ってくる
174
+ #返却値:: 自分自身を帰す
175
+ def each_index
176
+ @names.length.times{|idx| yield idx}
177
+ end
178
+
179
+ #===スプライト名配列を取得する
180
+ #名前が登録されている順に渡ってくる
181
+ #返却値:: スプライト名配列
182
+ def names
183
+ @names
184
+ end
185
+
186
+ #===スプライト配列を取得する
187
+ #名前が登録されている順に渡ってくる
188
+ #返却値:: スプライト本体配列
189
+ def values
190
+ @names.map{|name| @n2v[name].body}
191
+ end
192
+
193
+ #===名前-本体ペア配列を取得する
194
+ #名前が登録されている順にListPair構造体の構造体を構成して返す
195
+ #返却値:: ListPair構造体の配列
196
+ def pairs
197
+ @names.map{|name| @n2v[name].body}
198
+ end
199
+
200
+ #===リストが空っぽかどうか確かめる
201
+ #リストに何も登録されていないかどうか確かめる
202
+ #返却値:: 空っぽの時はtrue、なにか登録されているときはfalse
203
+ def empty?
204
+ @names.empty?
205
+ end
206
+
207
+ #===内容が同じかどうか比較する
208
+ #リストに含まれるスプライト名(順番も)・値が同じかどうか比較する
209
+ #返却値:: 同じときはtrue、違うときはfalseを返す
210
+ def eql?(other)
211
+ @names.map{|name|
212
+ self.index(name) == other.index(name) &&
213
+ @n2v[name].body.eql?(other[name].body)
214
+ }.all?
215
+ end
216
+
217
+ #===リストに名前が登録されているか確認する
218
+ #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
219
+ #(include?メソッドと同じ)
220
+ #_name_:: 検索対象の名前
221
+ #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
222
+ def has_name?(name)
223
+ @n2v.has_key?(name)
224
+ end
225
+
226
+ #===リストに名前が登録されているか確認する
227
+ #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
228
+ #(has_name?メソッドと同じ)
229
+ #_name_:: 検索対象の名前
230
+ #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
231
+ def include?(name)
232
+ @names.has_key?(name)
233
+ end
234
+
235
+ #===リストにスプライトが登録されているか確認する
236
+ #スプライトリスト内に、引数で指定したスプライトが含まれているか調べる
237
+ #_value_:: 検索対象のスプライト
238
+ #返却値:: スプライトが含まれていればtrue、含まれていなければfalseと返す
239
+ def has_value?(value)
240
+ @n2v.values.has_value?(value)
241
+ end
242
+
243
+ #===リストの長さを求める
244
+ #スプライトの登録数(リストの要素数)を返す
245
+ #(sizeメソッドと同じ)
246
+ #返却値:: リストの要素数(殻のときは0)
247
+ def length
248
+ @names.length
249
+ end
250
+
251
+ #===リストの長さを求める
252
+ #スプライトの登録数(リストの要素数)を返す
253
+ #(lengthメソッドと同じ)
254
+ #返却値:: リストの要素数(殻のときは0)
255
+ def size
256
+ @names.size
257
+ end
258
+
259
+ #===スプライト名を探し、あればその対を返す
260
+ #引数で渡された名前を元に、リストから探し出す。
261
+ #(内部でHash#assocを呼び出し)
262
+ #_name_:: 検索対象のスプライト名
263
+ #返却値:: 見つかればListPair構造体、無ければnil
264
+ def assoc(name)
265
+ @n2v.assoc(name)
266
+ end
267
+
268
+ #===スプライトが登録されている名前を求める
269
+ #実際のスプライト本体から、登録されているスプライトを探す。
270
+ #見つかれば、それに対応する名前を返す。
271
+ #(内部でHash#keyメソッドを呼び出している)
272
+ #_name_:: 検索対象のスプライト名
273
+ #返却値:: 名前が見つかったときはそのスプライト名、無ければnil
274
+ def name(value)
275
+ @n2v.key(value)
276
+ end
277
+
278
+ #===名前が何番目にあるかを求める
279
+ #スプライト名リスト中、指定したスプライト名のインデックスを求める
280
+ #(内部でHash#indexメソッドを呼び出している)
281
+ #_name_:: 検索対象のスプライト名
282
+ #返却値:: 名前が見つかったときはそのインデックス(0以上の整数)、無ければnil
283
+ def index(name)
284
+ @names.index(name)
285
+ end
286
+
287
+ #===リストの先頭要素を求める
288
+ #リストの先頭からn要素をSpriteListとして返す。
289
+ #リストが空のとき、nが0のときはnilを返す
290
+ #_n_:: 先頭からの数。省略時は1
291
+ #返却値:: 先頭からn個の要素を設定したSpriteList
292
+ def first(n=1)
293
+ return nil if @names.empty?
294
+ return nil if n == 0
295
+ SpriteList.new(@names.first(n).map{|name| [name, @n2v[name]]})
296
+ end
297
+
298
+ #===リストの終端要素を求める
299
+ #リストの終端からn要素をSpriteListとして返す。
300
+ #リストが空のとき、nが0のときはnilを返す
301
+ #_n_:: 終端からの数。省略時は1
302
+ #返却値:: 終端からn個の要素を設定したSpriteList
303
+ def last(n=1)
304
+ return nil if @names.empty?
305
+ return nil if n == 0
306
+ SpriteList.new(@names.last(n).map{|name| [name, @n2v[name]]})
307
+ end
308
+
309
+ #===名前・スプライトの対を登録する
310
+ #リストに名前・スプライトをリストの後ろに追加する
311
+ #効果はSpriteList#pushと同じ
312
+ #_pair_:: 名前とスプライトの対。[name,sprite]として渡す
313
+ #返却値:: 追加した自分自身を渡す
314
+ def <<(pair)
315
+ self.push(pair)
316
+ end
317
+
318
+ #===引数と自分自身との和集合を取る
319
+ #otherと自分自身で一方でも割り付けられた名前の本体のみ登録する(方法はpush・addと同じ)
320
+ #名前がバッティングしたときは引数の本体を優先する
321
+ #_other_:: 計算をするSpriteList
322
+ #返却値:: 変更を加えた自分自身の複製
323
+ def +(other)
324
+ list = self.dup
325
+ other.to_a.each{|pair| list.add(pair)}
326
+ list
327
+ end
328
+
329
+ #===引数と自分自身との積集合を取る
330
+ #otherと自分自身で両方割り付けられた名前のみ登録されたリストを生成する
331
+ #内容は自分自身の本体を割り当てる
332
+ #_other_:: 計算をするSpriteList
333
+ #返却値:: 変更を加えた自分自身の複製
334
+ def *(other)
335
+ list = SpriteList.new
336
+ self.to_a.each{|pair| list.add(pair) if other.has_key?(pair[0])}
337
+ list
338
+ end
339
+
340
+ #===引数と自分自身との差集合を取る
341
+ #otherと自分自身で両方割り付けられた名前を取り除いたリストを生成する
342
+ #_other_:: 計算をするSpriteList
343
+ #返却値:: 変更を加えた自分自身の複製
344
+ def -(other)
345
+ list = SpriteList.new
346
+ self.to_a.each{|pair| list.add(pair) unless other.has_key?(pair[0])}
347
+ list
348
+ end
349
+
350
+ #===引数と自分自身とのANDを取る
351
+ #方法は積集合と同じ(#*参照)
352
+ #_other_:: 計算をするSpriteList
353
+ #返却値:: 変更を加えた自分自身の複製
354
+ def &(other)
355
+ self * other
356
+ end
357
+
358
+ #===引数と自分自身とのORを取る
359
+ #方法は和集合と同じ(#+参照)
360
+ #_other_:: 計算をするSpriteList
361
+ #返却値:: 変更を加えた自分自身の複製
362
+ def |(other)
363
+ self + other
364
+ end
365
+
366
+ #===引数と内容が同じかどうかを確認する
367
+ #方法は#eql?と同じ(#eql?参照)
368
+ #_other_:: 比較元SpriteList
369
+ #返却値:: 同じ内容ならばtrue,違ったらfalseを返す
370
+ def ==(other)
371
+ self.eql?(other)
372
+ end
373
+
374
+ #===名前・スプライトを登録する
375
+ #リストに名前・スプライトをリストの後ろに追加する
376
+ #効果はSpriteList#push,<<と同じ
377
+ #_name_:: スプライト名
378
+ #_sprite_:: スプライト本体
379
+ #返却値:: 追加した自分自身を渡す
380
+ def add(name, sprite)
381
+ self.push([name, sprite])
382
+ end
383
+
384
+ #===名前・スプライトの対を登録する
385
+ #リストに名前・スプライトをリストの後ろに追加する
386
+ #効果はSpriteList#addと同じだが、複数の対を登録できることが特徴
387
+ #(例)push([name1,sprite1])
388
+ # push([name1,sprite1],[name2,sprite2])
389
+ #_pairs_:: 名前とスプライトの対を配列にしたもの。対は、[name,sprite]として渡す。
390
+ #返却値:: 追加した自分自身を渡す
391
+ def push(*pairs)
392
+ pairs.each{|name, sprite|
393
+ unless sprite.class.include?(SpriteBase) || sprite.class.include?(SpriteArray)
394
+ raise MiyakoValueError, "Illegal Sprite!"
395
+ end
396
+ @names.delete(name) if @names.include?(name)
397
+ @names << name
398
+ @n2v[name] = ListPair.new(name, sprite)
399
+ }
400
+ return self
401
+ end
402
+
403
+ #===リストの終端から名前・スプライトの対を取り出す
404
+ #リストに名前・スプライトをリストの終端から取り除いて、取り除いた対を返す
405
+ #返却値:: 終端にあった名前に対応するListPair構造体
406
+ def pop
407
+ return nil if @names.empty?
408
+ name = @names.pop
409
+ @n2v.delete(name)
410
+ end
411
+
412
+ #===名前・スプライトを登録する
413
+ #リストに名前・スプライトをリストの先頭に追加する
414
+ #(先頭に追加することがSpriteList#<<,add,pushとの違い
415
+ #_name_:: スプライト名
416
+ #_sprite_:: スプライト本体
417
+ #返却値:: 追加した自分自身を渡す
418
+ def unshift(name, sprite)
419
+ @names.delete(name) if @names.include?(name)
420
+ @names.unshift(name)
421
+ @n2v[name] = ListPair.new(name, sprite)
422
+ return self
423
+ end
424
+
425
+ def slice(*names)
426
+ list = self.to_a
427
+ names.map{|name|
428
+ next nil unless @names.include?(name)
429
+ ListPair.new(name, @n2v[name])
430
+ }
431
+ end
432
+
433
+ def slice!(*names)
434
+ self.delete_if!{|name, sprite| !names.include?(name)}
435
+ end
436
+
437
+ def shift(n = nil)
438
+ return nil if @names.empty?
439
+ if n
440
+ names = @names.shift(n)
441
+ return names.map{|name| @n2v.delete(name)}
442
+ else
443
+ name = @names.shift
444
+ return @n2v.delete(name)
445
+ end
446
+ end
447
+
448
+ def delete(name)
449
+ return nil unless @names.include?(name)
450
+ @names.delete(name)
451
+ @n2v.delete(name)
452
+ end
453
+
454
+ def delete_at(idx)
455
+ self.delete(@names[idx])
456
+ end
457
+
458
+ def delete_if
459
+ ret = self.deep_dup
460
+ ret.each{|pair| ret.delete(pair[0]) if yield(*pair)}
461
+ ret
462
+ end
463
+
464
+ def reject
465
+ ret = self.deep_dup
466
+ ret.each{|pair| ret.delete(pair[0]) if yield(*pair)}
467
+ ret
468
+ end
469
+
470
+ def delete_if!
471
+ self.each{|pair| self.delete(pair[0]) if yield(*pair)}
472
+ self
473
+ end
474
+
475
+ def reject!
476
+ self.each{|pair| self.delete(pair[0]) if yield(*pair)}
477
+ self
478
+ end
479
+
480
+ def compact
481
+ ret.delete_if{|pair| pair[1].nil?}
482
+ end
483
+
484
+ def compact!
485
+ ret.delete_if!{|pair| pair[1].nil?}
486
+ end
487
+
488
+ def concat(other)
489
+ other.to_a.each{|pair| self.add(pair)}
490
+ end
491
+
492
+ #===引数と自分自身との結果をマージする
493
+ #otherで割り付けられた名前のうち、自分では登録されていないものは新規登録する(方法はpushと同じ)
494
+ #名前がバッティングしたときは自分自身の本体を優先する
495
+ #_other_:: マージするSpriteList
496
+ #返却値:: 変更を加えた自分自身の複製
497
+ def merge(other)
498
+ ret = other.dup + self
499
+ ret.names.each{|name| yield name, self[name], other[name] } if block_given?
500
+ ret
501
+ end
502
+
503
+ #===自分自身と引数との結果を破壊的にマージする
504
+ #otherで割り付けられた名前のうち、自分では登録されていないものは新規登録する(方法はpushと同じ)
505
+ #名前がバッティングしたときは自分自身の本体を優先する
506
+ #_other_:: マージするSpriteList
507
+ #返却値:: 変更された自分自身
508
+ def merge!(other)
509
+ self.replace(other+self)
510
+ self.names.each{|name| yield name, self[name], other[name] } if block_given?
511
+ self
512
+ end
513
+
514
+ #===名前-スプライトの対を繰り返し取得する
515
+ #インスタンスを配列化し、周回して要素を取得できるEnumeratorを生成する
516
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).cycle
517
+ # =>pair(:a),pair(:b),pair(:c),pair(:a),pair(:b),pair(:c),pair(:a)...
518
+ #返却値:: 生成されたEnumerator
519
+ def cycle(&block)
520
+ self.to_a.cycle(&block)
521
+ end
522
+
523
+ #===名前の順番をシャッフルしたSpriteListを返す
524
+ #自分自身を複製し、登録されている名前の順番をシャッフルして返す
525
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
526
+ # a.shuffle
527
+ # =>SpriteList(pair(:a),pair(:b),pair(:c)) or SpriteList(pair(:a),pair(:c),pair(:b)) or
528
+ # SpriteList(pair(:b),pair(:a),pair(:c)) or SpriteList(pair(:b),pair(:c),pair(:a)) or
529
+ # SpriteList(pair(:c),pair(:a),pair(:b)) or SpriteList(pair(:c),pair(:b),pair(:a))
530
+ # a=SpriteList(pair(:a),pair(:b),pair(:c))
531
+ #返却値:: シャッフルした自分自身の複製
532
+ def shuffle
533
+ self.dup.shuffle!
534
+ end
535
+
536
+ #===名前の順番をシャッフルする
537
+ #自分自身で登録されている名前の順番をシャッフルする
538
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
539
+ # a.shuffle!
540
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c)) or SpriteList(pair(:a),pair(:c),pair(:b)) or
541
+ # SpriteList(pair(:b),pair(:a),pair(:c)) or SpriteList(pair(:b),pair(:c),pair(:a)) or
542
+ # SpriteList(pair(:c),pair(:a),pair(:b)) or SpriteList(pair(:c),pair(:b),pair(:a))
543
+ #返却値:: シャッフルした自分自身
544
+ def shuffle!
545
+ @names.shuffle
546
+ self
547
+ end
548
+
549
+ #===自身から要素をランダムに選ぶ
550
+ #自分自身を配列化(to_ary)し、最大n個の要素(ListPair)をランダムに選び出して配列として返す
551
+ #自分自身が空のときは、n=nilのときはnilを、n!=nilのときは空配列を返す
552
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
553
+ # a.sample(1)
554
+ # =>[pair(:a)] or [pair(:b)] or [pair(:c)]
555
+ # a.sample(2)
556
+ # =>[pair(:a),pair(:b)] or [pair(:a),pair(:c)] or
557
+ # [pair(:b),pair(:a)] or [pair(:b),pair(:c)] or
558
+ # [pair(:c),pair(:a)] or [pair(:c),pair(:b)]
559
+ # a.sample(3)
560
+ # =>[pair(:a),pair(:b),pair(:c)] or [pair(:a),pair(:c),pair(:b)] or
561
+ # [pair(:b),pair(:a),pair(:c)] or [pair(:b),pair(:c),pair(:a)] or
562
+ # [pair(:c),pair(:a),pair(:b)] or [pair(:c),pair(:b),pair(:a)]
563
+ #_n_:: 選び出す個数。n=nilのときは1個とみなす
564
+ #返却値:: 選び出したListPairを配列化したもの
565
+ def sample(n=nil)
566
+ n ? self.to_a.sample(n) : self.to_a.sample
567
+ end
568
+
569
+ #===自身での組み合わせを配列として返す
570
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
571
+ # a.combination(1)
572
+ # =>[[pair(:a)],[pair(:b)],[pair(:c)]]
573
+ # a.combination(2)
574
+ # =>[[pair(:a),pair(:b)],[pair(:a),pair(:c)],[pair(:b),pair(:c)]]
575
+ # a.combination(3)
576
+ # =>[[pair(:a),pair(:b),pair(:c)]]
577
+ #自分自身を配列化(to_ary)し、サイズnの組み合わせをすべて求めて配列にまとめる
578
+ #_n_:: 組み合わせのサイズ
579
+ #返却値:: すべてのListPairの順列を配列化したもの
580
+ def combination(n, &block)
581
+ self.to_a.combination(n, &block)
582
+ end
583
+
584
+ #===自身での順列を配列として返す
585
+ #自分自身を配列化(to_ary)し、サイズnの順列をすべて求めて配列にまとめる
586
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
587
+ # a.permutation(1)
588
+ # =>[[pair(:a)],[pair(:b)],[pair(:c)]]
589
+ # a.permutation(2)
590
+ # =>[[pair(:a),pair(:b)],[pair(:a),pair(:c)],
591
+ # [pair(:b),pair(:a)],[pair(:b),pair(:c)],
592
+ # [pair(:c),pair(:a)],[pair(:c),pair(:b)]]
593
+ # a.permutation(3)
594
+ # =>[[pair(:a),pair(:b),pair(:c)],[pair(:a),pair(:c),pair(:b)],
595
+ # [pair(:b),pair(:a),pair(:c)],[pair(:b),pair(:c),pair(:a)],
596
+ # [pair(:c),pair(:a),pair(:b)],[pair(:c),pair(:b),pair(:a)]]
597
+ #_n_:: 順列のサイズ
598
+ #返却値:: すべてのListPairの組み合わせを配列化したもの
599
+ def permutation(n, &block)
600
+ self.to_a.permutation(n, &block)
601
+ end
602
+
603
+ private :reflesh
604
+
605
+ #===内容を引数のものに置き換える
606
+ #現在登録されているデータをいったん解除し、
607
+ #引数として渡ってきたSpriteListの無いようにデータを置き換える
608
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
609
+ # a.replace(SpriteList(pair(:e),pair(:f),pair(:g),pair(:h)))
610
+ # =>a=SpriteList(pair(:e),pair(:f),pair(:g),pair(:h))
611
+ #_other_:: 置き換え元のSpriteList
612
+ #返却値:: 置き換えた自分自身
613
+ def replace(other)
614
+ self.clear
615
+ other.to_a.each{|pair| self.add(*pair)}
616
+ self
617
+ end
618
+
619
+ #===名前の順番を反転する
620
+ #名前の順番を反転した、自分自身のコピーを生成する
621
+ #例:a=SpriteList(pari(:a),pair(:b),pair(:c),pair(:d))
622
+ # a.reverse
623
+ # =>SpriteList(pari(:d),pair(:c),pair(:b),pair(:a))
624
+ # a=SpriteList(pari(:a),pair(:b),pair(:c),pair(:d))
625
+ #返却値:: 名前を反転させた自分自身の複製を返す
626
+ def reverse
627
+ ret = self.dup
628
+ ret.reverse!
629
+ end
630
+
631
+ #===名前の順番を破壊的に反転する
632
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
633
+ # a.reverse!
634
+ # =>SpriteList(pair(:d),pair(:c),pair(:b),pair(:a))
635
+ # a=SpriteList(pair(:d),pair(:c),pair(:b),pair(:a))
636
+ #返却値:: 自分自身を帰す
637
+ def reverse!
638
+ @names.reverse!
639
+ return self
640
+ end
641
+
642
+ #===名前と関連付けられたスプライトを取得する
643
+ #関連付けられているスプライトが見つからなければnilが返る
644
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))[:c]
645
+ # => spr(:c)
646
+ #_name_:: 名前
647
+ #返却値:: 名前に関連付けられたスプライト
648
+ def [](name)
649
+ return @n2v[name].body
650
+ end
651
+
652
+ #===名前と関連付けられたスプライトを置き換える
653
+ #名前に対応したスプライトを、引数で指定したものに置き換える。
654
+ #ただし、まだ名前が登録されていないときは、新規追加と同じになる。
655
+ #新規追加のときはSpriteList#pushと同じ
656
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))[:e]=spr(:e)
657
+ # => SpriteList(pair(:a),pair(:b),pair(:c),pair(:d),pair(:e))
658
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))[:b]=spr(:b2)
659
+ # => SpriteList(pair(:a),pair(:b2),pair(:c),pair(:d))
660
+ #_name_:: 名前
661
+ #_sprite_:: スプライト
662
+ #返却値:: 登録された自分自身
663
+ def []=(name, sprite)
664
+ return self.push(name, sprite) unless @names.include?(name)
665
+ @n2v[name] = ListPair.new(name, sprite)
666
+ return self
667
+ end
668
+
669
+ #===名前の一覧から新しいSpriteListを生成する
670
+ #リストの順番はnamesの順番と同じ
671
+ #自分自身に登録されていない名前があったときはnilが登録される
672
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).pairs_at(:b, :d)
673
+ # => [pair(:b),pair(:d)]
674
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).pairs_at(:b, :e)
675
+ # => [pair(:b),nil]
676
+ #_names_:: 取り出した名前のリスト名前
677
+ #返却値:: 生成されたSpriteList
678
+ def pairs_at(*names)
679
+ ret = SpriteList.new
680
+ names.each{|name| ret[name] = @n2v[name]}
681
+ ret
682
+ end
683
+
684
+ #===名前の一覧から本体のリストを生成する
685
+ #本体のみの配列を返す。要素の順番はnamesの順番と同じ
686
+ #自分自身に登録されていない名前があったときはnilが登録される
687
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).values_at(:b, :d)
688
+ # => [spr(:b),spr(:d)]
689
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).values_at(:b, :e)
690
+ # => [spr(:b),nil]
691
+ #_names_:: 取り出した名前のリスト名前
692
+ #返却値:: 生成された配列
693
+ def values_at(*names)
694
+ names.map{|name| @n2v[name].body }
695
+ end
696
+
697
+ #===SpriteListを配列化し、同じ位置の要素を一つの配列にまとめる
698
+ #自分自身に登録されていない名前があったときはnilが登録される
699
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(SpriteList(pair(:d),pair(:e),pair(:f))
700
+ # => [[pair(:a),pair(:d)],[pair(:b),pair(:e)],[pair(:c),pair(:f)]]
701
+ #例:SpriteList(pair(:a),pair(:b)).zip(SpriteList(pair(:d),pair(:e),pair(:f))
702
+ # => [[pair(:a),pair(:d)],[pair(:b),pair(:e)]]
703
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(SpriteList(pair(:d),pair(:e))
704
+ # => [[pair(:a),pair(:d)],[pair(:b),pair(:e)],[pair(:c),nil]]
705
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(
706
+ # SpriteList(pair(:d),pair(:e),pair(:f),
707
+ # SpriteList(pair(:g),pair(:h),pair(:i))
708
+ # => [[pair(:a),pair(:d),pair(:g)],[pair(:b),pair(:e),pair(:h)],[pair(:c),pair(:f),pair(:i)]]
709
+ #_names_:: 取り出した名前のリスト名前
710
+ #返却値:: 生成されたSpriteList
711
+ def zip(*lists, &block)
712
+ lists = lists.map{|list| list.to_a}
713
+ self.to_a.zip(*lists, &block)
714
+ end
715
+
716
+ #===リストを配列化する
717
+ #インスタンスの内容を元に、配列を生成する。
718
+ #各要素は、ListPair構造体
719
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).to_a
720
+ # => [pair(:a),pair(:b),pair(:c)]
721
+ #返却値:: 生成した配列
722
+ def to_a
723
+ self.to_ary
724
+ end
725
+
726
+ #===リストを配列化する
727
+ #インスタンスの内容を元に、配列を生成する。
728
+ #各要素は、ListPair構造体
729
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).to_ary
730
+ # => [pair(:a),pair(:b),pair(:c)]
731
+ #返却値:: 生成した配列
732
+ def to_ary
733
+ @names.map{|name| @n2v[name]}
734
+ end
735
+
736
+ #===スプライト名とスプライト本体とのハッシュを取得する
737
+ #スプライト名とスプライト本体が対になったハッシュを作成して返す
738
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).to_hash
739
+ # => {:a=>spr(:a),:b=>spr(:b),:c=>spr(:c)}
740
+ #返却値:: 生成したハッシュ
741
+ def to_hash
742
+ @n2v.dup
743
+ end
744
+
745
+ #===リストの中身を消去する
746
+ #リストに登録されているスプライト名・スプライト本体への登録を解除する
747
+ def clear
748
+ @names.clear
749
+ @n2v.clear
750
+ end
751
+
752
+ #===オブジェクトを解放する
753
+ def dispose
754
+ @names.clear
755
+ @names = nil
756
+ @n2v.clear
757
+ @n2v = nil
758
+ end
759
+
760
+ #===名前に対して値を渡す
761
+ #仕様はHash#fetchと同じ
762
+ def fetch(name, default = nil, &block)
763
+ @n2v.fetch(name, default, &block)
764
+ end
765
+
766
+ #===指定の名前の直前に名前を挿入する
767
+ #配列上で、スプライト名配列の指定の名前の前になるように名前を挿入する
768
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert(:b, :d, spr(:d))
769
+ # => SpriteList(pair(:a),pair(:d),pair(:b),pair(:c))
770
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert(:c, :a)
771
+ # => SpriteList(pair(:c),pair(:a),pair(:b))
772
+ #_key_:: 挿入先の名前。この名前の直前に挿入する
773
+ #_name_:: 挿入するスプライトの名前
774
+ #_value_:: (名前が未登録の時の)スプライト本体省略時はnil
775
+ #返却値:自分自身を返す
776
+ def insert(key, name, value = nil)
777
+ raise MiyakoValueError, "Illegal key! : #{key}" unless @names.include?(key)
778
+ return self if key == name
779
+ if value
780
+ @n2v[name] = ListPair.new(name, value)
781
+ else
782
+ raise MiyakoValueError, "name is not regist! : #{name}" unless @names.include?(name)
783
+ end
784
+ @names.delete(name) if @names.include?(name)
785
+ @names.insert(@names.index(key), name)
786
+ self
787
+ end
788
+
789
+ #===指定の名前の直後に名前を挿入する
790
+ #配列上で、スプライト名配列の指定の名前の次の名前になるように名前を挿入する
791
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert_after(:b, :d, spr(:d))
792
+ # => SpriteList(pair(:a),pair(:b),,pair(:d)pair(:c))
793
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert_after(:c, :b)
794
+ # => SpriteList(pair(:a),pair(:c),pair(:b))
795
+ #_key_:: 挿入先の名前。この名前の直後に挿入する
796
+ #_name_:: 挿入するスプライトの名前
797
+ #_value_:: (名前が未登録の時の)スプライト本体省略時はnil
798
+ #返却値:自分自身を返す
799
+ def insert_after(key, name, value = nil)
800
+ raise MiyakoValueError, "Illegal key! : #{key}" unless @names.include?(key)
801
+ return self if key == name
802
+ if value
803
+ @n2v[name] = ListPair.new(name, value)
804
+ else
805
+ raise MiyakoValueError, "name is not regist! : #{name}" unless @names.include?(name)
806
+ end
807
+ @names.delete(name) if @names.include?(name)
808
+ @names.insert(@parts_list.index(key)-@parts_list.length, name)
809
+ self
810
+ end
811
+
812
+ #===指定した要素の内容を入れ替える
813
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).insert(:b, :d)
814
+ # => SpriteList(pair(:a),pair(:d),pair(:c),pair(:b))
815
+ #_name1,name_:: 入れ替え対象の名前
816
+ #返却値:: 自分自身を帰す
817
+ def swap(name1, name2)
818
+ raise MiyakoValueError, "Illegal name! : idx1:#{name1}" unless @names.include?(name1)
819
+ raise MiyakoValueError, "Illegal name! : idx2:#{name2}" unless @names.include?(name2)
820
+ idx1 = @names.index(name1)
821
+ idx2 = @names.index(name2)
822
+ @names[idx1], @names[idx2] = @names[idx2], @names[idx1]
823
+ return self
824
+ end
825
+
826
+ #===描く画像のアニメーションを開始する
827
+ #各要素のstartメソッドを呼び出す
828
+ #返却値:: 自分自身を返す
829
+ def start
830
+ self.sprite_only.each{|pair| pair[1].start }
831
+ return self
832
+ end
833
+
834
+ #===描く画像のアニメーションを停止する
835
+ #各要素のstopメソッドを呼び出す
836
+ #返却値:: 自分自身を返す
837
+ def stop
838
+ self.sprite_only.each{|pair| pair[1].stop }
839
+ return self
840
+ end
841
+
842
+ #===描く画像のアニメーションを先頭パターンに戻す
843
+ #各要素のresetメソッドを呼び出す
844
+ #返却値:: 自分自身を返す
845
+ def reset
846
+ self.sprite_only.each{|pair| pair[1].reset }
847
+ return self
848
+ end
849
+
850
+ #===描く画像のアニメーションを更新する
851
+ #各要素のupdate_animationメソッドを呼び出す
852
+ #返却値:: 描く画像のupdate_spriteメソッドを呼び出した結果を配列で返す
853
+ def update_animation
854
+ self.sprite_only.map{|pair| pair[1].update_animation }
855
+ end
856
+
857
+ #===配列の要素を画面に描画する
858
+ #配列の先頭から順にrenderメソッドを呼び出す。
859
+ #返却値:: 自分自身を帰す
860
+ def render
861
+ return self unless @visible
862
+ self.sprite_only.each{|pair| pair[1].render }
863
+ return self
864
+ end
865
+
866
+ #===配列の要素を対象の画像に描画する
867
+ #配列の先頭から順にrender_toメソッドを呼び出す。
868
+ #_dst_:: 描画対象の画像インスタンス
869
+ #返却値:: 自分自身を帰す
870
+ def render_to(dst)
871
+ return self unless @visible
872
+ self.sprite_only.each{|pair| pair[1].render_to(dst) }
873
+ return self
874
+ end
875
+
876
+ #===オブジェクトを文字列に変換する
877
+ #いったん、名前とスプライトとの対の配列に変換し、to_sメソッドで文字列化する。
878
+ #例:[[name1, sprite1], [name2, sprite2],...]
879
+ #返却値:: 変換した文字列
880
+ def to_s
881
+ self.to_a.to_s
882
+ end
883
+ end
884
+ end