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,586 @@
|
|
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
|
+
module Diagram
|
26
|
+
|
27
|
+
#==遷移図矢印構造体
|
28
|
+
#ノードの移動先とトリガー(遷移条件)を収めている。
|
29
|
+
#to::移動先ノードのインスタンス
|
30
|
+
#trigger::遷移条件オブジェクトのインスタンス
|
31
|
+
Arrow = Struct.new(:to, :trigger)
|
32
|
+
|
33
|
+
#==遷移ノードモジュール
|
34
|
+
#遷移図のノードを構成するモジュール。
|
35
|
+
#
|
36
|
+
#mixinすることで、ノード構成に必要なメソッドを定義できる。
|
37
|
+
#あとは、initializeメソッドなどで、必要なインスタンスを作成することができる。
|
38
|
+
#なお、本モジュールでは、値の格納用に @@node_var を予約しているため、注意が必要
|
39
|
+
module NodeBase
|
40
|
+
@@node_var = {}
|
41
|
+
@@node_var.default = nil
|
42
|
+
|
43
|
+
#===ノードでの開始処理を実装する
|
44
|
+
#Processor#start メソッドが呼ばれたとき、ノードの移動があった直後の処理を実装する
|
45
|
+
def start
|
46
|
+
end
|
47
|
+
|
48
|
+
#===ノードでの中断処理を実装する
|
49
|
+
#Processor#stop メソッドが呼ばれたとき、ノードの移動する直前の処理を実装する
|
50
|
+
def stop
|
51
|
+
end
|
52
|
+
|
53
|
+
#===ノードでの停止処理を実装する
|
54
|
+
#停止処理を実装しないときは、本メソッドを実装する必要はない
|
55
|
+
#Processor#pause メソッドが呼ばれたときの処理を実装する
|
56
|
+
def pause
|
57
|
+
end
|
58
|
+
|
59
|
+
#===ノードでの復帰処理を実装する
|
60
|
+
#停止処理を実装しないときは、本メソッドを実装する必要はない
|
61
|
+
#Processor#resume メソッドが呼ばれたときの処理を実装する
|
62
|
+
def resume
|
63
|
+
end
|
64
|
+
|
65
|
+
#===ノードでの入力デバイス処理を実装する
|
66
|
+
#入力デバイス処理が必要ないときは、本メソッドを実装する必要はない
|
67
|
+
#Processor#update_input メソッドが呼ばれたときの処理を実装する
|
68
|
+
#_params_:: Processor::update_inputメソッドが呼ばれた時のパラメータ群。オーバーライドするときに省略可能
|
69
|
+
def update_input(*params)
|
70
|
+
end
|
71
|
+
|
72
|
+
#===ノードでの更新処理を実装する
|
73
|
+
#Processor#update メソッドが呼ばれたときの処理を実装する
|
74
|
+
#_params_:: Processor::updateメソッドが呼ばれた時のパラメータ群。オーバーライドするときに省略可能
|
75
|
+
def update(*params)
|
76
|
+
end
|
77
|
+
|
78
|
+
#===ノードでの入力デバイス処理の後始末を実装する
|
79
|
+
#入力デバイス処理が必要ないときは、本メソッドを実装する必要はない
|
80
|
+
#Processor#reset_input メソッドが呼ばれたときの処理を実装する
|
81
|
+
def reset_input
|
82
|
+
end
|
83
|
+
|
84
|
+
#===ノードでのレンダリング処理を実装する
|
85
|
+
#Screen.update メソッドを呼び出しているときは、本メソッドを実装する必要はない
|
86
|
+
#Processor#render メソッドが呼ばれたときの処理を実装する
|
87
|
+
def render
|
88
|
+
end
|
89
|
+
|
90
|
+
#===ノードでの実行が終了しているかを示すフラグを返すテンプレートメソッド
|
91
|
+
#Manager#add_arrow メソッドの呼び出しで、移動条件を指定しなければ、このメソッドが呼ばれる。
|
92
|
+
#
|
93
|
+
#ノードの終了を問い合わせる内容を本メソッドに実装する。
|
94
|
+
#返却値:: ノードの実行が終了していれば true を返す(デフォルトは無条件で false を返す)
|
95
|
+
def finish?
|
96
|
+
return false
|
97
|
+
end
|
98
|
+
|
99
|
+
#===現在実行しているノードの変数の値を取得するテンプレートメソッド
|
100
|
+
#Diagram#[] メソッドが呼ばれたときの処理を実装する
|
101
|
+
#
|
102
|
+
#mixin されたクラス内でアクセスする際は、便宜上、"self[...]"を使用する
|
103
|
+
#_name_:: 変数名(文字列・シンボル)
|
104
|
+
#返却値:: 変数の値(デフォルトはnil)
|
105
|
+
def [](name)
|
106
|
+
unless @@node_var[self.object_id]
|
107
|
+
@@node_var[self.object_id] = {}
|
108
|
+
@@node_var[self.object_id].default = nil
|
109
|
+
end
|
110
|
+
return @@node_var[self.object_id][name]
|
111
|
+
end
|
112
|
+
|
113
|
+
#===現在実行中のノードの変数に値を設定する
|
114
|
+
#Diagram#[]= メソッドが呼ばれたときの処理を実装する
|
115
|
+
#
|
116
|
+
#mixin されたクラス内でアクセスする際は、便宜上、"self[...]=..."を使用する
|
117
|
+
#_name_:: 変数名(文字列・シンボル)
|
118
|
+
#_value_:: 設定したい値
|
119
|
+
def []=(name, value)
|
120
|
+
unless @@node_var[self.object_id]
|
121
|
+
@@node_var[self.object_id] = {}
|
122
|
+
@@node_var[self.object_id].default = nil
|
123
|
+
end
|
124
|
+
@@node_var[self.object_id][name] = value
|
125
|
+
end
|
126
|
+
|
127
|
+
#===ノードのインスタンスを解放させるテンプレートメソッド
|
128
|
+
#Processor#dispose メソッドの呼び出したときに呼び出さされる
|
129
|
+
def dispose
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
#==遷移条件モジュール
|
134
|
+
#遷移図の移動条件を構成するモジュール。
|
135
|
+
#
|
136
|
+
#mixinすることで、遷移条件構成に必要なメソッドを定義できる。
|
137
|
+
#各メソッドは、前処理・後処理と、遷移条件の判別式を定義できる。
|
138
|
+
#判別式をあらわすメソッドは、必ずtrue/falseをかえすように設計する。
|
139
|
+
#判別式を用意できるのは、updateとrenderの処理のみ。
|
140
|
+
#あとは、initializeメソッドなどで、必要なインスタンスを作成することができる。
|
141
|
+
module TriggerBase
|
142
|
+
#===前処理を実装する
|
143
|
+
#Processor#start メソッドが呼び出されたときの処理を実装する
|
144
|
+
def pre_process
|
145
|
+
end
|
146
|
+
|
147
|
+
#===後始末を実装する
|
148
|
+
#Processor#stop メソッドが呼び出されたときの処理を実装する
|
149
|
+
def post_process
|
150
|
+
end
|
151
|
+
|
152
|
+
#===ノードの更新処理を行うかどうかの問い合わせメソッドを実装する
|
153
|
+
#NodeBase#update を呼び出すかどうかを返す処理を実装する
|
154
|
+
#デフォルトでは、無条件で true を返す
|
155
|
+
#返却値:: NodeBase#update メソッドを呼び出したいときは true を返す
|
156
|
+
def update?
|
157
|
+
return true
|
158
|
+
end
|
159
|
+
|
160
|
+
#===ノードの更新処理が終わった後の後始末を行う
|
161
|
+
#NodeBase#update を呼び出された後の処理を実装する
|
162
|
+
def post_update
|
163
|
+
end
|
164
|
+
|
165
|
+
#===ノードのレンダリング処理を行うかどうかの問い合わせメソッドを実装する
|
166
|
+
#NodeBase#render を呼び出すかどうかを返す処理を実装する
|
167
|
+
#デフォルトでは、無条件で true を返す
|
168
|
+
#Screen.update メソッドを呼び出しているときは、本メソッドを実装する必要はない
|
169
|
+
#返却値:: NodeBase#render メソッドを呼び出したいときは true を返す
|
170
|
+
def render?
|
171
|
+
return true
|
172
|
+
end
|
173
|
+
|
174
|
+
#===ノードのレンダリング処理が終わった後の後始末を行う
|
175
|
+
#Screen.update メソッドを呼び出しているときは、本メソッドを実装する必要はない
|
176
|
+
#NodeBase#render を呼び出された後の処理を実装する
|
177
|
+
def post_render
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
#==デフォルト遷移条件クラス
|
182
|
+
#デフォルトの遷移条件を構成したクラス。
|
183
|
+
#
|
184
|
+
#遷移条件が無条件のときにインスタンスを作成するだけで使用できる。
|
185
|
+
#すべての条件式が「true」を返すのみとなっている。
|
186
|
+
class DefaultTrigger
|
187
|
+
include Miyako::Diagram::TriggerBase
|
188
|
+
end
|
189
|
+
|
190
|
+
#==遷移図クラス本体
|
191
|
+
#但し、実質的にメソッドを呼び出すのはManagerクラスから呼び出す
|
192
|
+
class DiagramBody
|
193
|
+
attr_reader :name, :node #:nodoc:
|
194
|
+
TRIGGER_TYPES=[:immediate, :next]
|
195
|
+
|
196
|
+
def initialize(name, body, trigger = nil) #:nodoc:
|
197
|
+
@name = name # デバッグ用
|
198
|
+
@node = body
|
199
|
+
@trigger = trigger ? trigger : Miyako::Diagram::DefaultTrigger.new
|
200
|
+
@arrow = []
|
201
|
+
@next_trigger = nil
|
202
|
+
end
|
203
|
+
|
204
|
+
def initialize_copy(obj) #:nodoc:
|
205
|
+
@name = @name.dup # デバッグ用
|
206
|
+
@node = @node.dup
|
207
|
+
@trigger = @trigger.dup
|
208
|
+
@arrow = @arrow.dup
|
209
|
+
@next_trigger = @next_trigger.dup
|
210
|
+
end
|
211
|
+
|
212
|
+
def add_arrow(to, trigger) #:nodoc:
|
213
|
+
@arrow.push(Miyako::Diagram::Arrow.new(to, trigger))
|
214
|
+
end
|
215
|
+
|
216
|
+
def start #:nodoc:
|
217
|
+
@trigger.pre_process
|
218
|
+
@node.start
|
219
|
+
end
|
220
|
+
|
221
|
+
def stop #:nodoc:
|
222
|
+
@node.stop
|
223
|
+
@trigger.post_process
|
224
|
+
end
|
225
|
+
|
226
|
+
def pause #:nodoc:
|
227
|
+
@node.pause
|
228
|
+
end
|
229
|
+
|
230
|
+
def resume #:nodoc:
|
231
|
+
@node.resume
|
232
|
+
end
|
233
|
+
|
234
|
+
def update_input(*params) #:nodoc:
|
235
|
+
@node.update_input(*params)
|
236
|
+
end
|
237
|
+
|
238
|
+
def update(*params) #:nodoc:
|
239
|
+
if @trigger.update?
|
240
|
+
@node.update(*params)
|
241
|
+
@trigger.post_update
|
242
|
+
@node.reset_input
|
243
|
+
if @next_trigger
|
244
|
+
@trigger = @next_trigger
|
245
|
+
@next_trigger = nil
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def render #:nodoc:
|
251
|
+
if @trigger.render?
|
252
|
+
@node.render
|
253
|
+
@trigger.post_render
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def [](name) #:nodoc:
|
258
|
+
return @node[name]
|
259
|
+
end
|
260
|
+
|
261
|
+
def []=(name, value) #:nodoc:
|
262
|
+
@node[name] = value
|
263
|
+
end
|
264
|
+
|
265
|
+
#===更新タイミングを計るトリガーオブジェクトを置き換える
|
266
|
+
#現在実行しているトリガーを新しいトリガーオブジェクトに置き換える。
|
267
|
+
#置き換えのタイミングは、以下の2種が選択可能(シンボルで指定)
|
268
|
+
#:immediate:: 即時に置き換え。現在実行中のトリガーを停止して、引数で指定したトリガーに置き換えて実行を開始する
|
269
|
+
#:next:: 次回更新時に置き換え。本メソッドが呼ばれた次の更新(updateメソッドが呼ばれた時)にトリガーを置き換える
|
270
|
+
#_new_trigger_:: 置き換え対象のトリガーオブジェクト
|
271
|
+
#_timing_:: 置き換えのタイミング。:immediateと:nextの2種類がある
|
272
|
+
def replace_trigger(new_trigger, timing=:next)
|
273
|
+
raise MiyakoError, "I can't understand Timing Typ! : #{timing}" unless TRIGGER_TYPES.include?(timing)
|
274
|
+
case timing
|
275
|
+
when :immediate
|
276
|
+
@trigger.stop
|
277
|
+
@trigger.post_process
|
278
|
+
@trigger = new_trigger
|
279
|
+
@trigger.pre_process
|
280
|
+
when :next
|
281
|
+
@next_trigger = new_trigger
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
def dispose #:nodoc:
|
286
|
+
@node.dispose
|
287
|
+
end
|
288
|
+
|
289
|
+
def go_next #:nodoc:
|
290
|
+
next_obj = self
|
291
|
+
@arrow.each{|arrow|
|
292
|
+
break (next_obj = arrow.to) if (arrow.trigger && arrow.trigger.call(@node))
|
293
|
+
break (next_obj = arrow.to) if @node.finish?
|
294
|
+
}
|
295
|
+
@trigger.post_process unless self.equal?(next_obj)
|
296
|
+
return next_obj
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
#==遷移図管理クラス
|
301
|
+
#遷移図クラス本体(Diagramクラス)を管理するクラス。
|
302
|
+
class Manager
|
303
|
+
def initialize #:nodoc:
|
304
|
+
@name2idx = {}
|
305
|
+
@list = []
|
306
|
+
@ptr = nil
|
307
|
+
@first = nil
|
308
|
+
@executing = false
|
309
|
+
end
|
310
|
+
|
311
|
+
def initialize_copy(obj) #:nodoc:
|
312
|
+
@name2idx = @name2idx.dup
|
313
|
+
@list = @list.dup
|
314
|
+
@ptr = @ptr.dup
|
315
|
+
@first = @first.dup
|
316
|
+
end
|
317
|
+
|
318
|
+
#===遷移図にノードを追加する
|
319
|
+
#状態遷移図のノードに対応するオブジェクト(NodeBaseモジュールをmixinしたクラス)を登録する
|
320
|
+
#名前が重複している場合は、後に登録したノードが採用される。
|
321
|
+
#_name_:: ノード名。文字列かシンボルを使用
|
322
|
+
#_body_:: ノード本体。DiagramNodeBase モジュールを mixin したクラスのインスタンス
|
323
|
+
#_trigger_:: NodeTriggerBase モジュールを mixin したクラスのインスタンス。デフォルトは NpdeTrogger クラスのインスタンス
|
324
|
+
def add(name, body, trigger = nil)
|
325
|
+
@list << Miyako::Diagram::DiagramBody.new(name, body, trigger)
|
326
|
+
@name2idx[name] = @list.last
|
327
|
+
@first = @list.first unless @first
|
328
|
+
return self
|
329
|
+
end
|
330
|
+
|
331
|
+
#===ノード間移動のアローを追加する
|
332
|
+
#移動元ノードと移動先ノードの名前を指定し、条件にかなえばノードを移動する矢印を設定する。
|
333
|
+
#Processor#updateメソッドを呼び出した時、移動条件を確認して移動するかどうかを判断する。
|
334
|
+
#デフォルトでは、ノードのfinish?メソッドがtrueのときにto_nameで示したノードへ移動する。
|
335
|
+
#結果がfalse のときは、from_nameで示したノードを継続して使用する(stopメソッドは呼ばれない)。
|
336
|
+
#また、引数が一つのブロックを渡すことができる。
|
337
|
+
#引数には、現在評価中のノード(from_nameで示したノードのインスタンス)が渡される。
|
338
|
+
#評価の結果、true のときは、to_name で示したノードへ移動する。
|
339
|
+
#結果がfalse のときは、from_nameで示したノードを継続して使用する(stopメソッドは呼ばれない)。
|
340
|
+
#同じ移動元のアローが複数登録されているときは、先に登録したノードの移動条件を確認する。
|
341
|
+
#_from_name_:: 移動元ノード名。文字列かシンボルを使用
|
342
|
+
#_to_name_:: 移動先ノード名。文字列かシンボルを使用
|
343
|
+
#_trigger_:: ノード間移動するかどうかを返すブロック。ブロックは引数を一つ取る(from_name で示したノードのインスタンス)
|
344
|
+
def add_arrow(from_name, to_name, &trigger)
|
345
|
+
@name2idx[from_name].add_arrow(to_name ? @name2idx[to_name] : nil, trigger)
|
346
|
+
return self
|
347
|
+
end
|
348
|
+
|
349
|
+
#===対象の名前を持つノードを取得する
|
350
|
+
#ノード内の変数にアクセスするときに使う
|
351
|
+
#_name_:: ノード名
|
352
|
+
#返却値:: 指定のノード
|
353
|
+
def [](name)
|
354
|
+
raise MiyakoError, "Don't set undefined node name!" unless @name2idx.has_key?(name)
|
355
|
+
return @name2idx[name]
|
356
|
+
end
|
357
|
+
|
358
|
+
#===実行開始ノードを変更する
|
359
|
+
#但し、遷移図処理が行われていないときに変更可能
|
360
|
+
#_name_:: ノード名
|
361
|
+
def move(name)
|
362
|
+
raise MiyakoError, "Don't set undefined node name!" unless @name2idx.has_key?(name)
|
363
|
+
return if @executing
|
364
|
+
@ptr = @name2idx[name]
|
365
|
+
end
|
366
|
+
|
367
|
+
#===実行開始ノードを、最初に登録したノードに変更する
|
368
|
+
#但し、遷移図処理が行われていないときに変更可能
|
369
|
+
def first
|
370
|
+
return if @executing
|
371
|
+
@ptr = @first
|
372
|
+
end
|
373
|
+
|
374
|
+
def now #:nodoc:
|
375
|
+
return @ptr ? @ptr.name : nil
|
376
|
+
end
|
377
|
+
|
378
|
+
def now_node #:nodoc:
|
379
|
+
return @ptr ? @ptr.node : nil
|
380
|
+
end
|
381
|
+
|
382
|
+
def nodes
|
383
|
+
return @name2idx.keys
|
384
|
+
end
|
385
|
+
|
386
|
+
def start #:nodoc:
|
387
|
+
@ptr = @first unless @ptr
|
388
|
+
return unless @ptr
|
389
|
+
@ptr.start
|
390
|
+
@executing = true
|
391
|
+
end
|
392
|
+
|
393
|
+
def stop #:nodoc:
|
394
|
+
@ptr.stop if @ptr
|
395
|
+
@ptr = nil
|
396
|
+
@executing = false
|
397
|
+
end
|
398
|
+
|
399
|
+
def pause #:nodoc:
|
400
|
+
@ptr.pause if @ptr
|
401
|
+
end
|
402
|
+
|
403
|
+
def resume #:nodoc:
|
404
|
+
@ptr.resume if @ptr
|
405
|
+
end
|
406
|
+
|
407
|
+
def update_input(*params) #:nodoc:
|
408
|
+
@ptr.update_input(*params) if @ptr
|
409
|
+
end
|
410
|
+
|
411
|
+
def update(*params) #:nodoc:
|
412
|
+
return unless @ptr
|
413
|
+
@ptr.update(*params)
|
414
|
+
nxt = @ptr.go_next
|
415
|
+
unless @ptr.equal?(nxt)
|
416
|
+
@ptr.stop
|
417
|
+
@ptr = nxt
|
418
|
+
@ptr.start if @ptr
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
def render #:nodoc:
|
423
|
+
@ptr.render if @ptr
|
424
|
+
end
|
425
|
+
|
426
|
+
def finish? #:nodoc:
|
427
|
+
return @ptr == nil
|
428
|
+
end
|
429
|
+
|
430
|
+
def dispose #:nodoc:
|
431
|
+
@name2idx.keys.each{|k|
|
432
|
+
@name2idx[k].dispose
|
433
|
+
}
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
#==レンダラクラス
|
438
|
+
#レンダリングのみを行うクラス
|
439
|
+
#Processor#render メソッドのみを呼び出せる
|
440
|
+
#インスタンス生成は、Processor#renderer メソッドを呼び出して行う
|
441
|
+
class Renderer
|
442
|
+
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
443
|
+
|
444
|
+
def initialize(obj) #:nodoc:
|
445
|
+
@renderer = obj
|
446
|
+
@visible = true
|
447
|
+
end
|
448
|
+
|
449
|
+
def initialize_copy(obj) #:nodoc:
|
450
|
+
@renderer = @renderer.dup
|
451
|
+
end
|
452
|
+
|
453
|
+
#===レンダリングを行う
|
454
|
+
#Processor#render メソッドを呼び出す
|
455
|
+
#visibleメソッドの値がfalseのときは描画されない。
|
456
|
+
def render
|
457
|
+
return unless @visible
|
458
|
+
@renderer.call
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
#==遷移図操作クラス
|
463
|
+
#遷移図形式の処理を制御するクラス
|
464
|
+
class Processor
|
465
|
+
#遷移図本体。Manager クラスのインスタンス
|
466
|
+
attr_reader :diagram
|
467
|
+
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
468
|
+
|
469
|
+
#===インスタンスを生成する
|
470
|
+
#遷移図形式のインスタンス群を生成する
|
471
|
+
#ブロックを必ず取り(取らないとエラー)、ブロック内では、遷移図の構成を実装する
|
472
|
+
#(Manager#add, Manager#add_arrow の各メソッドを参照)
|
473
|
+
#返却値:: 生成されたインスタンス
|
474
|
+
def initialize
|
475
|
+
@loop = self.method(:main_loop)
|
476
|
+
@states = {:execute => false, :pause => false, :type1 => false }
|
477
|
+
@diagram = Miyako::Diagram::Manager.new
|
478
|
+
@visible = true
|
479
|
+
yield @diagram if block_given?
|
480
|
+
end
|
481
|
+
|
482
|
+
def initialize_copy(obj) #:nodocs:
|
483
|
+
@loop = @loop.dup
|
484
|
+
@states = @states.dup
|
485
|
+
@diagram = @diagram.dup
|
486
|
+
end
|
487
|
+
|
488
|
+
#===遷移図形式の処理を開始する
|
489
|
+
def start
|
490
|
+
return if @states[:execute]
|
491
|
+
@diagram.start
|
492
|
+
@states[:execute] = true
|
493
|
+
end
|
494
|
+
|
495
|
+
#===実行中の処理を中断させる
|
496
|
+
def stop
|
497
|
+
return unless @states[:execute]
|
498
|
+
@diagram.stop
|
499
|
+
@states[:execute] = false
|
500
|
+
end
|
501
|
+
|
502
|
+
#===実行中の処理を停止させる
|
503
|
+
#resume メソッドが呼び出されるまで停止は復帰されない
|
504
|
+
def pause
|
505
|
+
return unless @states[:execute]
|
506
|
+
@states[:pause] = true
|
507
|
+
end
|
508
|
+
|
509
|
+
#===停止状態から復帰する
|
510
|
+
#このメソッドを呼び出すまで停止状態を保つ
|
511
|
+
def resume
|
512
|
+
return unless @states[:execute]
|
513
|
+
@states[:pause] = false
|
514
|
+
end
|
515
|
+
|
516
|
+
#===入力デバイスに関わる処理を行う
|
517
|
+
#現在処理中のノードのupdate_inputメソッドを呼び出す。
|
518
|
+
#_params_:: パラメータ群。省略可能
|
519
|
+
def update_input(*params)
|
520
|
+
return if @states[:pause]
|
521
|
+
@diagram.update_input(*params)
|
522
|
+
end
|
523
|
+
|
524
|
+
#===処理の更新を行う
|
525
|
+
#現在処理中のノードupdateメソッドを呼び出す。
|
526
|
+
#_params_:: パラメータ群。省略可能
|
527
|
+
def update(*params)
|
528
|
+
return if @states[:pause]
|
529
|
+
@diagram.update(*params)
|
530
|
+
@states[:execute] = false if @diagram.finish?
|
531
|
+
end
|
532
|
+
|
533
|
+
#===レンダリング処理を行う
|
534
|
+
#現在処理中のノードのrenderメソッドを呼び出す。
|
535
|
+
#visibleメソッドの値がfalseのときは描画されない。
|
536
|
+
def render
|
537
|
+
return unless @visible
|
538
|
+
@diagram.render
|
539
|
+
end
|
540
|
+
|
541
|
+
#===遷移図形式の処理が終了しているかどうかを取得する
|
542
|
+
#遷移図処理が終了したときと停止(Diagram::Processor#stop メソッドを実行)した時に finish? メソッドは true を返す
|
543
|
+
#返却値:: 処理が終了していれば(開始前ならば) true を返す
|
544
|
+
def finish?
|
545
|
+
@diagram.finish?
|
546
|
+
end
|
547
|
+
|
548
|
+
#===各ノードに格納されているインスタンスを解放する
|
549
|
+
def dispose
|
550
|
+
@diagram.dispose
|
551
|
+
end
|
552
|
+
|
553
|
+
#===レンダリングのみのインスタンスを生成する
|
554
|
+
#MVCを推し進めるため、別の場所でレンダリングを行いたい場合に生成する。
|
555
|
+
#返却値:: DiagramRenderer クラスのインスタンス
|
556
|
+
def renderer
|
557
|
+
return Miyako::Diagram::Renderer.new(self.method(:render))
|
558
|
+
end
|
559
|
+
|
560
|
+
#===指定した名前のノードを取得する
|
561
|
+
#_name_:: ノード名(文字列・シンボル)
|
562
|
+
#返却値:: ノード名に対応したノードのインスタンス
|
563
|
+
def [](name)
|
564
|
+
return @diagram[name]
|
565
|
+
end
|
566
|
+
|
567
|
+
#===現在実行しているノード名を取得する
|
568
|
+
#返却値:: ノード名(文字列・シンボル)
|
569
|
+
def now
|
570
|
+
return @diagram.now
|
571
|
+
end
|
572
|
+
|
573
|
+
#===現在実行しているノードを取得する
|
574
|
+
#返却値:: ノードのインスタンス
|
575
|
+
def now_node
|
576
|
+
return @diagram.now_node
|
577
|
+
end
|
578
|
+
|
579
|
+
#===登録しているノード名のリストを取得する
|
580
|
+
#返却値:: ノード名リスト
|
581
|
+
def nodes
|
582
|
+
return @diagram.nodes
|
583
|
+
end
|
584
|
+
end
|
585
|
+
end
|
586
|
+
end
|