ruby-miyako 2.1.0 → 2.1.1

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 (72) hide show
  1. data/README +275 -20
  2. data/extern.h +21 -1
  3. data/install_miyako.rb +5 -3
  4. data/lib/Miyako/API/audio.rb +11 -6
  5. data/lib/Miyako/API/basic_data.rb +0 -985
  6. data/lib/Miyako/API/bitmap.rb +19 -22
  7. data/lib/Miyako/API/choices.rb +203 -69
  8. data/lib/Miyako/API/collision.rb +451 -9
  9. data/lib/Miyako/API/color.rb +177 -0
  10. data/lib/Miyako/API/diagram.rb +18 -20
  11. data/lib/Miyako/API/fixedmap.rb +207 -73
  12. data/lib/Miyako/API/font.rb +111 -18
  13. data/lib/Miyako/API/i_yuki.rb +1201 -0
  14. data/lib/Miyako/API/input.rb +65 -0
  15. data/lib/Miyako/API/layout.rb +41 -29
  16. data/lib/Miyako/API/map.rb +202 -157
  17. data/lib/Miyako/API/map_event.rb +86 -19
  18. data/lib/Miyako/API/map_struct.rb +268 -0
  19. data/lib/Miyako/API/modules.rb +136 -37
  20. data/lib/Miyako/API/movie.rb +8 -8
  21. data/lib/Miyako/API/parts.rb +63 -20
  22. data/lib/Miyako/API/plane.rb +4 -4
  23. data/lib/Miyako/API/screen.rb +16 -8
  24. data/lib/Miyako/API/sprite.rb +290 -23
  25. data/lib/Miyako/API/sprite_animation.rb +23 -11
  26. data/lib/Miyako/API/sprite_list.rb +406 -183
  27. data/lib/Miyako/API/story.rb +4 -65
  28. data/lib/Miyako/API/struct_point.rb +157 -0
  29. data/lib/Miyako/API/struct_rect.rb +233 -0
  30. data/lib/Miyako/API/struct_segment.rb +641 -0
  31. data/lib/Miyako/API/struct_size.rb +158 -0
  32. data/lib/Miyako/API/struct_square.rb +253 -0
  33. data/lib/Miyako/API/textbox.rb +49 -35
  34. data/lib/Miyako/API/viewport.rb +5 -5
  35. data/lib/Miyako/API/wait_counter.rb +350 -0
  36. data/lib/Miyako/API/yuki.rb +95 -60
  37. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  38. data/lib/Miyako/EXT/slides.rb +6 -6
  39. data/lib/Miyako/miyako.rb +25 -11
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/miyako_basicdata.c +201 -17
  43. data/miyako_collision.c +315 -6
  44. data/miyako_diagram.c +331 -0
  45. data/miyako_drawing.c +26 -7
  46. data/miyako_font.c +259 -129
  47. data/miyako_input_audio.c +24 -14
  48. data/miyako_layout.c +106 -8
  49. data/miyako_no_katana.c +398 -171
  50. data/miyako_sprite2.c +275 -38
  51. data/miyako_transform.c +113 -107
  52. data/miyako_utility.c +34 -48
  53. data/miyako_yuki.c +241 -0
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  55. data/sample/Room3/blue.rb +19 -19
  56. data/sample/Room3/green.rb +9 -9
  57. data/sample/Room3/main.rb +12 -12
  58. data/sample/Room3/red.rb +12 -12
  59. data/sample/Room3/title.rb +15 -10
  60. data/sample/collision_test2.rb +2 -1
  61. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  62. data/sample/map_test/main_scene.rb +12 -10
  63. data/sample/map_test/map_manager.rb +14 -13
  64. data/sample/rasterscroll.rb +5 -5
  65. data/sample/takahashi.rb +3 -3
  66. data/sample/textbox_sample.rb +7 -6
  67. data/sample/transform.rb +2 -1
  68. data/uninstall_miyako.rb +4 -1
  69. data/win/miyako_no_katana.so +0 -0
  70. metadata +15 -4
  71. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  72. data/sample/cairo_sample.rb +0 -25
@@ -26,32 +26,33 @@ module Miyako
26
26
  class ListPairStruct < Struct
27
27
  include SpriteBase
28
28
  include Animation
29
+ include Layout
29
30
 
30
31
  # ディープコピー
31
32
  def deep_dup
32
33
  [self[0], self[1].dup]
33
34
  end
34
-
35
+
35
36
  # ディープコピー
36
37
  def deep_clone
37
38
  self.deep_copy
38
39
  end
39
-
40
+
40
41
  # 構造体を配列に変換する
41
42
  def to_ary
42
43
  [self[0], self[1]]
43
44
  end
44
-
45
+
45
46
  # 構造体を配列に変換する
46
47
  def to_a
47
48
  self.to_ary
48
49
  end
49
-
50
+
50
51
  # 構造体を文字列に変換する
51
52
  def to_s
52
53
  "#{self[0]} : #{self[1]}"
53
54
  end
54
-
55
+
55
56
  #===スプライトの移動(変化量を指定)
56
57
  #_dx_:: 移動量(x方向)。単位はピクセル
57
58
  #_dy_:: 移動量(y方向)。単位はピクセル
@@ -69,7 +70,7 @@ module Miyako
69
70
  self[1].move_to!(x, y)
70
71
  self
71
72
  end
72
-
73
+
73
74
  #===本体のアニメーションを開始する
74
75
  #各要素のstartメソッドを呼び出す
75
76
  #返却値:: 自分自身を返す
@@ -77,7 +78,7 @@ module Miyako
77
78
  self[1].start
78
79
  return self
79
80
  end
80
-
81
+
81
82
  #===本体のアニメーションを停止する
82
83
  #各要素のstopメソッドを呼び出す
83
84
  #返却値:: 自分自身を返す
@@ -85,7 +86,7 @@ module Miyako
85
86
  self[1].stop
86
87
  return self
87
88
  end
88
-
89
+
89
90
  #===本体のアニメーションを先頭パターンに戻す
90
91
  #各要素のresetメソッドを呼び出す
91
92
  #返却値:: 自分自身を返す
@@ -93,7 +94,7 @@ module Miyako
93
94
  self[1].reset
94
95
  return self
95
96
  end
96
-
97
+
97
98
  #===本体のアニメーションを更新する
98
99
  #各要素のupdate_animationメソッドを呼び出す
99
100
  #返却値:: 本体のupdate_spriteメソッドを呼び出した結果
@@ -105,14 +106,14 @@ module Miyako
105
106
  def render
106
107
  self[1].render
107
108
  end
108
-
109
+
109
110
  #指定の画像に描画する
110
111
  #_dst_:: 描画先インスタンス
111
112
  def render_to(dst)
112
113
  self[1].render_to(dst)
113
114
  end
114
115
  end
115
-
116
+
116
117
  #===名前-本体ペアを構成する構造体
117
118
  #ハッシュのようにキー・バリュー構成を持たせるための構造体
118
119
  #_name_:: 名前
@@ -132,10 +133,11 @@ module Miyako
132
133
  class SpriteList
133
134
  include SpriteBase
134
135
  include Animation
136
+ include Layout
135
137
  include Enumerable
