ruby-miyako 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1115 -0
- data/Rakefile +7 -0
- data/defines.h +144 -0
- data/extconf.rb +44 -0
- data/extern.h +29 -0
- data/img/cursor.png +0 -0
- data/img/cursors.png +0 -0
- data/img/dice.png +0 -0
- data/img/wait_cursor.png +0 -0
- data/img/win_base.png +0 -0
- data/img/window.png +0 -0
- data/install_miyako.rb +87 -0
- data/lib/Miyako/API/audio.rb +584 -0
- data/lib/Miyako/API/basic_data.rb +1026 -0
- data/lib/Miyako/API/bitmap.rb +534 -0
- data/lib/Miyako/API/choices.rb +481 -0
- data/lib/Miyako/API/collision.rb +638 -0
- data/lib/Miyako/API/diagram.rb +586 -0
- data/lib/Miyako/API/drawing.rb +151 -0
- data/lib/Miyako/API/exceptions.rb +105 -0
- data/lib/Miyako/API/fixedmap.rb +462 -0
- data/lib/Miyako/API/font.rb +430 -0
- data/lib/Miyako/API/input.rb +456 -0
- data/lib/Miyako/API/layout.rb +644 -0
- data/lib/Miyako/API/map.rb +583 -0
- data/lib/Miyako/API/map_event.rb +222 -0
- data/lib/Miyako/API/modules.rb +357 -0
- data/lib/Miyako/API/movie.rb +166 -0
- data/lib/Miyako/API/parts.rb +188 -0
- data/lib/Miyako/API/plane.rb +205 -0
- data/lib/Miyako/API/screen.rb +341 -0
- data/lib/Miyako/API/shape.rb +443 -0
- data/lib/Miyako/API/sprite.rb +773 -0
- data/lib/Miyako/API/sprite_animation.rb +494 -0
- data/lib/Miyako/API/sprite_list.rb +1135 -0
- data/lib/Miyako/API/spriteunit.rb +168 -0
- data/lib/Miyako/API/story.rb +350 -0
- data/lib/Miyako/API/textbox.rb +773 -0
- data/lib/Miyako/API/utility.rb +419 -0
- data/lib/Miyako/API/viewport.rb +190 -0
- data/lib/Miyako/API/yuki.rb +1180 -0
- data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
- data/lib/Miyako/EXT/raster_scroll.rb +138 -0
- data/lib/Miyako/EXT/slides.rb +157 -0
- data/lib/Miyako/miyako.rb +201 -0
- data/lib/Miyako/miyako_require_only.rb +35 -0
- data/logo/EGSR_logo.png +0 -0
- data/logo/EGSR_logo_bg.png +0 -0
- data/logo/EGSR_logo_fg.png +0 -0
- data/logo/EGSR_title_banner.png +0 -0
- data/logo/EGSR_title_logo.png +0 -0
- data/logo/miyako.png +0 -0
- data/logo/miyako_banner.png +0 -0
- data/logo/space.png +0 -0
- data/miyako_basicdata.c +484 -0
- data/miyako_bitmap.c +1225 -0
- data/miyako_collision.c +403 -0
- data/miyako_drawing.c +187 -0
- data/miyako_font.c +334 -0
- data/miyako_hsv.c +830 -0
- data/miyako_input_audio.c +254 -0
- data/miyako_layout.c +191 -0
- data/miyako_no_katana.c +1086 -0
- data/miyako_sprite2.c +431 -0
- data/miyako_transform.c +438 -0
- data/miyako_utility.c +288 -0
- data/sample/Animation1/m1ku.rb +68 -0
- data/sample/Animation1/m1ku_arm_0.png +0 -0
- data/sample/Animation1/m1ku_arm_1.png +0 -0
- data/sample/Animation1/m1ku_arm_2.png +0 -0
- data/sample/Animation1/m1ku_arm_3.png +0 -0
- data/sample/Animation1/m1ku_back.jpg +0 -0
- data/sample/Animation1/m1ku_body.png +0 -0
- data/sample/Animation1/m1ku_eye_0.png +0 -0
- data/sample/Animation1/m1ku_eye_1.png +0 -0
- data/sample/Animation1/m1ku_eye_2.png +0 -0
- data/sample/Animation1/m1ku_eye_3.png +0 -0
- data/sample/Animation1/m1ku_hair_front.png +0 -0
- data/sample/Animation1/m1ku_hair_rear.png +0 -0
- data/sample/Animation1/readme.txt +72 -0
- data/sample/Animation2/lex.rb +96 -0
- data/sample/Animation2/lex_back.png +0 -0
- data/sample/Animation2/lex_body.png +0 -0
- data/sample/Animation2/lex_roadroller.png +0 -0
- data/sample/Animation2/lex_wheel_0.png +0 -0
- data/sample/Animation2/lex_wheel_1.png +0 -0
- data/sample/Animation2/lex_wheel_2.png +0 -0
- data/sample/Animation2/readme.txt +72 -0
- data/sample/Animation2/song_title.png +0 -0
- data/sample/Diagram_sample/back.png +0 -0
- data/sample/Diagram_sample/chr01.png +0 -0
- data/sample/Diagram_sample/chr02.png +0 -0
- data/sample/Diagram_sample/cursor.png +0 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
- data/sample/Diagram_sample/readme.txt +90 -0
- data/sample/Diagram_sample/wait_cursor.png +0 -0
- data/sample/Room3/blue.rb +297 -0
- data/sample/Room3/ending.rb +180 -0
- data/sample/Room3/green.rb +220 -0
- data/sample/Room3/image/akamatsu.png +0 -0
- data/sample/Room3/image/aoyama.png +0 -0
- data/sample/Room3/image/congra.png +0 -0
- data/sample/Room3/image/congratulation.png +0 -0
- data/sample/Room3/image/congratulation_bg.png +0 -0
- data/sample/Room3/image/cursor.png +0 -0
- data/sample/Room3/image/midori.png +0 -0
- data/sample/Room3/image/mittsu_no_oheya.png +0 -0
- data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
- data/sample/Room3/image/room_blue.png +0 -0
- data/sample/Room3/image/room_green.png +0 -0
- data/sample/Room3/image/room_red.png +0 -0
- data/sample/Room3/image/start.png +0 -0
- data/sample/Room3/image/three_doors.png +0 -0
- data/sample/Room3/image/wait_cursor.png +0 -0
- data/sample/Room3/main.rb +120 -0
- data/sample/Room3/main_component.rb +59 -0
- data/sample/Room3/readme.txt +76 -0
- data/sample/Room3/red.rb +227 -0
- data/sample/Room3/room3.rb +25 -0
- data/sample/Room3/title.rb +184 -0
- data/sample/ball_action_sample.rb +204 -0
- data/sample/blit_rop.rb +70 -0
- data/sample/cairo_sample.rb +25 -0
- data/sample/circle_collision_test.rb +66 -0
- data/sample/collision_test.rb +33 -0
- data/sample/collision_test2.rb +108 -0
- data/sample/fixed_map_test/cursor.png +0 -0
- data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
- data/sample/fixed_map_test/map.csv +19 -0
- data/sample/fixed_map_test/map_01.png +0 -0
- data/sample/fixed_map_test/mapchip.csv +23 -0
- data/sample/fixed_map_test/monster.png +0 -0
- data/sample/fixed_map_test/readme.txt +72 -0
- data/sample/map_test/chara.rb +58 -0
- data/sample/map_test/chr1.png +0 -0
- data/sample/map_test/cursor.png +0 -0
- data/sample/map_test/main_parts.rb +69 -0
- data/sample/map_test/main_scene.rb +153 -0
- data/sample/map_test/map.png +0 -0
- data/sample/map_test/map2.png +0 -0
- data/sample/map_test/map_layer.csv +127 -0
- data/sample/map_test/map_manager.rb +75 -0
- data/sample/map_test/map_test.rb +23 -0
- data/sample/map_test/mapchip.csv +21 -0
- data/sample/map_test/oasis.rb +71 -0
- data/sample/map_test/readme.txt +89 -0
- data/sample/map_test/route.rb +157 -0
- data/sample/map_test/sea.png +0 -0
- data/sample/map_test/town.rb +74 -0
- data/sample/map_test/wait_cursor.png +0 -0
- data/sample/map_test/window.png +0 -0
- data/sample/polygon_test.rb +35 -0
- data/sample/rasterscroll.rb +25 -0
- data/sample/takahashi.rb +42 -0
- data/sample/text.png +0 -0
- data/sample/textbox_sample.rb +192 -0
- data/sample/transform.rb +54 -0
- data/sample/utility_test.rb +73 -0
- data/sample/utility_test2.rb +61 -0
- data/sample/utility_test3.rb +64 -0
- data/sample/utility_test4.rb +73 -0
- data/uninstall_miyako.rb +19 -0
- data/win/miyako_no_katana.so +0 -0
- 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
|