ruby-miyako 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/README +1115 -0
  2. data/Rakefile +7 -0
  3. data/defines.h +144 -0
  4. data/extconf.rb +44 -0
  5. data/extern.h +29 -0
  6. data/img/cursor.png +0 -0
  7. data/img/cursors.png +0 -0
  8. data/img/dice.png +0 -0
  9. data/img/wait_cursor.png +0 -0
  10. data/img/win_base.png +0 -0
  11. data/img/window.png +0 -0
  12. data/install_miyako.rb +87 -0
  13. data/lib/Miyako/API/audio.rb +584 -0
  14. data/lib/Miyako/API/basic_data.rb +1026 -0
  15. data/lib/Miyako/API/bitmap.rb +534 -0
  16. data/lib/Miyako/API/choices.rb +481 -0
  17. data/lib/Miyako/API/collision.rb +638 -0
  18. data/lib/Miyako/API/diagram.rb +586 -0
  19. data/lib/Miyako/API/drawing.rb +151 -0
  20. data/lib/Miyako/API/exceptions.rb +105 -0
  21. data/lib/Miyako/API/fixedmap.rb +462 -0
  22. data/lib/Miyako/API/font.rb +430 -0
  23. data/lib/Miyako/API/input.rb +456 -0
  24. data/lib/Miyako/API/layout.rb +644 -0
  25. data/lib/Miyako/API/map.rb +583 -0
  26. data/lib/Miyako/API/map_event.rb +222 -0
  27. data/lib/Miyako/API/modules.rb +357 -0
  28. data/lib/Miyako/API/movie.rb +166 -0
  29. data/lib/Miyako/API/parts.rb +188 -0
  30. data/lib/Miyako/API/plane.rb +205 -0
  31. data/lib/Miyako/API/screen.rb +341 -0
  32. data/lib/Miyako/API/shape.rb +443 -0
  33. data/lib/Miyako/API/sprite.rb +773 -0
  34. data/lib/Miyako/API/sprite_animation.rb +494 -0
  35. data/lib/Miyako/API/sprite_list.rb +1135 -0
  36. data/lib/Miyako/API/spriteunit.rb +168 -0
  37. data/lib/Miyako/API/story.rb +350 -0
  38. data/lib/Miyako/API/textbox.rb +773 -0
  39. data/lib/Miyako/API/utility.rb +419 -0
  40. data/lib/Miyako/API/viewport.rb +190 -0
  41. data/lib/Miyako/API/yuki.rb +1180 -0
  42. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  43. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  44. data/lib/Miyako/EXT/slides.rb +157 -0
  45. data/lib/Miyako/miyako.rb +201 -0
  46. data/lib/Miyako/miyako_require_only.rb +35 -0
  47. data/logo/EGSR_logo.png +0 -0
  48. data/logo/EGSR_logo_bg.png +0 -0
  49. data/logo/EGSR_logo_fg.png +0 -0
  50. data/logo/EGSR_title_banner.png +0 -0
  51. data/logo/EGSR_title_logo.png +0 -0
  52. data/logo/miyako.png +0 -0
  53. data/logo/miyako_banner.png +0 -0
  54. data/logo/space.png +0 -0
  55. data/miyako_basicdata.c +484 -0
  56. data/miyako_bitmap.c +1225 -0
  57. data/miyako_collision.c +403 -0
  58. data/miyako_drawing.c +187 -0
  59. data/miyako_font.c +334 -0
  60. data/miyako_hsv.c +830 -0
  61. data/miyako_input_audio.c +254 -0
  62. data/miyako_layout.c +191 -0
  63. data/miyako_no_katana.c +1086 -0
  64. data/miyako_sprite2.c +431 -0
  65. data/miyako_transform.c +438 -0
  66. data/miyako_utility.c +288 -0
  67. data/sample/Animation1/m1ku.rb +68 -0
  68. data/sample/Animation1/m1ku_arm_0.png +0 -0
  69. data/sample/Animation1/m1ku_arm_1.png +0 -0
  70. data/sample/Animation1/m1ku_arm_2.png +0 -0
  71. data/sample/Animation1/m1ku_arm_3.png +0 -0
  72. data/sample/Animation1/m1ku_back.jpg +0 -0
  73. data/sample/Animation1/m1ku_body.png +0 -0
  74. data/sample/Animation1/m1ku_eye_0.png +0 -0
  75. data/sample/Animation1/m1ku_eye_1.png +0 -0
  76. data/sample/Animation1/m1ku_eye_2.png +0 -0
  77. data/sample/Animation1/m1ku_eye_3.png +0 -0
  78. data/sample/Animation1/m1ku_hair_front.png +0 -0
  79. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  80. data/sample/Animation1/readme.txt +72 -0
  81. data/sample/Animation2/lex.rb +96 -0
  82. data/sample/Animation2/lex_back.png +0 -0
  83. data/sample/Animation2/lex_body.png +0 -0
  84. data/sample/Animation2/lex_roadroller.png +0 -0
  85. data/sample/Animation2/lex_wheel_0.png +0 -0
  86. data/sample/Animation2/lex_wheel_1.png +0 -0
  87. data/sample/Animation2/lex_wheel_2.png +0 -0
  88. data/sample/Animation2/readme.txt +72 -0
  89. data/sample/Animation2/song_title.png +0 -0
  90. data/sample/Diagram_sample/back.png +0 -0
  91. data/sample/Diagram_sample/chr01.png +0 -0
  92. data/sample/Diagram_sample/chr02.png +0 -0
  93. data/sample/Diagram_sample/cursor.png +0 -0
  94. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  95. data/sample/Diagram_sample/readme.txt +90 -0
  96. data/sample/Diagram_sample/wait_cursor.png +0 -0
  97. data/sample/Room3/blue.rb +297 -0
  98. data/sample/Room3/ending.rb +180 -0
  99. data/sample/Room3/green.rb +220 -0
  100. data/sample/Room3/image/akamatsu.png +0 -0
  101. data/sample/Room3/image/aoyama.png +0 -0
  102. data/sample/Room3/image/congra.png +0 -0
  103. data/sample/Room3/image/congratulation.png +0 -0
  104. data/sample/Room3/image/congratulation_bg.png +0 -0
  105. data/sample/Room3/image/cursor.png +0 -0
  106. data/sample/Room3/image/midori.png +0 -0
  107. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  108. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  109. data/sample/Room3/image/room_blue.png +0 -0
  110. data/sample/Room3/image/room_green.png +0 -0
  111. data/sample/Room3/image/room_red.png +0 -0
  112. data/sample/Room3/image/start.png +0 -0
  113. data/sample/Room3/image/three_doors.png +0 -0
  114. data/sample/Room3/image/wait_cursor.png +0 -0
  115. data/sample/Room3/main.rb +120 -0
  116. data/sample/Room3/main_component.rb +59 -0
  117. data/sample/Room3/readme.txt +76 -0
  118. data/sample/Room3/red.rb +227 -0
  119. data/sample/Room3/room3.rb +25 -0
  120. data/sample/Room3/title.rb +184 -0
  121. data/sample/ball_action_sample.rb +204 -0
  122. data/sample/blit_rop.rb +70 -0
  123. data/sample/cairo_sample.rb +25 -0
  124. data/sample/circle_collision_test.rb +66 -0
  125. data/sample/collision_test.rb +33 -0
  126. data/sample/collision_test2.rb +108 -0
  127. data/sample/fixed_map_test/cursor.png +0 -0
  128. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  129. data/sample/fixed_map_test/map.csv +19 -0
  130. data/sample/fixed_map_test/map_01.png +0 -0
  131. data/sample/fixed_map_test/mapchip.csv +23 -0
  132. data/sample/fixed_map_test/monster.png +0 -0
  133. data/sample/fixed_map_test/readme.txt +72 -0
  134. data/sample/map_test/chara.rb +58 -0
  135. data/sample/map_test/chr1.png +0 -0
  136. data/sample/map_test/cursor.png +0 -0
  137. data/sample/map_test/main_parts.rb +69 -0
  138. data/sample/map_test/main_scene.rb +153 -0
  139. data/sample/map_test/map.png +0 -0
  140. data/sample/map_test/map2.png +0 -0
  141. data/sample/map_test/map_layer.csv +127 -0
  142. data/sample/map_test/map_manager.rb +75 -0
  143. data/sample/map_test/map_test.rb +23 -0
  144. data/sample/map_test/mapchip.csv +21 -0
  145. data/sample/map_test/oasis.rb +71 -0
  146. data/sample/map_test/readme.txt +89 -0
  147. data/sample/map_test/route.rb +157 -0
  148. data/sample/map_test/sea.png +0 -0
  149. data/sample/map_test/town.rb +74 -0
  150. data/sample/map_test/wait_cursor.png +0 -0
  151. data/sample/map_test/window.png +0 -0
  152. data/sample/polygon_test.rb +35 -0
  153. data/sample/rasterscroll.rb +25 -0
  154. data/sample/takahashi.rb +42 -0
  155. data/sample/text.png +0 -0
  156. data/sample/textbox_sample.rb +192 -0
  157. data/sample/transform.rb +54 -0
  158. data/sample/utility_test.rb +73 -0
  159. data/sample/utility_test2.rb +61 -0
  160. data/sample/utility_test3.rb +64 -0
  161. data/sample/utility_test4.rb +73 -0
  162. data/uninstall_miyako.rb +19 -0
  163. data/win/miyako_no_katana.so +0 -0
  164. metadata +216 -0