136
138
 
137
139
  attr_accessor :visible
138
-
140
+
139
141
  #===ハッシュを元にSpriteListを生成する
140
142
  #ハッシュのキーをスプライト名にして生成する
141
143
  #_hash_:: 生成元のハッシュ
@@ -144,7 +146,7 @@ module Miyako
144
146
  body = SpriteList.new
145
147
  hash.each{|k, v| body.push(k ,v)}
146
148
  end
147
-
149
+
148
150
  #===ハッシュを元にSpriteListを生成する
149
151
  #引数を省略すると空のSpriteListを生成する。
150
152
  #要素が[スプライト名,スプライト]の配列となる配列を引数として渡すこともできる。
@@ -154,50 +156,47 @@ module Miyako
154
156
  #_pairs_:: 生成元のインスタンス
155
157
  #返却値:: 生成したインスタンス
156
158
  def initialize(pairs = nil)
157
- @names = []
158
- @n2v = {}
159
+ @list = []
159
160
  if pairs.is_a?(Array)
160
161
  pairs.each_with_index{|pair, i|
161
- if pair.is_a?(Array)
162
- @names << pair[0]
163
- @n2v[pair[0]] = ListPair.new(*pair)
162
+ if pair.is_a?(Array) || pair.is_a?(ListPair)
163
+ @list << ListPair.new(*pair)
164
164
  else
165
165
  name = sprintf("s_%03d", i).to_sym
166
- @names << name
167
- @n2v[name] = ListPair.new(name, pair)
166
+ @list << ListPair.new(name, pair)
168
167
  end
169
168
  }
170
169
  elsif pairs.is_a?(Hash)
171
170
  pairs.each{|key, value|
172
- @names << key
173
- @n2v[key] = ListPair.new(key, value)
171
+ @list << ListPair.new(key, value)
174
172
  }
175
173
  end
176
174
  @visible = true
177
175
  end
178
-
176
+
179
177
  #===内部で使用している配列などを新しいインスタンスに置き換える
180
178
  #initialize_copy用で元・新インスタンスで配列などを共用している場合に対応
181
179
  def reflesh
182
- @names = []
183
- @n2v = {}
180
+ @list = []
184
181
  end
185
-
182
+
186
183
  def initialize_copy(obj) #:nodoc:
187
184
  reflesh
188
185
  obj.names.each{|name| self.push([name, obj[name].deep_dup]) }
189
186
  @visible = obj.visible
190
187
  end
191
-
188
+
192
189
  #===スプライト以外のインスタンスを削除したSpriteListを生成する
193
190
  #新しいSpriteListを作成し、本体がnilや、SpriteBaseもしくはSpritArrayモジュールを
194
191
  #mixinしていない対を削除する。
195
192
  #返却値:: 新しく生成したインスタンス
196
193
  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)
194
+ ret = SpriteList.new
195
+ @list.each{|pair|
196
+ name = pair.name
197
+ body = pair.body
198
+ ret[name] = pair.value if !body.class.include?(SpriteBase) &&
199
+ !body.class.include?(SpriteArray)
201
200
  }
202
201
  return ret
203
202
  end
@@ -207,11 +206,10 @@ module Miyako
207
206
  #mixinしていない対を削除する。
208
207
  #返却値:: 自分自身を帰す
209
208
  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)
209
+ @list.each{|pair|
210
+ if !pair.body.class.include?(SpriteBase) &&
211
+ !pair.body.class.include?(SpriteArray)
212
+ @list.delete(pair)
215
213
  end
216
214
  }
217
215
  return self
@@ -222,112 +220,129 @@ module Miyako
222
220
  #名前が登録されている順に渡ってくる
223
221
  #返却値:: 自分自身を帰す
224
222
  def each
223
+ return self.to_enum(:each) unless block_given?
225
224
  self.to_a.each{|pair| yield pair}
226
225
  end
227
-
226
+
228
227
  #===ブロックを受け取り、スプライト名リストの各要素にたいして処理を行う
229
228
  #ブロック引数には、|スプライト名,スプライト本体|が渡ってくる
230
229
  #名前が登録されている順に渡ってくる
231
230
  #返却値:: 自分自身を帰す
232
231
  def each_pair
233
- @names.each{|name| yield *@n2v[name]}
232
+ return self.to_enum(:each_pair) unless block_given?
233
+ @list.each{|pair| yield *pair}
234
234
  end
235
-
235
+
236
236
  #===ブロックを受け取り、名前リストの各要素にたいして処理を行う
237
237
  #ブロック引数には、|スプライト名|が渡ってくる
238
238
  #名前が登録されている順に渡ってくる
239
239
  #返却値:: 自分自身を帰す
240
240
  def each_name
241
- @names.each{|name| yield name}
241
+ return self.to_enum(:each_name) unless block_given?
242
+ @list.each{|pair| yield pair.name}
242
243
  end
243
-
244
+
244
245
  #===ブロックを受け取り、値リストの各要素にたいして処理を行う
245
246
  #ブロック引数には、|スプライト本体|の配列として渡ってくる
246
247
  #名前が登録されている順に渡ってくる
247
248
  #返却値:: 自分自身を帰す
248
249
  def each_value
249
- @names.each{|name| yield @n2v[name].body}
250
+ return self.to_enum(:each_value) unless block_given?
251
+ @list.each{|pair| yield pair.body}
250
252
  end
251
-
253
+
252
254
  #===ブロックを受け取り、配列インデックスにたいして処理を行う
253
255
  #ブロック引数には、|スプライト名に対応する配列インデックス|の配列として渡ってくる
254
256
  #0,1,2,...の順に渡ってくる
255
257
  #返却値:: 自分自身を帰す
256
258
  def each_index
257
- @names.length.times{|idx| yield idx}
259
+ return self.to_enum(:each_index) unless block_given?
260
+ @list.length.times{|idx| yield idx}
258
261
  end
259
-
262
+
263
+ #===スプライト名配列を取得する
264
+ #SpriteList#show,hideメソッドを呼び出す際、すべての要素を表示・非表示にするときに使う
265
+ #返却値:: スプライト名配列
266
+ def all
267
+ @list.map{|pair| pair.name }
268
+ end
269
+
260
270
  #===スプライト名配列を取得する
261
271
  #名前が登録されている順に渡ってくる
262
272
  #返却値:: スプライト名配列
263
273
  def names
264
- @names
274
+ @list.map{|pair| pair.name }
265
275
  end
266
-
276
+
267
277
  #===スプライト配列を取得する
268
278
  #名前が登録されている順に渡ってくる
269
279
  #返却値:: スプライト本体配列
270
280
  def values
271
- @names.map{|name| @n2v[name].body}
281
+ @list.map{|pair| pair.body }
272
282
  end
273
-
283
+
274
284
  #===名前-本体ペア配列を取得する
275
285
  #名前が登録されている順にListPair構造体の構造体を構成して返す
276
286
  #返却値:: ListPair構造体の配列
277
287
  def pairs
278
- @names.map{|name| @n2v[name].body}
288
+ @list
279
289
  end
280
-
290
+
281
291
  #===リストが空っぽかどうか確かめる
