ruby-miyako-mswin32 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. data/README +1115 -0
  2. data/img/cursor.png +0 -0
  3. data/img/cursors.png +0 -0
  4. data/img/dice.png +0 -0
  5. data/img/wait_cursor.png +0 -0
  6. data/img/win_base.png +0 -0
  7. data/img/window.png +0 -0
  8. data/install_miyako.rb +87 -0
  9. data/lib/Miyako/API/audio.rb +584 -0
  10. data/lib/Miyako/API/basic_data.rb +1026 -0
  11. data/lib/Miyako/API/bitmap.rb +534 -0
  12. data/lib/Miyako/API/choices.rb +481 -0
  13. data/lib/Miyako/API/collision.rb +638 -0
  14. data/lib/Miyako/API/diagram.rb +586 -0
  15. data/lib/Miyako/API/drawing.rb +151 -0
  16. data/lib/Miyako/API/exceptions.rb +105 -0
  17. data/lib/Miyako/API/fixedmap.rb +462 -0
  18. data/lib/Miyako/API/font.rb +430 -0
  19. data/lib/Miyako/API/input.rb +456 -0
  20. data/lib/Miyako/API/layout.rb +644 -0
  21. data/lib/Miyako/API/map.rb +583 -0
  22. data/lib/Miyako/API/map_event.rb +222 -0
  23. data/lib/Miyako/API/modules.rb +357 -0
  24. data/lib/Miyako/API/movie.rb +166 -0
  25. data/lib/Miyako/API/parts.rb +188 -0
  26. data/lib/Miyako/API/plane.rb +205 -0
  27. data/lib/Miyako/API/screen.rb +341 -0
  28. data/lib/Miyako/API/shape.rb +443 -0
  29. data/lib/Miyako/API/sprite.rb +773 -0
  30. data/lib/Miyako/API/sprite_animation.rb +494 -0
  31. data/lib/Miyako/API/sprite_list.rb +1135 -0
  32. data/lib/Miyako/API/spriteunit.rb +168 -0
  33. data/lib/Miyako/API/story.rb +350 -0
  34. data/lib/Miyako/API/textbox.rb +773 -0
  35. data/lib/Miyako/API/utility.rb +419 -0
  36. data/lib/Miyako/API/viewport.rb +190 -0
  37. data/lib/Miyako/API/yuki.rb +1180 -0
  38. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  39. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  40. data/lib/Miyako/EXT/slides.rb +157 -0
  41. data/lib/Miyako/miyako.rb +201 -0
  42. data/lib/Miyako/miyako_no_katana.so +0 -0
  43. data/lib/Miyako/miyako_require_only.rb +35 -0
  44. data/logo/EGSR_logo.png +0 -0
  45. data/logo/EGSR_logo_bg.png +0 -0
  46. data/logo/EGSR_logo_fg.png +0 -0
  47. data/logo/EGSR_title_banner.png +0 -0
  48. data/logo/EGSR_title_logo.png +0 -0
  49. data/logo/miyako.png +0 -0
  50. data/logo/miyako_banner.png +0 -0
  51. data/logo/space.png +0 -0
  52. data/sample/Animation1/m1ku.rb +68 -0
  53. data/sample/Animation1/m1ku_arm_0.png +0 -0
  54. data/sample/Animation1/m1ku_arm_1.png +0 -0
  55. data/sample/Animation1/m1ku_arm_2.png +0 -0
  56. data/sample/Animation1/m1ku_arm_3.png +0 -0
  57. data/sample/Animation1/m1ku_back.jpg +0 -0
  58. data/sample/Animation1/m1ku_body.png +0 -0
  59. data/sample/Animation1/m1ku_eye_0.png +0 -0
  60. data/sample/Animation1/m1ku_eye_1.png +0 -0
  61. data/sample/Animation1/m1ku_eye_2.png +0 -0
  62. data/sample/Animation1/m1ku_eye_3.png +0 -0
  63. data/sample/Animation1/m1ku_hair_front.png +0 -0
  64. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  65. data/sample/Animation1/readme.txt +72 -0
  66. data/sample/Animation2/lex.rb +96 -0
  67. data/sample/Animation2/lex_back.png +0 -0
  68. data/sample/Animation2/lex_body.png +0 -0
  69. data/sample/Animation2/lex_roadroller.png +0 -0
  70. data/sample/Animation2/lex_wheel_0.png +0 -0
  71. data/sample/Animation2/lex_wheel_1.png +0 -0
  72. data/sample/Animation2/lex_wheel_2.png +0 -0
  73. data/sample/Animation2/readme.txt +72 -0
  74. data/sample/Animation2/song_title.png +0 -0
  75. data/sample/Diagram_sample/back.png +0 -0
  76. data/sample/Diagram_sample/chr01.png +0 -0
  77. data/sample/Diagram_sample/chr02.png +0 -0
  78. data/sample/Diagram_sample/cursor.png +0 -0
  79. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  80. data/sample/Diagram_sample/readme.txt +90 -0
  81. data/sample/Diagram_sample/wait_cursor.png +0 -0
  82. data/sample/Room3/blue.rb +297 -0
  83. data/sample/Room3/ending.rb +180 -0
  84. data/sample/Room3/green.rb +220 -0
  85. data/sample/Room3/image/akamatsu.png +0 -0
  86. data/sample/Room3/image/aoyama.png +0 -0
  87. data/sample/Room3/image/congra.png +0 -0
  88. data/sample/Room3/image/congratulation.png +0 -0
  89. data/sample/Room3/image/congratulation_bg.png +0 -0
  90. data/sample/Room3/image/cursor.png +0 -0
  91. data/sample/Room3/image/midori.png +0 -0
  92. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  93. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  94. data/sample/Room3/image/room_blue.png +0 -0
  95. data/sample/Room3/image/room_green.png +0 -0
  96. data/sample/Room3/image/room_red.png +0 -0
  97. data/sample/Room3/image/start.png +0 -0
  98. data/sample/Room3/image/three_doors.png +0 -0
  99. data/sample/Room3/image/wait_cursor.png +0 -0
  100. data/sample/Room3/main.rb +120 -0
  101. data/sample/Room3/main_component.rb +59 -0
  102. data/sample/Room3/readme.txt +76 -0
  103. data/sample/Room3/red.rb +227 -0
  104. data/sample/Room3/room3.rb +25 -0
  105. data/sample/Room3/title.rb +184 -0
  106. data/sample/ball_action_sample.rb +204 -0
  107. data/sample/blit_rop.rb +70 -0
  108. data/sample/cairo_sample.rb +25 -0
  109. data/sample/circle_collision_test.rb +66 -0
  110. data/sample/collision_test.rb +33 -0
  111. data/sample/collision_test2.rb +108 -0
  112. data/sample/fixed_map_test/cursor.png +0 -0
  113. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  114. data/sample/fixed_map_test/map.csv +19 -0
  115. data/sample/fixed_map_test/map_01.png +0 -0
  116. data/sample/fixed_map_test/mapchip.csv +23 -0
  117. data/sample/fixed_map_test/monster.png +0 -0
  118. data/sample/fixed_map_test/readme.txt +72 -0
  119. data/sample/map_test/chara.rb +58 -0
  120. data/sample/map_test/chr1.png +0 -0
  121. data/sample/map_test/cursor.png +0 -0
  122. data/sample/map_test/main_parts.rb +69 -0
  123. data/sample/map_test/main_scene.rb +153 -0
  124. data/sample/map_test/map.png +0 -0
  125. data/sample/map_test/map2.png +0 -0
  126. data/sample/map_test/map_layer.csv +127 -0
  127. data/sample/map_test/map_manager.rb +75 -0
  128. data/sample/map_test/map_test.rb +23 -0
  129. data/sample/map_test/mapchip.csv +21 -0
  130. data/sample/map_test/oasis.rb +71 -0
  131. data/sample/map_test/readme.txt +89 -0
  132. data/sample/map_test/route.rb +157 -0
  133. data/sample/map_test/sea.png +0 -0
  134. data/sample/map_test/town.rb +74 -0
  135. data/sample/map_test/wait_cursor.png +0 -0
  136. data/sample/map_test/window.png +0 -0
  137. data/sample/polygon_test.rb +35 -0
  138. data/sample/rasterscroll.rb +25 -0
  139. data/sample/takahashi.rb +42 -0
  140. data/sample/text.png +0 -0
  141. data/sample/textbox_sample.rb +190 -0
  142. data/sample/transform.rb +54 -0
  143. data/sample/utility_test.rb +73 -0
  144. data/sample/utility_test2.rb +61 -0
  145. data/sample/utility_test3.rb +64 -0
  146. data/sample/utility_test4.rb +73 -0
  147. data/uninstall_miyako.rb +19 -0
  148. metadata +199 -0
