ruby-miyako 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/README +1115 -0
  2. data/Rakefile +7 -0
  3. data/defines.h +144 -0
  4. data/extconf.rb +44 -0
  5. data/extern.h +29 -0
  6. data/img/cursor.png +0 -0
  7. data/img/cursors.png +0 -0
  8. data/img/dice.png +0 -0
  9. data/img/wait_cursor.png +0 -0
  10. data/img/win_base.png +0 -0
  11. data/img/window.png +0 -0
  12. data/install_miyako.rb +87 -0
  13. data/lib/Miyako/API/audio.rb +584 -0
  14. data/lib/Miyako/API/basic_data.rb +1026 -0
  15. data/lib/Miyako/API/bitmap.rb +534 -0
  16. data/lib/Miyako/API/choices.rb +481 -0
  17. data/lib/Miyako/API/collision.rb +638 -0
  18. data/lib/Miyako/API/diagram.rb +586 -0
  19. data/lib/Miyako/API/drawing.rb +151 -0
  20. data/lib/Miyako/API/exceptions.rb +105 -0
  21. data/lib/Miyako/API/fixedmap.rb +462 -0
  22. data/lib/Miyako/API/font.rb +430 -0
  23. data/lib/Miyako/API/input.rb +456 -0
  24. data/lib/Miyako/API/layout.rb +644 -0
  25. data/lib/Miyako/API/map.rb +583 -0
  26. data/lib/Miyako/API/map_event.rb +222 -0
  27. data/lib/Miyako/API/modules.rb +357 -0
  28. data/lib/Miyako/API/movie.rb +166 -0
  29. data/lib/Miyako/API/parts.rb +188 -0
  30. data/lib/Miyako/API/plane.rb +205 -0
  31. data/lib/Miyako/API/screen.rb +341 -0
  32. data/lib/Miyako/API/shape.rb +443 -0
  33. data/lib/Miyako/API/sprite.rb +773 -0
  34. data/lib/Miyako/API/sprite_animation.rb +494 -0
  35. data/lib/Miyako/API/sprite_list.rb +1135 -0
  36. data/lib/Miyako/API/spriteunit.rb +168 -0
  37. data/lib/Miyako/API/story.rb +350 -0
  38. data/lib/Miyako/API/textbox.rb +773 -0
  39. data/lib/Miyako/API/utility.rb +419 -0
  40. data/lib/Miyako/API/viewport.rb +190 -0
  41. data/lib/Miyako/API/yuki.rb +1180 -0
  42. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  43. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  44. data/lib/Miyako/EXT/slides.rb +157 -0
  45. data/lib/Miyako/miyako.rb +201 -0
  46. data/lib/Miyako/miyako_require_only.rb +35 -0
  47. data/logo/EGSR_logo.png +0 -0
  48. data/logo/EGSR_logo_bg.png +0 -0
  49. data/logo/EGSR_logo_fg.png +0 -0
  50. data/logo/EGSR_title_banner.png +0 -0
  51. data/logo/EGSR_title_logo.png +0 -0
  52. data/logo/miyako.png +0 -0
  53. data/logo/miyako_banner.png +0 -0
  54. data/logo/space.png +0 -0
  55. data/miyako_basicdata.c +484 -0
  56. data/miyako_bitmap.c +1225 -0
  57. data/miyako_collision.c +403 -0
  58. data/miyako_drawing.c +187 -0
  59. data/miyako_font.c +334 -0
  60. data/miyako_hsv.c +830 -0
  61. data/miyako_input_audio.c +254 -0
  62. data/miyako_layout.c +191 -0
  63. data/miyako_no_katana.c +1086 -0
  64. data/miyako_sprite2.c +431 -0
  65. data/miyako_transform.c +438 -0
  66. data/miyako_utility.c +288 -0
  67. data/sample/Animation1/m1ku.rb +68 -0
  68. data/sample/Animation1/m1ku_arm_0.png +0 -0
  69. data/sample/Animation1/m1ku_arm_1.png +0 -0
  70. data/sample/Animation1/m1ku_arm_2.png +0 -0
  71. data/sample/Animation1/m1ku_arm_3.png +0 -0
  72. data/sample/Animation1/m1ku_back.jpg +0 -0
  73. data/sample/Animation1/m1ku_body.png +0 -0
  74. data/sample/Animation1/m1ku_eye_0.png +0 -0
  75. data/sample/Animation1/m1ku_eye_1.png +0 -0
  76. data/sample/Animation1/m1ku_eye_2.png +0 -0
  77. data/sample/Animation1/m1ku_eye_3.png +0 -0
  78. data/sample/Animation1/m1ku_hair_front.png +0 -0
  79. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  80. data/sample/Animation1/readme.txt +72 -0
  81. data/sample/Animation2/lex.rb +96 -0
  82. data/sample/Animation2/lex_back.png +0 -0
  83. data/sample/Animation2/lex_body.png +0 -0
  84. data/sample/Animation2/lex_roadroller.png +0 -0
  85. data/sample/Animation2/lex_wheel_0.png +0 -0
  86. data/sample/Animation2/lex_wheel_1.png +0 -0
  87. data/sample/Animation2/lex_wheel_2.png +0 -0
  88. data/sample/Animation2/readme.txt +72 -0
  89. data/sample/Animation2/song_title.png +0 -0
  90. data/sample/Diagram_sample/back.png +0 -0
  91. data/sample/Diagram_sample/chr01.png +0 -0
  92. data/sample/Diagram_sample/chr02.png +0 -0
  93. data/sample/Diagram_sample/cursor.png +0 -0
  94. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  95. data/sample/Diagram_sample/readme.txt +90 -0
  96. data/sample/Diagram_sample/wait_cursor.png +0 -0
  97. data/sample/Room3/blue.rb +297 -0
  98. data/sample/Room3/ending.rb +180 -0
  99. data/sample/Room3/green.rb +220 -0
  100. data/sample/Room3/image/akamatsu.png +0 -0
  101. data/sample/Room3/image/aoyama.png +0 -0
  102. data/sample/Room3/image/congra.png +0 -0
  103. data/sample/Room3/image/congratulation.png +0 -0
  104. data/sample/Room3/image/congratulation_bg.png +0 -0
  105. data/sample/Room3/image/cursor.png +0 -0
  106. data/sample/Room3/image/midori.png +0 -0
  107. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  108. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  109. data/sample/Room3/image/room_blue.png +0 -0
  110. data/sample/Room3/image/room_green.png +0 -0
  111. data/sample/Room3/image/room_red.png +0 -0
  112. data/sample/Room3/image/start.png +0 -0
  113. data/sample/Room3/image/three_doors.png +0 -0
  114. data/sample/Room3/image/wait_cursor.png +0 -0
  115. data/sample/Room3/main.rb +120 -0
  116. data/sample/Room3/main_component.rb +59 -0
  117. data/sample/Room3/readme.txt +76 -0
  118. data/sample/Room3/red.rb +227 -0
  119. data/sample/Room3/room3.rb +25 -0
  120. data/sample/Room3/title.rb +184 -0
  121. data/sample/ball_action_sample.rb +204 -0
  122. data/sample/blit_rop.rb +70 -0
  123. data/sample/cairo_sample.rb +25 -0
  124. data/sample/circle_collision_test.rb +66 -0
  125. data/sample/collision_test.rb +33 -0
  126. data/sample/collision_test2.rb +108 -0
  127. data/sample/fixed_map_test/cursor.png +0 -0
  128. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  129. data/sample/fixed_map_test/map.csv +19 -0
  130. data/sample/fixed_map_test/map_01.png +0 -0
  131. data/sample/fixed_map_test/mapchip.csv +23 -0
  132. data/sample/fixed_map_test/monster.png +0 -0
  133. data/sample/fixed_map_test/readme.txt +72 -0
  134. data/sample/map_test/chara.rb +58 -0
  135. data/sample/map_test/chr1.png +0 -0
  136. data/sample/map_test/cursor.png +0 -0
  137. data/sample/map_test/main_parts.rb +69 -0
  138. data/sample/map_test/main_scene.rb +153 -0
  139. data/sample/map_test/map.png +0 -0
  140. data/sample/map_test/map2.png +0 -0
  141. data/sample/map_test/map_layer.csv +127 -0
  142. data/sample/map_test/map_manager.rb +75 -0
  143. data/sample/map_test/map_test.rb +23 -0
  144. data/sample/map_test/mapchip.csv +21 -0
  145. data/sample/map_test/oasis.rb +71 -0
  146. data/sample/map_test/readme.txt +89 -0
  147. data/sample/map_test/route.rb +157 -0
  148. data/sample/map_test/sea.png +0 -0
  149. data/sample/map_test/town.rb +74 -0
  150. data/sample/map_test/wait_cursor.png +0 -0
  151. data/sample/map_test/window.png +0 -0
  152. data/sample/polygon_test.rb +35 -0
  153. data/sample/rasterscroll.rb +25 -0
  154. data/sample/takahashi.rb +42 -0
  155. data/sample/text.png +0 -0
  156. data/sample/textbox_sample.rb +192 -0
  157. data/sample/transform.rb +54 -0
  158. data/sample/utility_test.rb +73 -0
  159. data/sample/utility_test2.rb +61 -0
  160. data/sample/utility_test3.rb +64 -0
  161. data/sample/utility_test4.rb +73 -0
  162. data/uninstall_miyako.rb +19 -0
  163. data/win/miyako_no_katana.so +0 -0
  164. metadata +216 -0
@@ -0,0 +1,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