282
292
  #リストに何も登録されていないかどうか確かめる
283
293
  #返却値:: 空っぽの時はtrue、なにか登録されているときはfalse
284
294
  def empty?
285
- @names.empty?
295
+ @list.empty?
296
+ end
297
+
298
+ def index(pair)
299
+ @list.index(pair)
286
300
  end
287
301
 
288
302
  #===内容が同じかどうか比較する
289
303
  #リストに含まれるスプライト名(順番も)・値が同じかどうか比較する
290
304
  #返却値:: 同じときはtrue、違うときはfalseを返す
291
305
  def eql?(other)
292
- @names.map{|name|
293
- self.index(name) == other.index(name) &&
294
- @n2v[name].body.eql?(other[name].body)
295
- }.all?
306
+ return false unless other.class.method_defined?(:index)
307
+ @list.find{|pair|
308
+ self.index(pair) == other.index(pair) &&
309
+ pair.body.eql?(other[pair.name].body)
310
+ } != nil
296
311
  end
297
-
312
+
298
313
  #===リストに名前が登録されているか確認する
299
314
  #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
300
315
  #(include?メソッドと同じ)
301
316
  #_name_:: 検索対象の名前
302
317
  #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
303
318
  def has_key?(name)
304
- @n2v.has_key?(name)
319
+ self.names.include?(name)
305
320
  end
306
-
321
+
307
322
  #===リストに名前が登録されているか確認する
308
323
  #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
309
324
  #(include?メソッドと同じ)
310
325
  #_name_:: 検索対象の名前
311
326
  #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
312
327
  def has_name?(name)
313
- @n2v.has_key?(name)
328
+ self.names.include?(name)
314
329
  end
315
-
330
+
316
331
  #===リストに名前が登録されているか確認する
317
332
  #スプライト名リスト内に、引数で指定した名前が含まれているか調べる
318
333
  #(has_name?メソッドと同じ)
319
334
  #_name_:: 検索対象の名前
320
335
  #返却値:: 名前が含まれていればtrue、含まれていなければfalseと返す
321
336
  def include?(name)
322
- @names.has_key?(name)
337
+ self.names.include?(name)
323
338
  end
324
-
339
+
325
340
  #===リストにスプライトが登録されているか確認する
326
341
  #スプライトリスト内に、引数で指定したスプライトが含まれているか調べる
327
342
  #_value_:: 検索対象のスプライト
328
343
  #返却値:: スプライトが含まれていればtrue、含まれていなければfalseと返す
329
344
  def has_value?(value)
330
- @n2v.values.has_value?(value)
345
+ self.values.include?(value)
331
346
  end
332
347
 
333
348
  #===リストの長さを求める
@@ -335,7 +350,7 @@ module Miyako
335
350
  #(sizeメソッドと同じ)
336
351
  #返却値:: リストの要素数(殻のときは0)
337
352
  def length
338
- @names.length
353
+ @list.length
339
354
  end
340
355
 
341
356
  #===リストの長さを求める
@@ -343,7 +358,7 @@ module Miyako
343
358
  #(lengthメソッドと同じ)
344
359
  #返却値:: リストの要素数(殻のときは0)
345
360
  def size
346
- @names.size
361
+ @list.length
347
362
  end
348
363
 
349
364
  #===スプライト名を探し、あればその対を返す
@@ -352,7 +367,7 @@ module Miyako
352
367
  #_name_:: 検索対象のスプライト名
353
368
  #返却値:: 見つかればListPair構造体、無ければnil
354
369
  def assoc(name)
355
- @n2v.assoc(name)
370
+ @list.find(nil){|pair| pair.name == name }
356
371
  end
357
372
 
358
373
  #===スプライトが登録されている名前を求める
@@ -362,40 +377,40 @@ module Miyako
362
377
  #_name_:: 検索対象のスプライト名
363
378
  #返却値:: 名前が見つかったときはそのスプライト名、無ければnil
364
379
  def name(value)
365
- @n2v.key(value)
380
+ @list.find(nil){|pair| pair.value.eql?(value) }
366
381
  end
367
-
382
+
368
383
  #===名前が何番目にあるかを求める
369
384
  #スプライト名リスト中、指定したスプライト名のインデックスを求める
370
385
  #(内部でHash#indexメソッドを呼び出している)
371
386
  #_name_:: 検索対象のスプライト名
372
387
  #返却値:: 名前が見つかったときはそのインデックス(0以上の整数)、無ければnil
373
388
  def index(name)
374
- @names.index(name)
389
+ self.names.index(name)
375
390
  end
376
-
391
+
377
392
  #===リストの先頭要素を求める
378
393
  #リストの先頭からn要素をSpriteListとして返す。
379
394
  #リストが空のとき、nが0のときはnilを返す
380
395
  #_n_:: 先頭からの数。省略時は1
381
396
  #返却値:: 先頭からn個の要素を設定したSpriteList
382
397
  def first(n=1)
383
- return nil if @names.empty?
398
+ return nil if @list.empty?
384
399
  return nil if n == 0
385
- SpriteList.new(@names.first(n).map{|name| [name, @n2v[name]]})
400
+ SpriteList.new(@list.first(n))
386
401
  end
387
-
402
+
388
403
  #===リストの終端要素を求める
389
404
  #リストの終端からn要素をSpriteListとして返す。
390
405
  #リストが空のとき、nが0のときはnilを返す
391
406
  #_n_:: 終端からの数。省略時は1
392
407
  #返却値:: 終端からn個の要素を設定したSpriteList
393
408
  def last(n=1)
394
- return nil if @names.empty?
409
+ return nil if @list.empty?
395
410
  return nil if n == 0
396
- SpriteList.new(@names.last(n).map{|name| [name, @n2v[name]]})
411
+ SpriteList.new(@list.last(n))
397
412
  end
398
-
413
+
399
414
  #===名前・スプライトの対を登録する
400
415
  #リストに名前・スプライトをリストの後ろに追加する
401
416
  #効果はSpriteList#pushと同じ
@@ -404,7 +419,7 @@ module Miyako
404
419
  def <<(pair)
405
420
  self.push(pair)
406
421
  end
407
-
422
+
408
423
  #===引数と自分自身との和集合を取る
409
424
  #otherと自分自身で一方でも割り付けられた名前の本体のみ登録する(方法はpush・addと同じ)
410
425
  #名前がバッティングしたときは引数の本体を優先する
@@ -415,7 +430,7 @@ module Miyako
415
430
  other.to_a.each{|pair| list.add(pair[0], pair[1].dup)}
416
431
  list
417
432
  end
418
-
433
+
419
434
  #===引数と自分自身との積集合を取る
420
435
  #otherと自分自身で両方割り付けられた名前のみ登録されたリストを生成する
421
436
  #内容は自分自身の本体を割り当てる
@@ -426,7 +441,7 @@ module Miyako
426
441
  self.to_a.each{|pair| list.add(pair[0], pair[1].dup) if other.has_key?(pair[0])}
427
442
  list
428
443
  end
429
-
444
+
430
445
  #===引数と自分自身との差集合を取る
431
446
  #otherと自分自身で両方割り付けられた名前を取り除いたリストを生成する
