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.
- data/README +1115 -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_no_katana.so +0 -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/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 +190 -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
- 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
|