@@ -0,0 +1,1135 @@
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
+ include SpriteBase
28
+ include Animation
29
+
30
+ # ディープコピー
31
+ def deep_dup
32
+ [self[0], self[1].dup]
33
+ end
34
+
35
+ # ディープコピー
36
+ def deep_clone
37
+ self.deep_copy
38
+ end
39
+
40
+ # 構造体を配列に変換する
41
+ def to_ary
42
+ [self[0], self[1]]
43
+ end
44
+
45
+ # 構造体を配列に変換する
46
+ def to_a
47
+ self.to_ary
48
+ end
49
+
50
+ # 構造体を文字列に変換する
51
+ def to_s
52
+ "#{self[0]} : #{self[1]}"
53
+ end
54
+
55
+ #===スプライトの移動(変化量を指定)
56
+ #_dx_:: 移動量(x方向)。単位はピクセル
57
+ #_dy_:: 移動量(y方向)。単位はピクセル
58
+ #返却値:: 自分自身を返す
59
+ def move!(dx, dy)
60
+ self[1].move!(dx, dy)
61
+ self
62
+ end
63
+
64
+ #===本体の移動(位置を指定)
65
+ #_x_:: 位置(x方向)。単位はピクセル
66
+ #_y_:: 位置(y方向)。単位はピクセル
67
+ #返却値:: 自分自身を返す
68
+ def move_to!(x, y)
69
+ self[1].move_to!(x, y)
70
+ self
71
+ end
72
+
73
+ #===本体のアニメーションを開始する
74
+ #各要素のstartメソッドを呼び出す
75
+ #返却値:: 自分自身を返す
76
+ def start
77
+ self[1].start
78
+ return self
79
+ end
80
+
81
+ #===本体のアニメーションを停止する
82
+ #各要素のstopメソッドを呼び出す
83
+ #返却値:: 自分自身を返す
84
+ def stop
85
+ self[1].stop
86
+ return self
87
+ end
88
+
89
+ #===本体のアニメーションを先頭パターンに戻す
90
+ #各要素のresetメソッドを呼び出す
91
+ #返却値:: 自分自身を返す
92
+ def reset
93
+ self[1].reset
94
+ return self
95
+ end
96
+
97
+ #===本体のアニメーションを更新する
98
+ #各要素のupdate_animationメソッドを呼び出す
99
+ #返却値:: 本体のupdate_spriteメソッドを呼び出した結果
100
+ def update_animation
101
+ self[1].update_animation
102
+ end
103
+
104
+ #画面に描画する
105
+ def render
106
+ self[1].render
107
+ end
108
+
109
+ #指定の画像に描画する
110
+ #_dst_:: 描画先インスタンス
111
+ def render_to(dst)
112
+ self[1].render_to(dst)
113
+ end
114
+ end
115
+
116
+ #===名前-本体ペアを構成する構造体
117
+ #ハッシュのようにキー・バリュー構成を持たせるための構造体
118
+ #_name_:: 名前
119
+ #_body_:: 本体
120
+ ListPair = ListPairStruct.new(:name, :body)
121
+
122
+ #==複数スプライト管理(リスト)クラス
123
+ #複数のスプライトを、[名前,インスタンス]の一対一のリストとして持っておく。
124
+ #値の並びの基準は、名前の並びを配列にしたときのもの(SpriteList#valuesの値)に対応する
125
+ #Enumerableからmixinされたメソッド、Array・Hashクラスで使用されている一部メソッド、
126
+ #swapなどの独自メソッドを追加している
127
+ #(Enumerableからmixinされたメソッドでは、ブロック引数に[名前,インスタンス]の配列として渡される)
128
+ #render、render_toを用意し、一気に描画が可能。
129
+ #名前は配列として管理している。render時には、名前の順番に描画される。
130
+ #各要素のレイアウトは関与していない(そこがPartsとの違い)
131
+ #また、このクラスインスタンスのdup、cloneはディープコピー(配列の要素も複写)となっていることに注意。
132
+ class SpriteList
133
+ include SpriteBase
134
+ include Animation
135
+ include Enumerable
136
+
137
+ attr_accessor :visible
138
+
139
+ #===ハッシュを元にSpriteListを生成する
140
+ #ハッシュのキーをスプライト名にして生成する
141
+ #_hash_:: 生成元のハッシュ
142
+ #返却値:: 生成したインスタンス
143
+ def SpriteList.[](hash)
144
+ body = SpriteList.new
145
+ hash.each{|k, v| body.push(k ,v)}
146
+ end
147
+
148
+ #===ハッシュを元にSpriteListを生成する
149
+ #引数を省略すると空のSpriteListを生成する。
150
+ #要素が[スプライト名,スプライト]の配列となる配列を引数として渡すこともできる。
151
+ #(ただし、要素がスプライトのみのときは、
152
+ #名前を":s_nnn"(nnn:配列インデックス(3桁))として追加する)
153
+ #ハッシュを引数として渡すと、キーをスプライト名とするSpriteListを生成する。
154
+ #_pairs_:: 生成元のインスタンス
155
+ #返却値:: 生成したインスタンス
156
+ def initialize(pairs = nil)
157
+ @names = []
158
+ @n2v = {}
159
+ if pairs.is_a?(Array)
160
+ pairs.each_with_index{|pair, i|
161
+ if pair.is_a?(Array)
162
+ @names << pair[0]
163
+ @n2v[pair[0]] = ListPair.new(*pair)
164
+ else
165
+ name = sprintf("s_%03d", i).to_sym
166
+ @names << name
167
+ @n2v[name] = ListPair.new(name, pair)
168
+ end
169
+ }
170
+ elsif pairs.is_a?(Hash)
171
+ pairs.each{|key, value|
172
+ @names << key
173
+ @n2v[key] = ListPair.new(key, value)
174
+ }
175
+ end
176
+ @visible = true
177
+ end
178
+
179
+ #===内部で使用している配列などを新しいインスタンスに置き換える
180
+ #initialize_copy用で元・新インスタンスで配列などを共用している場合に対応
181
+ def reflesh
182
+ @names = []
183
+ @n2v = {}
184
+ end
185
+
186
+ def initialize_copy(obj) #:nodoc:
187
+ reflesh
188
+ obj.names.each{|name| self.push([name, obj[name].deep_dup]) }
189
+ @visible = obj.visible
190
+ end
191
+
192
+ #===スプライト以外のインスタンスを削除したSpriteListを生成する
193
+ #新しいSpriteListを作成し、本体がnilや、SpriteBaseもしくはSpritArrayモジュールを
194
+ #mixinしていない対を削除する。
195
+ #返却値:: 新しく生成したインスタンス
196
+ def sprite_only
197
+ ret = self.dup
198
+ ret.names.each{|name|
199
+ ret.delete(name) if !ret[name].class.include?(SpriteBase) &&
200
+ !ret[name].class.include?(SpriteArray)
201
+ }
202
+ return ret
203
+ end
204
+
205
+ #===スプライト以外のインスタンスを破壊的に削除する
206
+ #自分自身から、本体がnilや、SpriteBaseもしくはSpritArrayモジュールを
207
+ #mixinしていない対を削除する。
208
+ #返却値:: 自分自身を帰す
209
+ def sprite_only!
210
+ @names.each{|name|
211
+ if !@n2v[name].class.include?(SpriteBase) &&
212
+ !ret[name].class.include?(SpriteArray)
213
+ @n2v.delete(name)
214
+ @names.delete(name)
215
+ end
216
+ }
217
+ return self
218
+ end
219
+
220
+ #===ブロックを受け取り、リストの各要素にたいして処理を行う
221
+ #ブロック引数には、|[スプライト名,スプライト本体]|が渡ってくる
222
+ #名前が登録されている順に渡ってくる
223
+ #返却値:: 自分自身を帰す
224
+ def each
225
+ self.to_a.each{|pair| yield pair}
226
+ end
227
+
228
+ #===ブロックを受け取り、スプライト名リストの各要素にたいして処理を行う
229
+ #ブロック引数には、|スプライト名,スプライト本体|が渡ってくる
230
+ #名前が登録されている順に渡ってくる
231
+ #返却値:: 自分自身を帰す
232
+ def each_pair
233
+ @names.each{|name| yield *@n2v[name]}
234
+ end
235
+
236
+ #===ブロックを受け取り、名前リストの各要素にたいして処理を行う
237
+ #ブロック引数には、|スプライト名|が渡ってくる
238
+ #名前が登録されている順に渡ってくる
239
+ #返却値:: 自分自身を帰す
240
+ def each_name
241
+ @names.each{|name| yield name}
242
+ end
243
+
244
+ #===ブロックを受け取り、値リストの各要素にたいして処理を行う
245
+ #ブロック引数には、|スプライト本体|の配列として渡ってくる
246
+ #名前が登録されている順に渡ってくる
247
+ #返却値:: 自分自身を帰す
248
+ def each_value
249
+ @names.each{|name| yield @n2v[name].body}
250
+ end
251
+
252
+ #===ブロックを受け取り、配列インデックスにたいして処理を行う
253
+ #ブロック引数には、|スプライト名に対応する配列インデックス|の配列として渡ってくる
254
+ #0,1,2,...の順に渡ってくる
255
+ #返却値:: 自分自身を帰す
256
+ def each_index
257
+ @names.length.times{|idx| yield idx}
258
+ end
259
+
260
+ #===スプライト名配列を取得する
261
+ #名前が登録されている順に渡ってくる
262
+ #返却値:: スプライト名配列
263
+ def names
264
+ @names
265
+ end
266
+
267
+ #===スプライト配列を取得する
268
+ #名前が登録されている順に渡ってくる
269
+ #返却値:: スプライト本体配列
270
+ def values
271
+ @names.map{|name| @n2v[name].body}
272
+ end
273
+
274
+ #===名前-本体ペア配列を取得する
275
+ #名前が登録されている順にListPair構造体の構造体を構成して返す
276
+ #返却値:: ListPair構造体の配列
277
+ def pairs
278
+ @names.map{|name| @n2v[name].body}
279
+ end
280
+
281
+ #===リストが空っぽかどうか確かめる
282
+ #リストに何も登録されていないかどうか確かめる
283
+ #返却値:: 空っぽの時はtrue、なにか登録されているときはfalse
284
+ def empty?
285
+ @names.empty?
286
+ end
287
+
288
+ #===内容が同じかどうか比較する
289
+ #リストに含まれるスプライト名(順番も)・値が同じかどうか比較する
290
+ #返却値:: 同じときはtrue、違うときはfalseを返す
291
+ def eql?(other)
292
+ @names.map{|name|
293
+ self.index(name) == other.index(name) &&
294
+ @n2v[name].body.eql?(other[name].body)
295
+ }.all?
296
+ end
297
+
298
+ #===リストに名前が登録されているか確認する
299
+ #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
300
+ #(include?メソッドと同じ)
301
+ #_name_:: 検索対象の名前
302
+ #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
303
+ def has_key?(name)
304
+ @n2v.has_key?(name)
305
+ end
306
+
307
+ #===リストに名前が登録されているか確認する
308
+ #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
309
+ #(include?メソッドと同じ)
310
+ #_name_:: 検索対象の名前
311
+ #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
312
+ def has_name?(name)
313
+ @n2v.has_key?(name)
314
+ end
315
+
316
+ #===リストに名前が登録されているか確認する
317
+ #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
318
+ #(has_name?メソッドと同じ)
319
+ #_name_:: 検索対象の名前
320
+ #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
321
+ def include?(name)
322
+ @names.has_key?(name)
323
+ end
324
+
325
+ #===リストにスプライトが登録されているか確認する
326
+ #スプライトリスト内に、引数で指定したスプライトが含まれているか調べる
327
+ #_value_:: 検索対象のスプライト
328
+ #返却値:: スプライトが含まれていればtrue、含まれていなければfalseと返す
329
+ def has_value?(value)
330
+ @n2v.values.has_value?(value)
331
+ end
332
+
333
+ #===リストの長さを求める
334
+ #スプライトの登録数(リストの要素数)を返す
335
+ #(sizeメソッドと同じ)
336
+ #返却値:: リストの要素数(殻のときは0)
337
+ def length
338
+ @names.length
339
+ end
340
+
341
+ #===リストの長さを求める
342
+ #スプライトの登録数(リストの要素数)を返す
343
+ #(lengthメソッドと同じ)
344
+ #返却値:: リストの要素数(殻のときは0)
345
+ def size
346
+ @names.size
347
+ end
348
+
349
+ #===スプライト名を探し、あればその対を返す
350
+ #引数で渡された名前を元に、リストから探し出す。
351
+ #(内部でHash#assocを呼び出し)
352
+ #_name_:: 検索対象のスプライト名
353
+ #返却値:: 見つかればListPair構造体、無ければnil
354
+ def assoc(name)
355
+ @n2v.assoc(name)
356
+ end
357
+
358
+ #===スプライトが登録されている名前を求める
359
+ #実際のスプライト本体から、登録されているスプライトを探す。
360
+ #見つかれば、それに対応する名前を返す。
361
+ #(内部でHash#keyメソッドを呼び出している)
362
+ #_name_:: 検索対象のスプライト名
363
+ #返却値:: 名前が見つかったときはそのスプライト名、無ければnil
364
+ def name(value)
365
+ @n2v.key(value)
366
+ end
367
+
368
+ #===名前が何番目にあるかを求める
369
+ #スプライト名リスト中、指定したスプライト名のインデックスを求める
370
+ #(内部でHash#indexメソッドを呼び出している)
371
+ #_name_:: 検索対象のスプライト名
372
+ #返却値:: 名前が見つかったときはそのインデックス(0以上の整数)、無ければnil
373
+ def index(name)
374
+ @names.index(name)
375
+ end
376
+
377
+ #===リストの先頭要素を求める
378
+ #リストの先頭からn要素をSpriteListとして返す。
379
+ #リストが空のとき、nが0のときはnilを返す
380
+ #_n_:: 先頭からの数。省略時は1
381
+ #返却値:: 先頭からn個の要素を設定したSpriteList
382
+ def first(n=1)
383
+ return nil if @names.empty?
384
+ return nil if n == 0
385
+ SpriteList.new(@names.first(n).map{|name| [name, @n2v[name]]})
386
+ end
387
+
388
+ #===リストの終端要素を求める
389
+ #リストの終端からn要素をSpriteListとして返す。
390
+ #リストが空のとき、nが0のときはnilを返す
391
+ #_n_:: 終端からの数。省略時は1
392
+ #返却値:: 終端からn個の要素を設定したSpriteList
393
+ def last(n=1)
394
+ return nil if @names.empty?
395
+ return nil if n == 0
396
+ SpriteList.new(@names.last(n).map{|name| [name, @n2v[name]]})
397
+ end
398
+
399
+ #===名前・スプライトの対を登録する
400
+ #リストに名前・スプライトをリストの後ろに追加する
401
+ #効果はSpriteList#pushと同じ
402
+ #_pair_:: 名前とスプライトの対。[name,sprite]として渡す
403
+ #返却値:: 追加した自分自身を渡す
404
+ def <<(pair)
405
+ self.push(pair)
406
+ end
407
+
408
+ #===引数と自分自身との和集合を取る
409
+ #otherと自分自身で一方でも割り付けられた名前の本体のみ登録する(方法はpush・addと同じ)
410
+ #名前がバッティングしたときは引数の本体を優先する
411
+ #_other_:: 計算をするSpriteList
412
+ #返却値:: 変更を加えた自分自身の複製
413
+ def +(other)
414
+ list = self.dup
415
+ other.to_a.each{|pair| list.add(pair[0], pair[1].dup)}
416
+ list
417
+ end
418
+
419
+ #===引数と自分自身との積集合を取る
420
+ #otherと自分自身で両方割り付けられた名前のみ登録されたリストを生成する
421
+ #内容は自分自身の本体を割り当てる
422
+ #_other_:: 計算をするSpriteList
423
+ #返却値:: 変更を加えた自分自身の複製
424
+ def *(other)
425
+ list = SpriteList.new
426
+ self.to_a.each{|pair| list.add(pair[0], pair[1].dup) if other.has_key?(pair[0])}
427
+ list
428
+ end
429
+
430
+ #===引数と自分自身との差集合を取る
431
+ #otherと自分自身で両方割り付けられた名前を取り除いたリストを生成する
432
+ #_other_:: 計算をするSpriteList
433
+ #返却値:: 変更を加えた自分自身の複製
434
+ def -(other)
435
+ list = SpriteList.new
436
+ self.to_a.each{|pair| list.add(pair[0], pair[1].dup) unless other.has_key?(pair[0])}
437
+ list
438
+ end
439
+
440
+ #===引数と自分自身とのANDを取る
441
+ #方法は積集合と同じ(#*参照)
442
+ #_other_:: 計算をするSpriteList
443
+ #返却値:: 変更を加えた自分自身の複製
444
+ def &(other)
445
+ self * other
446
+ end
447
+
448
+ #===引数と自分自身とのORを取る
449
+ #方法は和集合と同じ(#+参照)
450
+ #_other_:: 計算をするSpriteList
451
+ #返却値:: 変更を加えた自分自身の複製
452
+ def |(other)
453
+ self + other
454
+ end
455
+
456
+ #===引数と内容が同じかどうかを確認する
457
+ #方法は#eql?と同じ(#eql?参照)
458
+ #_other_:: 比較元SpriteList
459
+ #返却値:: 同じ内容ならばtrue,違ったらfalseを返す
460
+ def ==(other)
461
+ self.eql?(other)
462
+ end
463
+
464
+ #===名前・スプライトを登録する
465
+ #リストに名前・スプライトをリストの後ろに追加する
466
+ #効果はSpriteList#push,<<と同じ
467
+ #_name_:: スプライト名
468
+ #_sprite_:: スプライト本体
469
+ #返却値:: 追加した自分自身を渡す
470
+ def add(name, sprite)
471
+ self.push([name, sprite])
472
+ end
473
+
474
+ #===名前・スプライトの対を登録する
475
+ #リストに名前・スプライトをリストの後ろに追加する
476
+ #効果はSpriteList#addと同じだが、複数の対を登録できることが特徴
477
+ #(例)push([name1,sprite1])
478
+ # push([name1,sprite1],[name2,sprite2])
479
+ #_pairs_:: 名前とスプライトの対を配列にしたもの。対は、[name,sprite]として渡す。
480
+ #返却値:: 追加した自分自身を渡す
481
+ def push(*pairs)
482
+ pairs.each{|name, sprite|
483
+ unless sprite.class.include?(SpriteBase) || sprite.class.include?(SpriteArray)
484
+ raise MiyakoValueError, "Illegal Sprite!"
485
+ end
486
+ @names.delete(name) if @names.include?(name)
487
+ @names << name
488
+ @n2v[name] = ListPair.new(name, sprite)
489
+ }
490
+ return self
491
+ end
492
+
493
+ #===リストの終端から名前・スプライトの対を取り出す
494
+ #リストに名前・スプライトをリストの終端から取り除いて、取り除いた対を返す
495
+ #返却値:: 終端にあった名前に対応するListPair構造体
496
+ def pop
497
+ return nil if @names.empty?
498
+ name = @names.pop
499
+ @n2v.delete(name)
500
+ end
501
+
502
+ #===名前・スプライトを登録する
503
+ #リストに名前・スプライトをリストの先頭に追加する
504
+ #(先頭に追加することがSpriteList#<<,add,pushとの違い)
505
+ #_name_:: スプライト名
506
+ #_sprite_:: スプライト本体
507
+ #返却値:: 追加した自分自身を渡す
508
+ def unshift(name, sprite)
509
+ @names.delete(name) if @names.include?(name)
510
+ @names.unshift(name)
511
+ @n2v[name] = ListPair.new(name, sprite)
512
+ return self
513
+ end
514
+
515
+ #===指定した名前の要素を取り除いたSpriteListを取得する
516
+ #登録されていない名前が指定されたときは何もしない
517
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
518
+ # b=a.slice(:a,:b)
519
+ # =>a=SpriteList(pair(:c))
520
+ # b=SpriteList(pair(:a),pair(:b))
521
+ # b=a.slice(:d,:b)
522
+ # =>a=SpriteList(pair(:a),pair(:c))
523
+ # b=SpriteList(pair(:b))
524
+ #_names_:: スプライト名のリスト
525
+ #返却値:: 自分自身の複製から指定した名前の要素を取り除いたインスタンス
526
+ def slice(*names)
527
+ list = self.dup
528
+ list.delete_if!{|name, sprite| !names.include?(name)}
529
+ end
530
+
531
+ #===指定した名前の要素を取り除く
532
+ #登録されていない名前が指定されたときは何もしない
533
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
534
+ # b=a.slice!(:a,:b)
535
+ # =>a=SpriteList(pair(:c))
536
+ # b=SpriteList(pair(:c))
537
+ # b=a.slice!(:d,:b)
538
+ # =>a=SpriteList(pair(:a),pair(:c))
539
+ # b=SpriteList(pair(:a),pair(:c))
540
+ #_names_:: スプライト名のリスト
541
+ #返却値:: 更新した自分自身
542
+ def slice!(*names)
543
+ self.delete_if!{|name, sprite| !names.include?(name)}
544
+ end
545
+
546
+ #===指定した数の要素を先頭から取り除く
547
+ #SpriteListの先頭からn個の要素を取り除いて、新しいSpriteListとする。
548
+ #nがマイナスの時は、後ろからn個の要素を取り除く。
549
+ #nが0の時は、空のSpriteListを返す。
550
+ #自分自身に何も登録されていなければnilを返す
551
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
552
+ # b=a.shift(1)
553
+ # =>a=SpriteList(pair(:b),pair(:c))
554
+ # b=SpriteList(pair(:a))
555
+ # b=a.shift(2)
556
+ # =>a=SpriteList(pair(:c))
557
+ # b=SpriteList(pair(:a),pair(:b))
558
+ # b=a.shift(0)
559
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c))
560
+ # b=SpriteList()
561
+ #(例)a=SpriteList()
562
+ # b=a.shift(1)
563
+ # =>a=SpriteList()
564
+ # b=nil
565
+ #_n_:: 取り除く要素数。省略時は1
566
+ #返却値:: 取り除いた要素から作られたSpriteList
567
+ def shift(n = 1)
568
+ return nil if @names.empty?
569
+ return SpriteList.new if n == 0
570
+ names = @names.shift(n)
571
+ SpriteList.new(names.map{|name| @n2v.delete(name).to_a})
572
+ end
573
+
574
+ #===指定した数の要素を先頭から取り除く
575
+ #SpriteListの先頭からn個の要素を取り除いて、新しいSpriteListとする。
576
+ #nがマイナスの時は、後ろからn個の要素を取り除く。
577
+ #nが0の時は、空のSpriteListを返す。
578
+ #自分自身に何も登録されていなければnilを返す
579
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
580
+ # b=a.delete(:b)
581
+ # =>a=SpriteList(pair(:a),pair(:c))
582
+ # b=SpriteList(pair(:b))
583
+ # b=a.delete(:d)
584
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c))
585
+ # b=nil
586
+ #_n_:: 取り除く要素数。省略時は1
587
+ #返却値:: 取り除いた要素から作られたSpriteList
588
+ def delete(name)
589
+ return nil unless @names.include?(name)
590
+ @names.delete(name)
591
+ SpriteList.new([@n2v.delete(name).to_a])
592
+ end
593
+
594
+ #===指定したインデックスの要素を取り除く
595
+ #SpriteListの先頭からn個の要素を取り除いて、新しいSpriteListとする。
596
+ #nがマイナスの時は、後ろからn個の要素を取り除く。
597
+ #nが0の時は、空のSpriteListを返す。
598
+ #自分自身に何も登録されていなければnilを返す
599
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
600
+ # b=a.delete_at(2)
601
+ # =>a=SpriteList(pair(:a),pair(:b))
602
+ # b=SpriteList(pair(:c))
603
+ # b=a.delete_at(3)
604
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c))
605
+ # b=nil
606
+ #_idx_:: 取り除く要素数。省略時は1
607
+ #返却値:: 取り除いた要素から作られたSpriteList
608
+ def delete_at(idx)
609
+ self.delete(@names[idx])
610
+ end
611
+
612
+ #===ブロックの評価結果が真のときのみ削除するSpriteListを作成
613
+ #SpriteListの複製を作り、各要素でブロックを評価したときに、真になった要素は削除される。
614
+ #引数は、各要素を示すListPari構造体インスタンスが渡ってくる。
615
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
616
+ # b=a.delete_if{|pair| pair[0] == :b}
617
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c))
618
+ # b=SpriteList(pair(:b))
619
+ #返却値:: 取り除いた後のSpriteList
620
+ def delete_if
621
+ ret = self.deep_dup
622
+ ret.each{|pair| ret.delete(pair[0]) if yield(*pair)}
623
+ ret
624
+ end
625
+
626
+ #===ブロックの評価結果が真のときのみ削除するSpriteListを作成
627
+ #SpriteListの複製を作り、各要素でブロックを評価したときに、真になった要素は削除される。
628
+ #引数は、各要素を示すListPari構造体インスタンスが渡ってくる。
629
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
630
+ # b=a.reject{|pair| pair[0] == :b}
631
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c))
632
+ # b=SpriteList(pair(:b))
633
+ #返却値:: 取り除いた後のSpriteList
634
+ def reject
635
+ ret = self.deep_dup
636
+ ret.each{|pair| ret.delete(pair[0]) if yield(*pair)}
637
+ ret
638
+ end
639
+
640
+ #===ブロックの評価結果が真のときのみ破壊的に削除する
641
+ #自分自身に対して、各要素でブロックを評価したときに、真になった要素は削除される。
642
+ #引数は、各要素を示すListPari構造体インスタンスが渡ってくる。
643
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
644
+ # b=a.delete_if!{|pair| pair[0] == :b}
645
+ # =>a=SpriteList(pair(:a),pair(:c))
646
+ # b=SpriteList(pair(:b))
647
+ #返却値:: 取り除いた後のSpriteList
648
+ def delete_if!
649
+ self.each{|pair| self.delete(pair[0]) if yield(*pair)}
650
+ self
651
+ end
652
+
653
+ #===ブロックの評価結果が真のときのみ破壊的に削除する
654
+ #自分自身に対して、各要素でブロックを評価したときに、真になった要素は削除される。
655
+ #引数は、各要素を示すListPari構造体インスタンスが渡ってくる。
656
+ #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
657
+ # b=a.reject!{|pair| pair[0] == :b}
658
+ # =>a=SpriteList(pair(:a),pair(:c))
659
+ # b=SpriteList(pair(:b))
660
+ #返却値:: 取り除いた後のSpriteList
661
+ def reject!
662
+ self.each{|pair| self.delete(pair[0]) if yield(*pair)}
663
+ self
664
+ end
665
+
666
+ #===別のSpriteListと破壊的につなげる
667
+ #自分自身にotherで指定したListの要素をつなげる。
668
+ #ただし、既に自分自身に登録されている要素は追加しない。
669
+ #(例)a=SpriteList(pair(:a),pair(:b)(b1),pair(:c))
670
+ # b=SpriteList(pair(:b)(b2),pair(:d),pair(:e))
671
+ # a.concat(b)
672
+ # =>a=SpriteList(pair(:a),pair(:b)(b1),pair(:c),pair(:d),pair(:e))
673
+ # b=SpriteList(pair(:b)(b2),pair(:d),pair(:e))
674
+ #返却値:: 自分自身を返す
675
+ def concat(other)
676
+ other.each{|pair| self.add(pair[0],pair[1].dup) unless self.has_name?(pair[0]) }
677
+ self
678
+ end
679
+
680
+ #===引数と自分自身との結果をマージする
681
+ #otherで割り付けられた名前のうち、自分では登録されていないものは新規登録する(方法はpushと同じ)
682
+ #名前がバッティングしたときは自分自身の本体を優先する
683
+ #_other_:: マージするSpriteList
684
+ #返却値:: 変更を加えた自分自身の複製
685
+ def merge(other)
686
+ ret = other.dup + self
687
+ ret.names.each{|name| yield name, self[name], other[name] } if block_given?
688
+ ret
689
+ end
690
+
691
+ #===自分自身と引数との結果を破壊的にマージする
692
+ #otherで割り付けられた名前のうち、自分では登録されていないものは新規登録する(方法はpushと同じ)
693
+ #名前がバッティングしたときは自分自身の本体を優先する
694
+ #_other_:: マージするSpriteList
695
+ #返却値:: 変更された自分自身
696
+ def merge!(other)
697
+ self.replace(other+self)
698
+ self.names.each{|name| yield name, self[name], other[name] } if block_given?
699
+ self
700
+ end
701
+
702
+ #===名前-スプライトの対を繰り返し取得する
703
+ #インスタンスを配列化し、周回して要素を取得できるEnumeratorを生成する
704
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).cycle
705
+ # =>pair(:a),pair(:b),pair(:c),pair(:a),pair(:b),pair(:c),pair(:a)...
706
+ #返却値:: 生成されたEnumerator
707
+ def cycle(&block)
708
+ self.to_a.cycle(&block)
709
+ end
710
+
711
+ #===名前の順番をシャッフルしたSpriteListを返す
712
+ #自分自身を複製し、登録されている名前の順番をシャッフルして返す
713
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
714
+ # a.shuffle
715
+ # =>SpriteList(pair(:a),pair(:b),pair(:c)) or SpriteList(pair(:a),pair(:c),pair(:b)) or
716
+ # SpriteList(pair(:b),pair(:a),pair(:c)) or SpriteList(pair(:b),pair(:c),pair(:a)) or
717
+ # SpriteList(pair(:c),pair(:a),pair(:b)) or SpriteList(pair(:c),pair(:b),pair(:a))
718
+ # a=SpriteList(pair(:a),pair(:b),pair(:c))
719
+ #返却値:: シャッフルした自分自身の複製
720
+ def shuffle
721
+ self.dup.shuffle!
722
+ end
723
+
724
+ #===名前の順番をシャッフルする
725
+ #自分自身で登録されている名前の順番をシャッフルする
726
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
727
+ # a.shuffle!
728
+ # =>a=SpriteList(pair(:a),pair(:b),pair(:c)) or SpriteList(pair(:a),pair(:c),pair(:b)) or
729
+ # SpriteList(pair(:b),pair(:a),pair(:c)) or SpriteList(pair(:b),pair(:c),pair(:a)) or
730
+ # SpriteList(pair(:c),pair(:a),pair(:b)) or SpriteList(pair(:c),pair(:b),pair(:a))
731
+ #返却値:: シャッフルした自分自身
732
+ def shuffle!
733
+ @names.shuffle!
734
+ self
735
+ end
736
+
737
+ #===自身から要素をランダムに選ぶ
738
+ #自分自身を配列化(to_ary)し、最大n個の要素(ListPair)をランダムに選び出して配列として返す
739
+ #自分自身が空のときは、n=nilのときはnilを、n!=nilのときは空配列を返す
740
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
741
+ # a.sample(1)
742
+ # =>[pair(:a)] or [pair(:b)] or [pair(:c)]
743
+ # a.sample(2)
744
+ # =>[pair(:a),pair(:b)] or [pair(:a),pair(:c)] or
745
+ # [pair(:b),pair(:a)] or [pair(:b),pair(:c)] or
746
+ # [pair(:c),pair(:a)] or [pair(:c),pair(:b)]
747
+ # a.sample(3)
748
+ # =>[pair(:a),pair(:b),pair(:c)] or [pair(:a),pair(:c),pair(:b)] or
749
+ # [pair(:b),pair(:a),pair(:c)] or [pair(:b),pair(:c),pair(:a)] or
750
+ # [pair(:c),pair(:a),pair(:b)] or [pair(:c),pair(:b),pair(:a)]
751
+ #_n_:: 選び出す個数。n=nilのときは1個とみなす
752
+ #返却値:: 選び出したListPairを配列化したもの
753
+ def sample(n=nil)
754
+ n ? self.to_a.sample(n) : self.to_a.sample
755
+ end
756
+
757
+ #===自身での組み合わせを配列として返す
758
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
759
+ # a.combination(1)
760
+ # =>[[pair(:a)],[pair(:b)],[pair(:c)]]
761
+ # a.combination(2)
762
+ # =>[[pair(:a),pair(:b)],[pair(:a),pair(:c)],[pair(:b),pair(:c)]]
763
+ # a.combination(3)
764
+ # =>[[pair(:a),pair(:b),pair(:c)]]
765
+ #自分自身を配列化(to_ary)し、サイズnの組み合わせをすべて求めて配列化したものを
766
+ #Enumeratorとして返す
767
+ #_n_:: 組み合わせのサイズ
768
+ #返却値:: Enumerator(ただしブロックを渡すと配列)
769
+ def combination(n, &block)
770
+ self.to_a.combination(n, &block)
771
+ end
772
+
773
+ #===自身での順列を配列として返す
774
+ #自分自身を配列化(to_ary)し、サイズnの順列をすべて求めて配列化したものを
775
+ #Enumeratorとして返す
776
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
777
+ # a.permutation(1)
778
+ # =>[[pair(:a)],[pair(:b)],[pair(:c)]]
779
+ # a.permutation(2)
780
+ # =>[[pair(:a),pair(:b)],[pair(:a),pair(:c)],
781
+ # [pair(:b),pair(:a)],[pair(:b),pair(:c)],
782
+ # [pair(:c),pair(:a)],[pair(:c),pair(:b)]]
783
+ # a.permutation(3)
784
+ # =>[[pair(:a),pair(:b),pair(:c)],[pair(:a),pair(:c),pair(:b)],
785
+ # [pair(:b),pair(:a),pair(:c)],[pair(:b),pair(:c),pair(:a)],
786
+ # [pair(:c),pair(:a),pair(:b)],[pair(:c),pair(:b),pair(:a)]]
787
+ #_n_:: 順列のサイズ
788
+ #返却値:: Enumerator(ただしブロックを渡すと配列)
789
+ def permutation(n, &block)
790
+ self.to_a.permutation(n, &block)
791
+ end
792
+
793
+ private :reflesh
794
+
795
+ #===内容を引数のものに置き換える
796
+ #現在登録されているデータをいったん解除し、
797
+ #引数として渡ってきたSpriteListの無いようにデータを置き換える
798
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
799
+ # a.replace(SpriteList(pair(:e),pair(:f),pair(:g),pair(:h)))
800
+ # =>a=SpriteList(pair(:e),pair(:f),pair(:g),pair(:h))
801
+ #_other_:: 置き換え元のSpriteList
802
+ #返却値:: 置き換えた自分自身
803
+ def replace(other)
804
+ self.clear
805
+ other.to_a.each{|pair| self.add(pair[0], pair[1].dup)}
806
+ self
807
+ end
808
+
809
+ #===名前の順番を反転する
810
+ #名前の順番を反転した、自分自身のコピーを生成する
811
+ #例:a=SpriteList(pari(:a),pair(:b),pair(:c),pair(:d))
812
+ # a.reverse
813
+ # =>SpriteList(pari(:d),pair(:c),pair(:b),pair(:a))
814
+ # a=SpriteList(pari(:a),pair(:b),pair(:c),pair(:d))
815
+ #返却値:: 名前を反転させた自分自身の複製を返す
816
+ def reverse
817
+ ret = self.dup
818
+ ret.reverse!
819
+ end
820
+
821
+ #===名前の順番を破壊的に反転する
822
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
823
+ # a.reverse!
824
+ # =>SpriteList(pair(:d),pair(:c),pair(:b),pair(:a))
825
+ # a=SpriteList(pair(:d),pair(:c),pair(:b),pair(:a))
826
+ #返却値:: 自分自身を帰す
827
+ def reverse!
828
+ @names.reverse!
829
+ return self
830
+ end
831
+
832
+ #===名前と関連付けられたスプライトを取得する
833
+ #関連付けられているスプライトが見つからなければnilが返る
834
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
835
+ # a[:c] => spr(:c)
836
+ # a[:q] => nil
837
+ #_name_:: 名前
838
+ #返却値:: 名前に関連付けられたスプライト
839
+ def [](name)
840
+ return @n2v[name].body
841
+ end
842
+
843
+ #===名前と関連付けられたスプライトを置き換える
844
+ #名前に対応したスプライトを、引数で指定したものに置き換える。
845
+ #ただし、まだ名前が登録されていないときは、新規追加と同じになる。
846
+ #新規追加のときはSpriteList#pushと同じ
847
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))[:e]=spr(:e)
848
+ # => SpriteList(pair(:a),pair(:b),pair(:c),pair(:d),pair(:e))
849
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))[:b]=spr(:b2)
850
+ # => SpriteList(pair(:a),pair(:b2),pair(:c),pair(:d))
851
+ #_name_:: 名前
852
+ #_sprite_:: スプライト
853
+ #返却値:: 登録された自分自身
854
+ def []=(name, sprite)
855
+ return self.push([name, sprite]) unless @names.include?(name)
856
+ @n2v[name] = ListPair.new(name, sprite)
857
+ return self
858
+ end
859
+
860
+ #===名前の一覧から新しいSpriteListを生成する
861
+ #リストの順番はnamesの順番と同じ
862
+ #自分自身に登録されていない名前があったときはnilが登録される
863
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).pairs_at(:b, :d)
864
+ # => [pair(:b),pair(:d)]
865
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).pairs_at(:b, :e)
866
+ # => [pair(:b),nil]
867
+ #_names_:: 取り出した名前のリスト名前
868
+ #返却値:: 生成されたSpriteList
869
+ def pairs_at(*names)
870
+ ret = SpriteList.new
871
+ names.each{|name| ret[name] = @n2v[name]}
872
+ ret
873
+ end
874
+
875
+ #===名前の一覧から本体のリストを生成する
876
+ #本体のみの配列を返す。要素の順番はnamesの順番と同じ
877
+ #自分自身に登録されていない名前があったときはnilが登録される
878
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).values_at(:b, :d)
879
+ # => [spr(:b),spr(:d)]
880
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).values_at(:b, :e)
881
+ # => [spr(:b),nil]
882
+ #_names_:: 取り出した名前のリスト名前
883
+ #返却値:: 生成された配列
884
+ def values_at(*names)
885
+ names.map{|name| @n2v[name].body }
886
+ end
887
+
888
+ #===SpriteListを配列化し、同じ位置の要素を一つの配列にまとめる
889
+ #自分自身に登録されていない名前があったときはnilが登録される
890
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(SpriteList(pair(:d),pair(:e),pair(:f))
891
+ # => [[pair(:a),pair(:d)],[pair(:b),pair(:e)],[pair(:c),pair(:f)]]
892
+ #例:SpriteList(pair(:a),pair(:b)).zip(SpriteList(pair(:d),pair(:e),pair(:f))
893
+ # => [[pair(:a),pair(:d)],[pair(:b),pair(:e)]]
894
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(SpriteList(pair(:d),pair(:e))
895
+ # => [[pair(:a),pair(:d)],[pair(:b),pair(:e)],[pair(:c),nil]]
896
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(
897
+ # SpriteList(pair(:d),pair(:e),pair(:f),
898
+ # SpriteList(pair(:g),pair(:h),pair(:i))
899
+ # => [[pair(:a),pair(:d),pair(:g)],[pair(:b),pair(:e),pair(:h)],[pair(:c),pair(:f),pair(:i)]]
900
+ #_names_:: 取り出した名前のリスト名前
901
+ #返却値:: 生成されたSpriteList
902
+ def zip(*lists, &block)
903
+ lists = lists.map{|list| list.to_a}
904
+ self.to_a.zip(*lists, &block)
905
+ end
906
+
907
+ #===各要素の位置を変更する(変化量を指定)
908
+ #ブロックを渡したとき、戻り値として[更新したdx,更新したdy]とした配列を返すと、
909
+ #それがその要素での移動量となる。
910
+ #ブロックの引数は、|ListPair, インデックス(0,1,2,...), dx, dy|となる。
911
+ #(例)a=SpriteList(pair(:a), pair(:b), pair(:c))
912
+ # #各スプライトの位置=すべて(10,15)
913
+ # a.move!(20,25) => pair(:a)の位置:(30,40)
914
+ # pair(:b)の位置:(30,40)
915
+ # pair(:c)の位置:(30,40)
916
+ # a.move!(20,25){|pair,i,dx,dy|
917
+ # [i*dx, i*dy]
918
+ # }
919
+ # => pair(:a)の位置:(10,15)
920
+ # pair(:b)の位置:(30,40)
921
+ # pair(:c)の位置:(50,65)
922
+ #_dx_:: 移動量(x方向)。単位はピクセル
923
+ #_dy_:: 移動量(y方向)。単位はピクセル
924
+ #返却値:: 自分自身を返す
925
+ def move!(dx, dy)
926
+ if block_given?
927
+ @names.each_with_index{|e, i|
928
+ pair = @n2v[e]
929
+ pair.move!(*(yield pair, i, dx, dy))
930
+ }
931
+ else
932
+ @names.each{|e| @n2v[e].move!(dx, dy) }
933
+ end
934
+ self
935
+ end
936
+
937
+ #===各要素の位置を変更する(変化量を指定)
938
+ #ブロックを渡したとき、戻り値として[更新したdx,更新したdy]とした配列を返すと、
939
+ #それがその要素での移動量となる。
940
+ #ブロックの引数は、|ListPair, インデックス(0,1,2,...), x, y|となる。
941
+ #(例)a=SpriteList(pair(:a), pair(:b), pair(:c))
942
+ # #各スプライトの位置=すべて(10,15)
943
+ # a.move!(20,25) => pair(:a)の位置:(20,25)
944
+ # pair(:b)の位置:(20,25)
945
+ # pair(:c)の位置:(20,25)
946
+ # a.move!(20,25){|pair,i,dx,dy|
947
+ # [i*dx, i*dy]
948
+ # }
949
+ # => pair(:a)の位置:( 0, 0)
950
+ # pair(:b)の位置:(20,25)
951
+ # pair(:c)の位置:(40,50)
952
+ #_x_:: 移動先位置(x方向)。単位はピクセル
953
+ #_y_:: 移動先位置(y方向)。単位はピクセル
954
+ #返却値:: 自分自身を返す
955
+ def move_to!(x, y)
956
+ if block_given?
957
+ @names.each_with_index{|e, i|
958
+ pair = @n2v[e]
959
+ pair.move_to!(*(yield pair, i, x, y))
960
+ }
961
+ else
962
+ @names.each{|e| @n2v[e].move_to!(x, y) }
963
+ end
964
+ self
965
+ end
966
+
967
+ #===リストを配列化する
968
+ #インスタンスの内容を元に、配列を生成する。
969
+ #各要素は、ListPair構造体
970
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).to_a
971
+ # => [pair(:a),pair(:b),pair(:c)]
972
+ #返却値:: 生成した配列
973
+ def to_a
974
+ self.to_ary
975
+ end
976
+
977
+ #===リストを配列化する
978
+ #インスタンスの内容を元に、配列を生成する。
979
+ #各要素は、ListPair構造体
980
+ #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).to_ary
981
+ # => [pair(:a),pair(:b),pair(:c)]
982
+ #返却値:: 生成した配列
983
+ def to_ary
984
+ @names.map{|name| @n2v[name]}
985
+ end
986
+
987
+ #===スプライト名とスプライト本体とのハッシュを取得する
988
+ #スプライト名とスプライト本体が対になったハッシュを作成して返す
989
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).to_hash
990
+ # => {:a=>spr(:a),:b=>spr(:b),:c=>spr(:c)}
991
+ #返却値:: 生成したハッシュ
992
+ def to_hash
993
+ @n2v.dup
994
+ end
995
+
996
+ #===リストの中身を消去する
997
+ #リストに登録されているスプライト名・スプライト本体への登録を解除する
998
+ def clear
999
+ @names.clear
1000
+ @n2v.clear
1001
+ end
1002
+
1003
+ #===オブジェクトを解放する
1004
+ def dispose
1005
+ @names.clear
1006
+ @names = nil
1007
+ @n2v.clear
1008
+ @n2v = nil
1009
+ end
1010
+
1011
+ #===名前に対して値を渡す
1012
+ #仕様はHash#fetchと同じ
1013
+ def fetch(name, default = nil, &block)
1014
+ @n2v.fetch(name, default, &block)
1015
+ end
1016
+
1017
+ #===指定の名前の直前に名前を挿入する
1018
+ #配列上で、keyの前にnameを挿入する
1019
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert(:b, :d, spr(:d))
1020
+ # => SpriteList(pair(:a),pair(:d),pair(:b),pair(:c))
1021
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert(:c, :a)
1022
+ # => SpriteList(pair(:c),pair(:a),pair(:b))
1023
+ #_key_:: 挿入先の名前。この名前の直前に挿入する
1024
+ #_name_:: 挿入するスプライトの名前
1025
+ #_value_:: (名前が未登録の時の)スプライト本体省略時はnil
1026
+ #返却値:自分自身を返す
1027
+ def insert(key, name, value = nil)
1028
+ raise MiyakoValueError, "Illegal key! : #{key}" unless @names.include?(key)
1029
+ return self if key == name
1030
+ if value
1031
+ @n2v[name] = ListPair.new(name, value)
1032
+ else
1033
+ raise MiyakoValueError, "name is not regist! : #{name}" unless @names.include?(name)
1034
+ end
1035
+ @names.delete(name) if @names.include?(name)
1036
+ @names.insert(@names.index(key), name)
1037
+ self
1038
+ end
1039
+
1040
+ #===指定の名前の直後に名前を挿入する
1041
+ #配列上で、keyの後ろにnameを挿入する
1042
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert_after(:b, :d, spr(:d))
1043
+ # => SpriteList(pair(:a),pair(:b),,pair(:d)pair(:c))
1044
+ #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert_after(:c, :b)
1045
+ # => SpriteList(pair(:a),pair(:c),pair(:b))
1046
+ #_key_:: 挿入先の名前。この名前の直後に挿入する
1047
+ #_name_:: 挿入するスプライトの名前
1048
+ #_value_:: (名前が未登録の時の)スプライト本体省略時はnil
1049
+ #返却値:自分自身を返す
1050
+ def insert_after(key, name, value = nil)
1051
+ raise MiyakoValueError, "Illegal key! : #{key}" unless @names.include?(key)
1052
+ return self if key == name
1053
+ if value
1054
+ @n2v[name] = ListPair.new(name, value)
1055
+ else
1056
+ raise MiyakoValueError, "name is not regist! : #{name}" unless @names.include?(name)
1057
+ end
1058
+ @names.delete(name) if @names.include?(name)
1059
+ @names.insert(@names.index(key)-@names.length, name)
1060
+ self
1061
+ end
1062
+
1063
+ #===指定した要素の内容を入れ替える
1064
+ #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).insert(:b, :d)
1065
+ # => SpriteList(pair(:a),pair(:d),pair(:c),pair(:b))
1066
+ #_name1,name_:: 入れ替え対象の名前
1067
+ #返却値:: 自分自身を帰す
1068
+ def swap(name1, name2)
1069
+ raise MiyakoValueError, "Illegal name! : idx1:#{name1}" unless @names.include?(name1)
1070
+ raise MiyakoValueError, "Illegal name! : idx2:#{name2}" unless @names.include?(name2)
1071
+ idx1 = @names.index(name1)
1072
+ idx2 = @names.index(name2)
1073
+ @names[idx1], @names[idx2] = @names[idx2], @names[idx1]
1074
+ return self
1075
+ end
1076
+
1077
+ #===各要素のアニメーションを開始する
1078
+ #各要素のstartメソッドを呼び出す
1079
+ #返却値:: 自分自身を返す
1080
+ def start
1081
+ self.sprite_only.each{|pair| pair[1].start }
1082
+ return self
1083
+ end
1084
+
1085
+ #===各要素のアニメーションを停止する
1086
+ #各要素のstopメソッドを呼び出す
1087
+ #返却値:: 自分自身を返す
1088
+ def stop
1089
+ self.sprite_only.each{|pair| pair[1].stop }
1090
+ return self
1091
+ end
1092
+
1093
+ #===各要素のアニメーションを先頭パターンに戻す
1094
+ #各要素のresetメソッドを呼び出す
1095
+ #返却値:: 自分自身を返す
1096
+ def reset
1097
+ self.sprite_only.each{|pair| pair[1].reset }
1098
+ return self
1099
+ end
1100
+
1101
+ #===各要素のアニメーションを更新する
1102
+ #各要素のupdate_animationメソッドを呼び出す
1103
+ #返却値:: 各要素のupdate_spriteメソッドを呼び出した結果を配列で返す
1104
+ def update_animation
1105
+ self.sprite_only.map{|pair| pair[1].update_animation }
1106
+ end
1107
+
1108
+ #===配列の要素を画面に描画する
1109
+ #配列の先頭から順にrenderメソッドを呼び出す。
1110
+ #返却値:: 自分自身を帰す
1111
+ def render
1112
+ return self unless @visible
1113
+ self.sprite_only.each{|pair| pair[1].render }
1114
+ return self
1115
+ end
1116
+
1117
+ #===配列の要素を対象の画像に描画する
1118
+ #配列の先頭から順にrender_toメソッドを呼び出す。
1119
+ #_dst_:: 描画対象の画像インスタンス
1120
+ #返却値:: 自分自身を帰す
1121
+ def render_to(dst)
1122
+ return self unless @visible
1123
+ self.sprite_only.each{|pair| pair[1].render_to(dst) }
1124
+ return self
1125
+ end
1126
+
1127
+ #===オブジェクトを文字列に変換する
1128
+ #いったん、名前とスプライトとの対の配列に変換し、to_sメソッドで文字列化する。
1129
+ #例:[[name1, sprite1], [name2, sprite2],...]
1130
+ #返却値:: 変換した文字列
1131
+ def to_s
1132
+ self.to_a.to_s
1133
+ end
1134
+ end
1135
+ end