432
447
  #_other_:: 計算をするSpriteList
@@ -436,7 +451,7 @@ module Miyako
436
451
  self.to_a.each{|pair| list.add(pair[0], pair[1].dup) unless other.has_key?(pair[0])}
437
452
  list
438
453
  end
439
-
454
+
440
455
  #===引数と自分自身とのANDを取る
441
456
  #方法は積集合と同じ(#*参照)
442
457
  #_other_:: 計算をするSpriteList
@@ -444,7 +459,7 @@ module Miyako
444
459
  def &(other)
445
460
  self * other
446
461
  end
447
-
462
+
448
463
  #===引数と自分自身とのORを取る
449
464
  #方法は和集合と同じ(#+参照)
450
465
  #_other_:: 計算をするSpriteList
@@ -452,7 +467,7 @@ module Miyako
452
467
  def |(other)
453
468
  self + other
454
469
  end
455
-
470
+
456
471
  #===引数と内容が同じかどうかを確認する
457
472
  #方法は#eql?と同じ(#eql?参照)
458
473
  #_other_:: 比較元SpriteList
@@ -470,7 +485,7 @@ module Miyako
470
485
  def add(name, sprite)
471
486
  self.push([name, sprite])
472
487
  end
473
-
488
+
474
489
  #===名前・スプライトの対を登録する
475
490
  #リストに名前・スプライトをリストの後ろに追加する
476
491
  #効果はSpriteList#addと同じだが、複数の対を登録できることが特徴
@@ -483,22 +498,21 @@ module Miyako
483
498
  unless sprite.class.include?(SpriteBase) || sprite.class.include?(SpriteArray)
484
499
  raise MiyakoValueError, "Illegal Sprite!"
485
500
  end
486
- @names.delete(name) if @names.include?(name)
487
- @names << name
488
- @n2v[name] = ListPair.new(name, sprite)
501
+ pair = ListPair.new(name, sprite)
502
+ @list.reject!{|pair| pair.name == name}
503
+ @list << pair
489
504
  }
490
505
  return self
491
506
  end
492
-
507
+
493
508
  #===リストの終端から名前・スプライトの対を取り出す
494
509
  #リストに名前・スプライトをリストの終端から取り除いて、取り除いた対を返す
495
510
  #返却値:: 終端にあった名前に対応するListPair構造体
496
511
  def pop
497
- return nil if @names.empty?
498
- name = @names.pop
499
- @n2v.delete(name)
512
+ return nil if @list.empty?
513
+ @list.pop
500
514
  end
501
-
515
+
502
516
  #===名前・スプライトを登録する
503
517
  #リストに名前・スプライトをリストの先頭に追加する
504
518
  #(先頭に追加することがSpriteList#<<,add,pushとの違い)
@@ -506,12 +520,11 @@ module Miyako
506
520
  #_sprite_:: スプライト本体
507
521
  #返却値:: 追加した自分自身を渡す
508
522
  def unshift(name, sprite)
509
- @names.delete(name) if @names.include?(name)
510
- @names.unshift(name)
511
- @n2v[name] = ListPair.new(name, sprite)
523
+ @list.reject!{|pair| pair.name == name}
524
+ @list.unshift(ListPair.new(name, sprite))
512
525
  return self
513
526
  end
514
-
527
+
515
528
  #===指定した名前の要素を取り除いたSpriteListを取得する
516
529
  #登録されていない名前が指定されたときは何もしない
517
530
  #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
@@ -527,7 +540,7 @@ module Miyako
527
540
  list = self.dup
528
541
  list.delete_if!{|name, sprite| !names.include?(name)}
529
542
  end
530
-
543
+
531
544
  #===指定した名前の要素を取り除く
532
545
  #登録されていない名前が指定されたときは何もしない
533
546
  #(例)a=SpriteList(pair(:a),pair(:b),pair(:c))
@@ -542,7 +555,7 @@ module Miyako
542
555
  def slice!(*names)
543
556
  self.delete_if!{|name, sprite| !names.include?(name)}
544
557
  end
545
-
558
+
546
559
  #===指定した数の要素を先頭から取り除く
547
560
  #SpriteListの先頭からn個の要素を取り除いて、新しいSpriteListとする。
548
561
  #nがマイナスの時は、後ろからn個の要素を取り除く。
@@ -565,10 +578,9 @@ module Miyako
565
578
  #_n_:: 取り除く要素数。省略時は1
566
579
  #返却値:: 取り除いた要素から作られたSpriteList
567
580
  def shift(n = 1)
568
- return nil if @names.empty?
581
+ return nil if @list.empty?
569
582
  return SpriteList.new if n == 0
570
- names = @names.shift(n)
571
- SpriteList.new(names.map{|name| @n2v.delete(name).to_a})
583
+ SpriteList.new(@list.shift(n))
572
584
  end
573
585
 
574
586
  #===指定した数の要素を先頭から取り除く
@@ -584,11 +596,12 @@ module Miyako
584
596
  # =>a=SpriteList(pair(:a),pair(:b),pair(:c))
585
597
  # b=nil
586
598
  #_n_:: 取り除く要素数。省略時は1
587
- #返却値:: 取り除いた要素から作られたSpriteList
599
+ #返却値:: 取り除いたSpriteListPair
588
600
  def delete(name)
589
- return nil unless @names.include?(name)
590
- @names.delete(name)
591
- SpriteList.new([@n2v.delete(name).to_a])
601
+ pair = @list.find{|pair| pair.name == name}
602
+ return nil unless pair
603
+ @list.delete(pair)
604
+ pair
592
605
  end
593
606
 
594
607
  #===指定したインデックスの要素を取り除く
@@ -606,7 +619,7 @@ module Miyako
606
619
  #_idx_:: 取り除く要素数。省略時は1
607
620
  #返却値:: 取り除いた要素から作られたSpriteList
608
621
  def delete_at(idx)
609
- self.delete(@names[idx])
622
+ self.delete(@list[idx])
610
623
  end
611
624
 
612
625
  #===ブロックの評価結果が真のときのみ削除するSpriteListを作成
@@ -619,7 +632,7 @@ module Miyako
619
632
  #返却値:: 取り除いた後のSpriteList
620
633
  def delete_if
621
634
  ret = self.deep_dup
622
- ret.each{|pair| ret.delete(pair[0]) if yield(*pair)}
635
+ ret.each{|pair| ret.delete(pair) if yield(*pair)}
623
636
  ret
624
637
  end
625
638
 
@@ -633,7 +646,7 @@ module Miyako
633
646
  #返却値:: 取り除いた後のSpriteList
634
647
  def reject
635
648
  ret = self.deep_dup
636
- ret.each{|pair| ret.delete(pair[0]) if yield(*pair)}
649
+ ret.each{|pair| ret.delete(pair) if yield(*pair)}
637
650
  ret
638
651
  end
639
652
 
@@ -646,7 +659,7 @@ module Miyako
646
659
  # b=SpriteList(pair(:b))
647
660
  #返却値:: 取り除いた後のSpriteList
648
661
  def delete_if!
649
- self.each{|pair| self.delete(pair[0]) if yield(*pair)}
662
+ self.each{|pair| self.delete(pair) if yield(*pair)}
650
663
  self
