ruby-miyako-mswin32 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,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