@@ -0,0 +1,481 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ module Miyako
24
+ #==選択肢構造体
25
+ # 選択肢を構成する要素の集合
26
+ #
27
+ # 複数のChoice構造体のインスタンスをまとめて、配列として構成されている
28
+ # 選択肢を表示させるときは、body 自体の表示位置を変更させる必要がある
29
+ #
30
+ #_body_:: 選択肢を示す画像
31
+ #_body_selected_:: 選択肢を示す画像(選択時)
32
+ #_condition_:: 選択肢が選択できる条件を記述したブロック
33
+ #_selected_:: 選択肢が選択されているときはtrue、選択されていないときはfalse
34
+ #_result_:: 選択した結果を示すインスタンス
35
+ #_left_:: 左方向を選択したときに参照するChoice構造体のインスタンス
36
+ #_right_:: 右方向を選択したときに参照するChoice構造体のインスタンス
37
+ #_up_:: 上方向を選択したときに参照するChoice構造体のインスタンス
38
+ #_down_:: 下方向を選択したときに参照するChoice構造体のインスタンス
39
+ #_base_:: 構造体が要素となっている配列
40
+ #_attribute_:: 属性を示すハッシュ
41
+ #_end_select_proc_:: この選択肢を選択したときに優先的に処理するブロック。
42
+ #ブロックは1つの引数を取る(コマンド選択テキストボックス))。
43
+ #デフォルトはnil(何もしない)
44
+ Choice = Struct.new(:body, :body_selected, :condition, :selected, :result, :left, :right, :up, :down, :base, :attribute, :end_select_proc)
45
+
46
+ #==選択肢を管理するクラス
47
+ # 選択肢は、Shapeクラスから生成したスプライトもしくは画像で構成される
48
+ class Choices
49
+ include Layout
50
+ include SpriteBase
51
+ include Animation
52
+ include Enumerable
53
+ extend Forwardable
54
+
55
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
56
+
57
+ # インスタンスを生成する
58
+ # 返却値:: 生成された Choices クラスのインスタンス
59
+ def initialize
60
+ init_layout
61
+ @choices = []
62
+ @now = nil
63
+ @non_select = false
64
+ @last_selected = nil
65
+ @result = nil
66
+ @visible = true
67
+ set_layout_size(1, 1)
68
+ end
69
+
70
+ def initialize_copy(obj) #:nodoc:
71
+ @choices = @choices.dup
72
+ copy_layout
73
+ end
74
+
75
+ def update_layout_position #:nodoc:
76
+ dx = @layout.pos[0] - rect[0]
77
+ dy = @layout.pos[1] - rect[1]
78
+ @choices.each{|ch|
79
+ ch.each{|cc|
80
+ cc.body.move!(dx, dy)
81
+ cc.body_selected.move!(dx, dy) if cc.body_selected && cc.body != cc.body_selected
82
+ }
83
+ }
84
+ end
85
+
86
+ # 選択肢を作成する
87
+ # Choice 構造体のインスタンスを作成する
88
+ # 構造体には、引数bodyと、必ず true を返す条件ブロックが登録されている。残りは nil
89
+ #_body_:: 選択肢を示す画像
90
+ #_body_selected_:: 選択肢を示す画像(選択時)。デフォルトはnil
91
+ #_selected_:: 生成時に選択されているときはtrue、そうでないときはfalseを設定する
92
+ #返却値:: 生成された Choice構造体のインスタンス
93
+ def Choices.create_choice(body, body_selected = nil, selected = false)
94
+ choice = Choice.new(body, body_selected, Proc.new{ true }, selected,
95
+ nil, nil, nil, nil, nil, nil, {}, nil)
96
+ choice.left = choice
97
+ choice.right = choice
98
+ choice.up = choice
99
+ choice.down = choice
100
+ return choice
101
+ end
102
+
103
+ # 選択肢集合(Choice 構造体の配列)を選択肢リストに登録する
104
+ def create_choices(choices)
105
+ choices.each{|v| v.base = choices}
106
+ @choices.push(choices)
107
+ @last_selected = @choices[0][0] if (@choices.length == 1 && @last_selcted == nil)
108
+ rect = self.broad_rect
109
+ set_layout_size(rect.w, rect.h)
110
+ return self
111
+ end
112
+
113
+ # 選択肢データを解放する
114
+ def dispose
115
+ @choices.each{|c| c.clear }
116
+ @choices.clear
117
+ @choices = []
118
+ end
119
+
120
+ def each #:nodoc:
121
+ @choices.each{|ch| yield ch }
122
+ end
123
+
124
+ def_delegators(:@choices, :push, :pop, :shift, :unshift, :[], :[]=, :clear, :length)
125
+
126
+ #===選択を開始しているかどうかを問い合わせる
127
+ # start_choiceメソッドを呼び出して、コマンド選択が始まっているかどうかを問い合わせ、始まっているときはtrueを返す
128
+ #返却値:: 選択を開始しているときはtrueを返す
129
+ def choicing?
130
+ return @now != nil
131
+ end
132
+
133
+ #===選択を開始する
134
+ # 選択肢の初期位置を指定することができる
135
+ # 第1引数にnilを渡すと、最後に選択した選択肢が最初に選択状態にある選択肢となる
136
+ # (例)
137
+ # choices.start_choice # [0][0]で示す位置の選択肢を選択する
138
+ # choices.start_choice(5,1) # [5][1]で示す位置の選択肢を選択する
139
+ # choices.start_choice(nil) # 最後に選択した選択肢を選択する(未選択だったときは全省略時の呼び出しと等価)
140
+ #_x_:: 初期位置(x 座標)。規定値は 0。nilを渡すと、最後に選択した選択肢が選ばれる。
141
+ #_y_:: 初期位置(y 座標)。規定値は 0
142
+ def start_choice(x = 0, y = 0)
143
+ raise MiyakoValueError, "Illegal choice position! [#{x}][#{y}]" if (x != nil && (x < 0 || x >= @choices.length || y < 0 || y >= @choices[x].length))
144
+ @now = x ? @choices[x][y] : @last_selected
145
+ @now.selected = true
146
+ @last_selected = @now
147
+ @non_select = false
148
+ @result = nil
149
+ end
150
+
151
+ #===選択を終了する
152
+ # 選択の終了処理を行う
153
+ # 引数に選択に使用したテキストボックスを渡し、選択状態にあるしたChoice構造体に
154
+ #end_select_procブロックを渡しているとき、そのブロックを評価する
155
+ # (そのとき、引数とした渡ってきたテキストボックスをブロック引数に取る)。
156
+ #
157
+ #_command_box_:: 選択に使用したテキストボックス。デフォルトはnil
158
+ def end_choice(command_box = nil)
159
+ return unless @now
160
+ return @now.end_select_proc.call(command_box) if (command_box != nil && @now.end_select_proc != nil)
161
+ @result = @now.result
162
+ @now.selected = false
163
+ @last_selected = @now
164
+ @now = nil
165
+ @non_select = true
166
+ end
167
+
168
+ #===選択肢本体を取得する
169
+ # 選択肢の表示対象となるインスタンスを取得する
170
+ # Choice構造体にbody_selectedが設定されている時はbody_selected、そうでなければbodyを返す
171
+ # まだ選択が開始されていなければnilが返る
172
+ #返却値:: 選択肢本体(選択時)
173
+ def body
174
+ return nil unless @now
175
+ return @now.body_selected ? @now.body_selected : @now.body
176
+ end
177
+
178
+ #===選択結果を取得する
179
+ # 現在の選択肢が所持している結果インスタンスを返す
180
+ # まだ選択が開始されていなければnilが返る
181
+ #返却値:: 選択結果
182
+ def result
183
+ return @result unless @now
184
+ return @now.result
185
+ end
186
+
187
+ #===現在選択している選択肢の属性をアクセスする
188
+ # 属性を編集・参照できるハッシュを取得する
189
+ # まだ選択が開始されていなければnilが返る
190
+ #返却値:: 属性(対応するChoice#attributeメソッドの値)
191
+ def attribute
192
+ return nil unless @now
193
+ return @now.attribute
194
+ end
195
+
196
+ def update_choices(org, nxt) #:nodoc:
197
+ obase = org.base
198
+ nbase = nxt.base
199
+ unless obase.eql?(nbase)
200
+ obase.each{|b|
201
+ b.body.stop
202
+ b.body_selected.stop if b.body_selected
203
+ }
204
+ nbase.each{|b|
205
+ b.body.start
206
+ b.body_selected.start if b.body_selected
207
+ }
208
+ end
209
+ end
210
+
211
+ private :update_choices
212
+
213
+ #===選択肢を非選択状態に変更する
214
+ #現在の選択状態を、全部選択していない状態にする
215
+ #返却値:: 自分自身を返す
216
+ def non_select
217
+ @now.base.each{|c| c.selected = false } if @now
218
+ @non_select = true
219
+ return self
220
+ end
221
+
222
+ #===選択肢が選択状態かを問い合わせる
223
+ #現在、選択肢が選択状態か非選択状態(non_selectメソッド呼び出しなど)かを問い合わせる
224
+ #返却値:: 選択状態ならtrue、非選択状態ならfalseを返す
225
+ def any_select?
226
+ return !@non_select
227
+ end
228
+
229
+ #===選択肢を変更する
230
+ #指定の位置の現在の選択状態を、選択状態にする
231
+ #_x_:: x方向位置
232
+ #_y_:: y方向位置
233
+ #返却値:: 自分自身を返す
234
+ def select(x, y)
235
+ raise MiyakoError, "Not select yet!" unless @now
236
+ raise MiyakoValueError, "Illegal choice position! [#{x}][#{y}]" if (x < 0 || x >= @choices.length || y < 0 || y >= @choices[x].length)
237
+ @non_select = false
238
+ @last_selected = @now
239
+ @now.selected = false
240
+ obj = @choices[x][y]
241
+ update_choices(@now, obj)
242
+ @now = obj
243
+ @now.selected = true
244
+ return self
245
+ end
246
+
247
+ #===画面上の座標から、該当する選択肢を変更する
248
+ #マウスカーソル位置などの座標から、座標を含む選択肢を選択状態にする
249
+ #該当する場所が無ければfalseを返す
250
+ #まだ選択を開始していないときはfalseを返す
251
+ #_x_:: x方向位置
252
+ #_y_:: y方向位置
253
+ #返却値:: 選択肢が見つかったときはtrue、見つからなかったときはfalseを返す
254
+ def attach(x, y)
255
+ return false unless @now
256
+ obj = @now.base.detect{|ch| ch.selected ? ch.body_selected.broad_rect.in_range?(x, y) : ch.body.broad_rect.in_range?(x, y) }
257
+ return false unless obj
258
+ @non_select = false
259
+ @last_selected = @now
260
+ @now.selected = false
261
+ update_choices(@now, obj)
262
+ @now = obj
263
+ @now.selected = true
264
+ return true
265
+ end
266
+
267
+ #===画面上の座標から、該当する選択肢があるかどうかを問い合わせる
268
+ #マウスカーソル位置などの座標から、座標を含む選択肢があるときはtrue、無いときはfalseを返す
269
+ #まだ選択を開始していないときはfalseを返す
270
+ #_x_:: x方向位置
271
+ #_y_:: y方向位置
272
+ #返却値:: 選択肢が見つかったときはtrue、見つからなかったときはfalseを返す
273
+ def attach?(x, y)
274
+ return false unless @now
275
+ obj = @now.base.detect{|ch| ch.selected ? ch.body_selected.broad_rect.in_range?(x, y) : ch.body.broad_rect.in_range?(x, y) }
276
+ return obj ? true : false
277
+ end
278
+
279
+ #===選択肢を非選択状態に変更する
280
+ #現在の選択状態を、全部選択していない状態にする
281
+ #返却値:: 自分自身を返す
282
+ def non_select
283
+ @now.base.each{|c| c.selected = false } if @now
284
+ @non_select = true
285
+ return self
286
+ end
287
+
288
+ #===画面に描画を指示する
289
+ #現在表示できる選択肢を、現在の状態で描画するよう指示する
290
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る。
291
+ #ブロックの引数は、|インスタンスのSpriteUnit, 画面のSpriteUnit|となる。
292
+ #visibleメソッドの値がfalseのとき、選択が開始されていない時は描画されない。
293
+ #返却値:: 自分自身を返す
294
+ def render(&block)
295
+ return unless @visible
296
+ return self unless @now
297
+ @now.base.each{|c|
298
+ ((c.body_selected && c.selected) ?
299
+ c.body_selected.render(&block) :
300
+ c.body.render(&block)) if c.condition.call
301
+ }
302
+ return self
303
+ end
304
+
305
+ #===画像に描画を指示する
306
+ #現在表示できる選択肢を、現在の状態で描画するよう指示する
307
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る。
308
+ #ブロックの引数は、|インスタンスのSpriteUnit, 画像のSpriteUnit|となる。
309
+ #visibleメソッドの値がfalseのとき、選択が開始されていない時は描画されない。
310
+ #_dst_:: 描画対象の画像インスタンス
311
+ #返却値:: 自分自身を返す
312
+ def render_to(dst, &block)
313
+ return self unless @visible
314
+ return self unless @now
315
+ @now.base.each{|c|
316
+ ((c.body_selected && c.selected) ?
317
+ c.body_selected.render_to(dst, &block) :
318
+ c.body.render_to(dst, &block)) if c.condition.call
319
+ }
320
+ return self
321
+ end
322
+
323
+ #===スプライトに変換した画像を表示する
324
+ #すべてのパーツを貼り付けた、1枚のスプライトを返す
325
+ #引数1個のブロックを渡せば、スプライトに補正をかけることが出来る
326
+ #ただし、選択が開始されていなければnilを返す
327
+ #返却値:: 生成したスプライト
328
+ def to_sprite
329
+ return nil unless @now
330
+ rect = self.broad_rect
331
+ sprite = Sprite.new(:size=>rect.to_a[2,2], :type=>:ac)
332
+ Drawing.fill(sprite, [0,0,0])
333
+ Bitmap.ck_to_ac!(sprite, [0,0,0])
334
+ self.render_to(sprite){|sunit, dunit| sunit.x -= rect.x; sunit.y -= rect.y }
335
+ yield sprite if block_given?
336
+ return sprite
337
+ end
338
+
339
+ #===現在登録している選択肢の最大の大きさを矩形で取得する
340
+ # 現在インスタンスが所持している選択肢全てから左上座標、右下座標を取得し、矩形の形式で返す
341
+ # 但し、選択肢が一つも登録されていない時はRect(0,0,1,1)を返す
342
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
343
+ def broad_rect
344
+ return Rect.new(0, 0, 1, 1) if @choices.length == 0
345
+ xx = []
346
+ yy = []
347
+ @choices.each{|ch|
348
+ ch.each{|cc|
349
+ xx << cc.body.x
350
+ yy << cc.body.y
351
+ if cc.body_selected
352
+ xx << cc.body_selected.x
353
+ yy << cc.body_selected.y
354
+ end
355
+ }
356
+ }
357
+ min_x, max_x = xx.minmax
358
+ min_y, max_y = yy.minmax
359
+ return Rect.new(min_x, min_y, max_x-min_x+1, max_y-min_y+1)
360
+ end
361
+
362
+ #===現在登録している選択肢の大きさを矩形で取得する
363
+ # 内容はbroad_rectメソッドの結果と同じ
364
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
365
+ def rect
366
+ return self.broad_rect
367
+ end
368
+
369
+ #===選択肢を左移動させる
370
+ # 但し、まだ選択が開始されていなければ何もしない
371
+ # 返却値:: 自分自身を返す
372
+ def left_choice
373
+ return self unless @now
374
+ @last_selected = @now
375
+ @now.selected = false
376
+ obj = @now.left
377
+ update_choices(@now, obj)
378
+ @now = obj
379
+ @now.selected = true
380
+ return self
381
+ end
382
+
383
+ #===選択肢を右移動させる
384
+ # 但し、まだ選択が開始されていなければ何もしない
385
+ # 返却値:: 自分自身を返す
386
+ def right_choice
387
+ return self unless @now
388
+ @last_selected = @now
389
+ @now.selected = false
390
+ obj = @now.right
391
+ update_choices(@now, obj)
392
+ @now = obj
393
+ @now.selected = true
394
+ return self
395
+ end
396
+
397
+ #===選択肢を上移動させる
398
+ # 但し、まだ選択が開始されていなければ何もしない
399
+ # 返却値:: 自分自身を返す
400
+ def up_choice
401
+ return self unless @now
402
+ @last_selected = @now
403
+ @now.selected = false
404
+ obj = @now.up
405
+ update_choices(@now, obj)
406
+ @now = obj
407
+ @now.selected = true
408
+ return self
409
+ end
410
+
411
+ #===選択肢を下移動させる
412
+ # 但し、まだ選択が開始されていなければ何もしない
413
+ # 返却値:: 自分自身を返す
414
+ def down_choice
415
+ return self unless @now
416
+ @last_selected = @now
417
+ @now.selected = false
418
+ obj = @now.down
419
+ update_choices(@now, obj)
420
+ @now = obj
421
+ @now.selected = true
422
+ return self
423
+ end
424
+
425
+ #===選択肢のアニメーションを開始する
426
+ # 但し、まだ選択が開始されていなければ何もしない
427
+ # 返却値:: 自分自身を返す
428
+ def start
429
+ return self unless @now
430
+ @now.base.each{|c|
431
+ if c.condition.call
432
+ c.body.start
433
+ c.body_selected.start if c.body != c.body_selected
434
+ end
435
+ }
436
+ return self
437
+ end
438
+
439
+ #===選択肢のアニメーションを終了させる
440
+ # 但し、まだ選択が開始されていなければ何もしない
441
+ # 返却値:: 自分自身を返す
442
+ def stop
443
+ return self unless @now
444
+ @now.base.each{|c|
445
+ if c.condition.call
446
+ c.body.stop
447
+ c.body_selected.stop if c.body != c.body_selected
448
+ end
449
+ }
450
+ return self
451
+ end
452
+
453
+ #===選択肢のアニメーションの再生位置を最初に戻す
454
+ # 但し、まだ選択が開始されていなければ何もしない
455
+ # 返却値:: 自分自身を返す
456
+ def reset
457
+ return self unless @now
458
+ @now.base.each{|c|
459
+ if c.condition.call
460
+ c.body.reset
461
+ c.body_selected.reset if c.body != c.body_selected
462
+ end
463
+ }
464
+ return self
465
+ end
466
+
467
+ #===選択肢のアニメーションを更新させる
468
+ # (手動で更新する必要があるときに呼び出す)
469
+ # 但し、まだ選択が開始されていなければ何もしない
470
+ # 返却値:: 各選択肢のupdate_spriteメソッドを呼び出した結果を配列として返す
471
+ # ただし、現在選択中の配列リストではないときは[false]を返す
472
+ def update_animation
473
+ return [false] unless @now
474
+ @now.base.map{|c|
475
+ ((c.body_selected && c.selected) ?
476
+ c.body_selected.update_animation :
477
+ c.body.update_animation) if c.condition.call
478
+ }
479
+ end
480
+ end
481
+ end