651
664
  end
652
665
 
@@ -659,10 +672,10 @@ module Miyako
659
672
  # b=SpriteList(pair(:b))
660
673
  #返却値:: 取り除いた後のSpriteList
661
674
  def reject!
662
- self.each{|pair| self.delete(pair[0]) if yield(*pair)}
675
+ self.each{|pair| self.delete(pair) if yield(*pair)}
663
676
  self
664
677
  end
665
-
678
+
666
679
  #===別のSpriteListと破壊的につなげる
667
680
  #自分自身にotherで指定したListの要素をつなげる。
668
681
  #ただし、既に自分自身に登録されている要素は追加しない。
@@ -676,7 +689,7 @@ module Miyako
676
689
  other.each{|pair| self.add(pair[0],pair[1].dup) unless self.has_name?(pair[0]) }
677
690
  self
678
691
  end
679
-
692
+
680
693
  #===引数と自分自身との結果をマージする
681
694
  #otherで割り付けられた名前のうち、自分では登録されていないものは新規登録する(方法はpushと同じ)
682
695
  #名前がバッティングしたときは自分自身の本体を優先する
@@ -687,7 +700,7 @@ module Miyako
687
700
  ret.names.each{|name| yield name, self[name], other[name] } if block_given?
688
701
  ret
689
702
  end
690
-
703
+
691
704
  #===自分自身と引数との結果を破壊的にマージする
692
705
  #otherで割り付けられた名前のうち、自分では登録されていないものは新規登録する(方法はpushと同じ)
693
706
  #名前がバッティングしたときは自分自身の本体を優先する
@@ -698,20 +711,21 @@ module Miyako
698
711
  self.names.each{|name| yield name, self[name], other[name] } if block_given?
699
712
  self
700
713
  end
701
-
714
+
702
715
  #===名前-スプライトの対を繰り返し取得する
703
716
  #インスタンスを配列化し、周回して要素を取得できるEnumeratorを生成する
704
717
  #例:a=SpriteList(pair(:a),pair(:b),pair(:c)).cycle
705
718
  # =>pair(:a),pair(:b),pair(:c),pair(:a),pair(:b),pair(:c),pair(:a)...
706
719
  #返却値:: 生成されたEnumerator
707
720
  def cycle(&block)
721
+ return self.to_enum(:cycle) unless block_given?
708
722
  self.to_a.cycle(&block)
709
723
  end
710
724
 
711
725
  #===名前の順番をシャッフルしたSpriteListを返す
712
726
  #自分自身を複製し、登録されている名前の順番をシャッフルして返す
713
727
  #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
714
- # a.shuffle
728
+ # a.shuffle
715
729
  # =>SpriteList(pair(:a),pair(:b),pair(:c)) or SpriteList(pair(:a),pair(:c),pair(:b)) or
716
730
  # SpriteList(pair(:b),pair(:a),pair(:c)) or SpriteList(pair(:b),pair(:c),pair(:a)) or
717
731
  # SpriteList(pair(:c),pair(:a),pair(:b)) or SpriteList(pair(:c),pair(:b),pair(:a))
@@ -724,13 +738,13 @@ module Miyako
724
738
  #===名前の順番をシャッフルする
725
739
  #自分自身で登録されている名前の順番をシャッフルする
726
740
  #例:a=SpriteList(pair(:a),pair(:b),pair(:c))
727
- # a.shuffle!
741
+ # a.shuffle!
728
742
  # =>a=SpriteList(pair(:a),pair(:b),pair(:c)) or SpriteList(pair(:a),pair(:c),pair(:b)) or
729
743
  # SpriteList(pair(:b),pair(:a),pair(:c)) or SpriteList(pair(:b),pair(:c),pair(:a)) or
730
744
  # SpriteList(pair(:c),pair(:a),pair(:b)) or SpriteList(pair(:c),pair(:b),pair(:a))
731
745
  #返却値:: シャッフルした自分自身
732
746
  def shuffle!
733
- @names.shuffle!
747
+ @list.shuffle!
734
748
  self
735
749
  end
736
750
 
@@ -789,9 +803,9 @@ module Miyako
789
803
  def permutation(n, &block)
790
804
  self.to_a.permutation(n, &block)
791
805
  end
792
-
806
+
793
807
  private :reflesh
794
-
808
+
795
809
  #===内容を引数のものに置き換える
796
810
  #現在登録されているデータをいったん解除し、
797
811
  #引数として渡ってきたSpriteListの無いようにデータを置き換える
@@ -817,7 +831,7 @@ module Miyako
817
831
  ret = self.dup
818
832
  ret.reverse!
819
833
  end
820
-
834
+
821
835
  #===名前の順番を破壊的に反転する
822
836
  #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
823
837
  # a.reverse!
@@ -825,10 +839,10 @@ module Miyako
825
839
  # a=SpriteList(pair(:d),pair(:c),pair(:b),pair(:a))
826
840
  #返却値:: 自分自身を帰す
827
841
  def reverse!
828
- @names.reverse!
842
+ @list.reverse!
829
843
  return self
830
844
  end
831
-
845
+
832
846
  #===名前と関連付けられたスプライトを取得する
833
847
  #関連付けられているスプライトが見つからなければnilが返る
834
848
  #例:a=SpriteList(pair(:a),pair(:b),pair(:c),pair(:d))
@@ -837,9 +851,10 @@ module Miyako
837
851
  #_name_:: 名前
838
852
  #返却値:: 名前に関連付けられたスプライト
839
853
  def [](name)
840
- return @n2v[name].body
854
+ pair = @list.find{|pair| pair.name == name }
855
+ return pair ? pair.body : nil
841
856
  end
842
-
857
+
843
858
  #===名前と関連付けられたスプライトを置き換える
844
859
  #名前に対応したスプライトを、引数で指定したものに置き換える。
845
860
  #ただし、まだ名前が登録されていないときは、新規追加と同じになる。
@@ -852,11 +867,11 @@ module Miyako
852
867
  #_sprite_:: スプライト
853
868
  #返却値:: 登録された自分自身
854
869
  def []=(name, sprite)
855
- return self.push([name, sprite]) unless @names.include?(name)
856
- @n2v[name] = ListPair.new(name, sprite)
870
+ return self.push([name, sprite]) unless self.names.include?(name)
871
+ @list[self.names.index(name)].body = sprite
857
872
  return self
858
873
  end
859
-
874
+
860
875
  #===名前の一覧から新しいSpriteListを生成する
861
876
  #リストの順番はnamesの順番と同じ
862
877
  #自分自身に登録されていない名前があったときはnilが登録される
@@ -867,11 +882,9 @@ module Miyako
867
882
  #_names_:: 取り出した名前のリスト名前
868
883
  #返却値:: 生成されたSpriteList
869
884
  def pairs_at(*names)
870
- ret = SpriteList.new
871
- names.each{|name| ret[name] = @n2v[name]}
872
- ret
885
+ SpriteList.new(@list.select{|pair| names.include?(pair.name)})
873
886
  end
874
-
887
+
875
888
  #===名前の一覧から本体のリストを生成する
876
889
  #本体のみの配列を返す。要素の順番はnamesの順番と同じ
877
890
  #自分自身に登録されていない名前があったときはnilが登録される
@@ -882,9 +895,9 @@ module Miyako
882
895
  #_names_:: 取り出した名前のリスト名前
883
896
  #返却値:: 生成された配列
884
897
  def values_at(*names)
885
- names.map{|name| @n2v[name].body }
898
+ @list.search{|pair| names.include?(pair.name)}.map{|pair| pair.body }
886
899
  end
887
-
900
+
888
901
  #===SpriteListを配列化し、同じ位置の要素を一つの配列にまとめる
889
902
  #自分自身に登録されていない名前があったときはnilが登録される
890
903
  #例:SpriteList(pair(:a),pair(:b),pair(:c)).zip(SpriteList(pair(:d),pair(:e),pair(:f))
@@ -903,7 +916,7 @@ module Miyako
903
916
  lists = lists.map{|list| list.to_a}
904
917
  self.to_a.zip(*lists, &block)
905
918
  end
906
-
919
+
907
920
  #===各要素の位置を変更する(変化量を指定)
908
921
  #ブロックを渡したとき、戻り値として[更新したdx,更新したdy]とした配列を返すと、
909
922
  #それがその要素での移動量となる。
@@ -924,12 +937,11 @@ module Miyako
924
937
  #返却値:: 自分自身を返す
925
938
  def move!(dx, dy)
926
939
  if block_given?
927
- @names.each_with_index{|e, i|
928
- pair = @n2v[e]
929
- pair.move!(*(yield pair, i, dx, dy))
940
+ @list.each_with_index{|pair, i|
941
+ pair.body.move!(*(yield pair, i, dx, dy))
930
942
  }
931
943
  else
932
- @names.each{|e| @n2v[e].move!(dx, dy) }
944
+ @list.each{|pair| pair.body.move!(dx, dy) }
933
945
  end
934
946
  self
935
947
  end
@@ -954,12 +966,11 @@ module Miyako
954
966
  #返却値:: 自分自身を返す
955
967
  def move_to!(x, y)
956
968
  if block_given?
957
- @names.each_with_index{|e, i|
958
- pair = @n2v[e]
959
- pair.move_to!(*(yield pair, i, x, y))
969
+ @list.each_with_index{|pair, i|
970
+ pair.body.move_to!(*(yield pair, i, x, y))
960
971
  }
961
972
  else
962
- @names.each{|e| @n2v[e].move_to!(x, y) }
973
+ @list.each{|pair| pair.body.move_to!(x, y) }
963
974
  end
964
975
  self
965
976
  end
@@ -981,39 +992,39 @@ module Miyako
981
992
  # => [pair(:a),pair(:b),pair(:c)]
982
993
  #返却値:: 生成した配列
983
994
  def to_ary
984
- @names.map{|name| @n2v[name]}
995
+ @list.dup
985
996
  end
986
-
997
+
987
998
  #===スプライト名とスプライト本体とのハッシュを取得する
988
999
  #スプライト名とスプライト本体が対になったハッシュを作成して返す
989
1000
  #例:SpriteList(pair(:a),pair(:b),pair(:c)).to_hash
990
1001
  # => {:a=>spr(:a),:b=>spr(:b),:c=>spr(:c)}
991
1002
  #返却値:: 生成したハッシュ
992
1003
  def to_hash
993
- @n2v.dup
1004
+ @list.inject({}){|r, pair| r[pair.name] = pair.value}
994
1005
  end
995
-
1006
+
996
1007
  #===リストの中身を消去する
997
1008
  #リストに登録されているスプライト名・スプライト本体への登録を解除する
998
1009
  def clear
999
- @names.clear
1000
- @n2v.clear
1010
+ @list.clear
1001
1011
  end
1002
-
1012
+
1003
1013
  #===オブジェクトを解放する
1004
1014
  def dispose
1005
- @names.clear
1006
- @names = nil
1007
- @n2v.clear
1008
- @n2v = nil
1015
+ @list.clear
1016
+ @list = nil
1009
1017
  end
1010
-
1018
+
1011
1019
  #===名前に対して値を渡す
1012
1020
  #仕様はHash#fetchと同じ
1013
1021
  def fetch(name, default = nil, &block)
1014
- @n2v.fetch(name, default, &block)
1022
+ ret = @list.find(nil){|pair| pair.name == name}
1023
+ ret = default unless ret
1024
+ yield ret if block_given?
1025
+ ret
1015
1026
  end
1016
-
1027
+
1017
1028
  #===指定の名前の直前に名前を挿入する
1018
1029
  #配列上で、keyの前にnameを挿入する
1019
1030
  #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert(:b, :d, spr(:d))
@@ -1025,18 +1036,18 @@ module Miyako
1025
1036
  #_value_:: (名前が未登録の時の)スプライト本体省略時はnil
1026
1037
  #返却値:自分自身を返す
1027
1038
  def insert(key, name, value = nil)
1028
- raise MiyakoValueError, "Illegal key! : #{key}" unless @names.include?(key)
1039
+ raise MiyakoValueError, "Illegal key! : #{key}" unless self.names.include?(key)
1029
1040
  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)
1041
+ pair = ListPair.new(name, value)
1042
+ unless value
1043
+ pair = @list.find{|pair| pair.name == name}
1044
+ raise MiyakoValueError, "name is not regist! : #{name}" unless pair
1034
1045
  end
1035
- @names.delete(name) if @names.include?(name)
1036
- @names.insert(@names.index(key), name)
1046
+ self.delete(name)
1047
+ @list.insert(self.names.index(key), pair)
1037
1048
  self
1038
1049
  end
1039
-
1050
+
1040
1051
  #===指定の名前の直後に名前を挿入する
1041
1052
  #配列上で、keyの後ろにnameを挿入する
1042
1053
  #例:SpriteList(pair(:a),pair(:b),pair(:c)).insert_after(:b, :d, spr(:d))
@@ -1045,35 +1056,247 @@ module Miyako
1045
1056
  # => SpriteList(pair(:a),pair(:c),pair(:b))
1046
1057
  #_key_:: 挿入先の名前。この名前の直後に挿入する
1047
1058
  #_name_:: 挿入するスプライトの名前
1048
- #_value_:: (名前が未登録の時の)スプライト本体省略時はnil
1059
+ #_value_:: (名前が未登録の時の)スプライト本体。省略時はnil
1049
1060
  #返却値:自分自身を返す
1050
1061
  def insert_after(key, name, value = nil)
1051
- raise MiyakoValueError, "Illegal key! : #{key}" unless @names.include?(key)
1062
+ raise MiyakoValueError, "Illegal key! : #{key}" unless self.names.include?(key)
1052
1063
  return self if key == name
1053
1064
  if value
1054
- @n2v[name] = ListPair.new(name, value)
1065
+ pair = ListPair.new(name, value)
1055
1066
  else
1056
- raise MiyakoValueError, "name is not regist! : #{name}" unless @names.include?(name)
1067
+ pair = @list.find{|pair| pair.name == name}
1068
+ raise MiyakoValueError, "name is not regist! : #{name}" unless pair
1057
1069
  end
1058
- @names.delete(name) if @names.include?(name)
1059
- @names.insert(@names.index(key)-@names.length, name)
1070
+ self.delete(name)
1071
+ @list.insert(self.names.index(key)-@list.length, pair)
1060
1072
  self
1061
1073
  end
1062
-
1074
+
1063
1075
  #===指定した要素の内容を入れ替える
1064
1076
  #例:SpriteList(pair(:a),pair(:b),pair(:c),pair(:d)).insert(:b, :d)
1065
1077
  # => SpriteList(pair(:a),pair(:d),pair(:c),pair(:b))
1066
1078
  #_name1,name_:: 入れ替え対象の名前
1067
1079
  #返却値:: 自分自身を帰す
1068
1080
  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]
1081
+ names = self.names
1082
+ raise MiyakoValueError, "Illegal name! : idx1:#{name1}" unless names.include?(name1)
1083
+ raise MiyakoValueError, "Illegal name! : idx2:#{name2}" unless names.include?(name2)
1084
+ idx1 = names.index(name1)
1085
+ idx2 = names.index(name2)
1086
+ @list[idx1], @list[idx2] = @list[idx2], @list[idx1]
1074
1087
  return self
1075
1088
  end
1076
-
1089
+
1090
+ #===指定の名前の順番に最前面から表示するように入れ替える
1091
+ #namesで示した名前一覧の順番を逆転させて、配列の一番後ろに入れ替える。
1092
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1093
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1094
+ #(例)
1095
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:d, :a, :e, :b,:c]
1096
+ #_names_:: 入れ替えるスプライトの名前一覧
1097
+ #返却値:自分自身を返す
1098
+ def to_first_inner(name)
1099
+ raise MiyakoError, "Canoot regist name! #{name}" unless self.names.include?(name)
1100
+ @list.unshift(self.delete(name))
1101
+ end
1102
+
1103
+ private :to_first_inner
1104
+
1105
+ #===配列の最初で、指定の名前の順番に描画するように入れ替える
1106
+ #namesで示した名前一覧の順番を逆転させて、配列の一番後ろに入れ替える。
1107
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1108
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1109
+ #(例)
1110
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:d, :a, :e, :b,:c]
1111
+ #_names_:: 入れ替えるスプライトの名前一覧
1112
+ #返却値:入れ替えたSpriteListの複製を返す
1113
+ def to_first(*names)
1114
+ ret = self.dup
1115
+ ret.to_first!(*names)
1116
+ end
1117
+
1118
+ #===配列の最初で、指定の名前の順番に描画するように破壊的に入れ替える
1119
+ #namesで示した名前一覧の順番を逆転させて、配列の一番後ろに入れ替える。
1120
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1121
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1122
+ #(例)
1123
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:b,:c,:e,:a,:d]
1124
+ #_names_:: 入れ替えるスプライトの名前一覧
1125
+ #返却値:自分自身を返す
1126
+ def to_first!(*names)
1127
+ names.reverse.each{|name| to_first_inner(name) }
1128
+ self
1129
+ end
1130
+
1131
+ #===指定の名前の順番に最前面から表示するように入れ替える
1132
+ #namesで示した名前一覧の順番を逆転させて、配列の一番後ろに入れ替える。
1133
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1134
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1135
+ #(例)
1136
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:b,:c,:e,:a,:d]
1137
+ #_names_:: 入れ替えるスプライトの名前一覧
1138
+ #返却値:自分自身を返す
1139
+ def pickup_inner(name)
1140
+ raise MiyakoError, "Canoot regist name! #{name}" unless self.names.include?(name)
1141
+ @list.push(self.delete(name))
1142
+ end
1143
+
1144
+ private :pickup_inner
1145
+
1146
+ #===指定の名前の順番に最前面から表示するように入れ替える
1147
+ #namesで示した名前一覧の順番を逆転させて、配列の一番後ろに入れ替える。
1148
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1149
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1150
+ #(例)
1151
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:b,:c,:e,:a,:d]
1152
+ #_names_:: 入れ替えるスプライトの名前一覧
1153
+ #返却値:入れ替えたSpriteListの複製を返す
1154
+ def pickup(*names)
1155
+ ret = self.dup
1156
+ ret.pickup!(*names)
1157
+ end
1158
+
1159
+ #===指定の名前の順番に最前面から表示するように破壊的に入れ替える
1160
+ #namesで示した名前一覧の順に、配列の一番後ろに入れ替える。
1161
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1162
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1163
+ #(例)
1164
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:b,:c,:e,:a,:d]
1165
+ #_names_:: 入れ替えるスプライトの名前一覧
1166
+ #返却値:自分自身を返す
1167
+ def pickup!(*names)
1168
+ names.reverse.each{|name| pickup_inner(name) }
1169
+ self
1170
+ end
1171
+
1172
+ #===配列の最後で、指定の名前の順番に描画するように入れ替える
1173
+ #配列の最後に、namesで示した名前一覧の順に要素を入れ替える。
1174
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1175
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1176
+ #(例)
1177
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:b,:c,:d,:a,:e]
1178
+ #_names_:: 入れ替えるスプライトの名前一覧
1179
+ #返却値:入れ替えたSpriteListの複製を返す
1180
+ def to_last(*names)
1181
+ ret = self.dup
1182
+ ret.to_last!(*names)
1183
+ end
1184
+
1185
+ #===配列の最後で、指定の名前の順番に描画するように破壊的に入れ替える
1186
+ #配列の最後に、namesで示した名前一覧の順に要素を入れ替える。
1187
+ #(renderメソッドは、配列の一番後ろのスプライトが一番前に描画されるため
1188
+ #存在しない名前を指定すると例外MiyakoErrorが発生する
1189
+ #(例)
1190
+ #[:a,:b,:c,:d,:e]のとき、pickup(:d,:a,:e) -> [:b,:c,:d,:a,:e]
1191
+ #_names_:: 入れ替えるスプライトの名前一覧
1192
+ #返却値:自分自身を返す
1193
+ def to_last!(*names)
1194
+ names.each{|name| pickup_inner(name) }
1195
+ self
1196
+ end
1197
+
1198
+ #===要素全体もしくは一部を描画可能状態にする
1199
+ #他のshowメソッドとの違いは、名前のリストを引数に取れること(省略可)。
1200
+ #paramsで指定した名前に対応したスプライトのみ描画可能にする
1201
+ #paramsの省略時は自分自身を描画可能にする(現在、どの要素が描画可能かは考えない。他クラスのshowと同じ動作)
1202
+ #すべての要素を描画可能にしたいときは、引数にSpriteList#allを使用する
1203
+ #paramsに登録されていない名前が含まれているときは無視される
1204
+ #また、ブロック(名前nameとスプライトbodyが引数)を渡したときは、リストに渡した名前一覧のうち、
1205
+ #ブロックを評価した結果がtrueのときのみ描画可能にする。
1206
+ #(引数paramsを省略したときは、すべての要素に対してブロックを評価すると見なす)
1207
+ #_params_:: 表示対象に名前リスト。
1208
+ def show(*params)
1209
+ if block_given?
1210
+ if params == []
1211
+ @list.each{|pair| pair.body.show if yield(pair.name, pair.body) }
1212
+ else
1213
+ @list.each{|pair|
1214
+ next unless params.include?(pair.name)
1215
+ pair.body.show if yield(pair.name, pair.body)
1216
+ }
1217
+ end
1218
+ elsif params == []
1219
+ self.visible = true
1220
+ else
1221
+ @list.each{|pair| pair.body.show if params.include?(pair.name) }
1222
+ end
1223
+ end
1224
+
1225
+ #===要素全体もしくは一部を描画不可能状態にする
1226
+ #他のhideメソッドとの違いは、名前のリストを引数に取れること(省略可)。
1227
+ #paramsで指定した名前に対応したスプライトのみ描画不可能にする
1228
+ #paramsの省略時は自分自身を描画不可にする(現在、どの要素が描画不可になっているかは考えない。他クラスのhideと同じ動作)
1229
+ #すべての要素を描画不可能にしたいときは、引数にSpriteList#allを使用する
1230
+ #paramsに登録されていない名前が含まれているときは無視される
1231
+ #また、ブロック(名前nameとスプライトbodyが引数)を渡したときは、リストに渡した名前一覧のうち、
1232
+ #ブロックを評価した結果がtrueのときのみ描画可能にする。
1233
+ #(引数paramsを省略したときは、すべての要素に対してブロックを評価すると見なす)
1234
+ #_params_:: 表示対象に名前リスト。
1235
+ def hide(*params)
1236
+ if block_given?
1237
+ if params == []
1238
+ @list.each{|pair| pair.body.hide if yield(pair.name, pair.body) }
1239
+ else
1240
+ @list.each{|pair|
1241
+ next unless params.include?(pair.name)
1242
+ pair.body.hide if yield(pair.name, pair.body)
1243
+ }
1244
+ end
1245
+ elsif params == []
1246
+ self.visible = false
1247
+ else
1248
+ @list.each{|pair| pair.body.hide if params.include?(pair.name) }
1249
+ end
1250
+ end
1251
+
1252
+ #===要素全体もしくは一部のみ描画可能状態にする
1253
+ #paramsで指定した名前に対応したスプライトのみ描画可能にし、それ以外を描画不可能にする
1254
+ #paramsに登録されていない名前が含まれているときは無視される
1255
+ #paramsを省略したときは、すべての要素を描画可能にする
1256
+ #また、ブロック(名前nameとスプライトbodyが引数)を渡したときは、リストに渡した名前一覧のうち、
1257
+ #ブロックを評価した結果がtrueのときのみ描画可能にする。
1258
+ #_params_:: 表示対象に名前リスト。
1259
+ def show_only(*params)
1260
+ if block_given?
1261
+ if params == []
1262
+ @list.each{|pair| yield(pair.name, pair.body) ? pair.body.show : pair.body.hide }
1263
+ else
1264
+ @list.each{|pair|
1265
+ next unless params.include?(pair.name)
1266
+ yield(pair.name, pair.body) ? pair.body.show : pair.body.hide
1267
+ }
1268
+ end
1269
+ elsif params == []
1270
+ @list.each{|pair| pair.body.show }
1271
+ else
1272
+ @list.each{|pair| params.include?(pair.name) ? pair.body.show : pair.body.hide }
1273
+ end
1274
+ end
1275
+
1276
+ #===要素全体もしくは一部のみ描画不可能状態にする
1277
+ #paramsで指定した名前に対応したスプライトのみ描画不可能にし、それ以外を描画可能にする
1278
+ #paramsに登録されていない名前が含まれているときは無視される
1279
+ #paramsを省略したときは、すべての要素を描画不可能にする
1280
+ #また、ブロック(名前nameとスプライトbodyが引数)を渡したときは、リストに渡した名前一覧のうち、
1281
+ #ブロックを評価した結果がtrueのときのみ描画可能にする。
1282
+ #_params_:: 表示対象に名前リスト。
1283
+ def hide_only(*params)
1284
+ if block_given?
1285
+ if params == []
1286
+ @list.each{|pair| yield(pair.name, pair.body) ? pair.body.hide : pair.body.show }
1287
+ else
1288
+ @list.each{|pair|
1289
+ next unless params.include?(pair.name)
1290
+ yield(pair.name, pair.body) ? pair.body.hide : pair.body.show
1291
+ }
1292
+ end
1293
+ elsif params == []
1294
+ @list.each{|pair| pair.body.hide }
1295
+ else
1296
+ @list.each{|pair| params.include?(pair.name) ? pair.body.hide : pair.body.show }
1297
+ end
1298
+ end
1299
+
1077
1300
  #===各要素のアニメーションを開始する
1078
1301
  #各要素のstartメソッドを呼び出す
1079
1302
  #返却値:: 自分自身を返す
@@ -1081,7 +1304,7 @@ module Miyako
1081
1304
  self.sprite_only.each{|pair| pair[1].start }
1082
1305
  return self
1083
1306
  end
1084
-
1307
+
1085
1308
  #===各要素のアニメーションを停止する
1086
1309
  #各要素のstopメソッドを呼び出す
1087
1310
  #返却値:: 自分自身を返す
@@ -1089,7 +1312,7 @@ module Miyako
1089
1312
  self.sprite_only.each{|pair| pair[1].stop }
1090
1313
  return self
1091
1314
  end
1092
-
1315
+
1093
1316
  #===各要素のアニメーションを先頭パターンに戻す
1094
1317
  #各要素のresetメソッドを呼び出す
1095
1318
  #返却値:: 自分自身を返す
@@ -1097,14 +1320,14 @@ module Miyako
1097
1320
  self.sprite_only.each{|pair| pair[1].reset }
1098
1321
  return self
1099
1322
  end
1100
-
1323
+
1101
1324
  #===各要素のアニメーションを更新する
1102
1325
  #各要素のupdate_animationメソッドを呼び出す
1103
1326
  #返却値:: 各要素のupdate_spriteメソッドを呼び出した結果を配列で返す
1104
1327
  def update_animation
1105
1328
  self.sprite_only.map{|pair| pair[1].update_animation }
1106
1329
  end
1107
-
1330
+
1108
1331
  #===配列の要素を画面に描画する
1109
1332
  #配列の先頭から順にrenderメソッドを呼び出す。
1110
1333
  #返却値:: 自分自身を帰す
@@ -1113,7 +1336,7 @@ module Miyako
1113
1336
  self.sprite_only.each{|pair| pair[1].render }
1114
1337
  return self
1115
1338
  end
1116
-
1339
+
1117
1340
  #===配列の要素を対象の画像に描画する
1118
1341
  #配列の先頭から順にrender_toメソッドを呼び出す。
1119
1342
  #_dst_:: 描画対象の画像インスタンス
@@ -1123,7 +1346,7 @@ module Miyako
1123
1346
  self.sprite_only.each{|pair| pair[1].render_to(dst) }
1124
1347
  return self
1125
1348
  end
1126
-
1349
+
1127
1350
  #===オブジェクトを文字列に変換する
1128
1351
  #いったん、名前とスプライトとの対の配列に変換し、to_sメソッドで文字列化する。
1129
1352
  #例:[[name1, sprite1], [name2, sprite2],...]