cyross-ruby-miyako 2.0.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 (125) hide show
  1. data/README +977 -0
  2. data/Rakefile +7 -0
  3. data/img/cursor.png +0 -0
  4. data/img/cursors.png +0 -0
  5. data/img/dice.png +0 -0
  6. data/img/wait_cursor.png +0 -0
  7. data/img/win_base.png +0 -0
  8. data/img/window.png +0 -0
  9. data/install_miyako.rb +75 -0
  10. data/lib/Miyako/API/audio.rb +198 -0
  11. data/lib/Miyako/API/basic_data.rb +431 -0
  12. data/lib/Miyako/API/bitmap.rb +35 -0
  13. data/lib/Miyako/API/choices.rb +308 -0
  14. data/lib/Miyako/API/collision.rb +444 -0
  15. data/lib/Miyako/API/diagram.rb +573 -0
  16. data/lib/Miyako/API/drawing.rb +110 -0
  17. data/lib/Miyako/API/fixedmap.rb +315 -0
  18. data/lib/Miyako/API/font.rb +384 -0
  19. data/lib/Miyako/API/input.rb +440 -0
  20. data/lib/Miyako/API/layout.rb +451 -0
  21. data/lib/Miyako/API/map.rb +403 -0
  22. data/lib/Miyako/API/map_event.rb +198 -0
  23. data/lib/Miyako/API/modules.rb +109 -0
  24. data/lib/Miyako/API/movie.rb +151 -0
  25. data/lib/Miyako/API/parts.rb +154 -0
  26. data/lib/Miyako/API/plane.rb +131 -0
  27. data/lib/Miyako/API/screen.rb +257 -0
  28. data/lib/Miyako/API/shape.rb +362 -0
  29. data/lib/Miyako/API/sprite.rb +338 -0
  30. data/lib/Miyako/API/sprite_animation.rb +461 -0
  31. data/lib/Miyako/API/spriteunit.rb +113 -0
  32. data/lib/Miyako/API/story.rb +224 -0
  33. data/lib/Miyako/API/textbox.rb +496 -0
  34. data/lib/Miyako/API/viewport.rb +435 -0
  35. data/lib/Miyako/API/yuki.rb +779 -0
  36. data/lib/Miyako/EXT/miyako_cairo.rb +60 -0
  37. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  38. data/lib/Miyako/EXT/slides.rb +136 -0
  39. data/lib/Miyako/miyako.rb +172 -0
  40. data/miyako.png +0 -0
  41. data/miyako_banner.png +0 -0
  42. data/miyako_no_katana/extconf.rb +34 -0
  43. data/miyako_no_katana/miyako_no_katana.c +3301 -0
  44. data/sample/Animation1/m1ku.rb +89 -0
  45. data/sample/Animation1/m1ku_arm_0.png +0 -0
  46. data/sample/Animation1/m1ku_arm_1.png +0 -0
  47. data/sample/Animation1/m1ku_arm_2.png +0 -0
  48. data/sample/Animation1/m1ku_arm_3.png +0 -0
  49. data/sample/Animation1/m1ku_back.jpg +0 -0
  50. data/sample/Animation1/m1ku_body.png +0 -0
  51. data/sample/Animation1/m1ku_eye_0.png +0 -0
  52. data/sample/Animation1/m1ku_eye_1.png +0 -0
  53. data/sample/Animation1/m1ku_eye_2.png +0 -0
  54. data/sample/Animation1/m1ku_eye_3.png +0 -0
  55. data/sample/Animation1/m1ku_hair_front.png +0 -0
  56. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  57. data/sample/Animation1/readme.txt +72 -0
  58. data/sample/Animation2/lex.rb +95 -0
  59. data/sample/Animation2/lex_back.png +0 -0
  60. data/sample/Animation2/lex_body.png +0 -0
  61. data/sample/Animation2/lex_roadroller.png +0 -0
  62. data/sample/Animation2/lex_wheel_0.png +0 -0
  63. data/sample/Animation2/lex_wheel_1.png +0 -0
  64. data/sample/Animation2/lex_wheel_2.png +0 -0
  65. data/sample/Animation2/readme.txt +72 -0
  66. data/sample/Animation2/song_title.png +0 -0
  67. data/sample/Diagram_sample/back.png +0 -0
  68. data/sample/Diagram_sample/chr01.png +0 -0
  69. data/sample/Diagram_sample/chr02.png +0 -0
  70. data/sample/Diagram_sample/cursor.png +0 -0
  71. data/sample/Diagram_sample/diagram_sample_yuki2.rb +283 -0
  72. data/sample/Diagram_sample/readme.txt +87 -0
  73. data/sample/Diagram_sample/wait_cursor.png +0 -0
  74. data/sample/Room3/blue.rb +250 -0
  75. data/sample/Room3/ending.rb +175 -0
  76. data/sample/Room3/green.rb +185 -0
  77. data/sample/Room3/image/akamatsu.png +0 -0
  78. data/sample/Room3/image/aoyama.png +0 -0
  79. data/sample/Room3/image/congra.png +0 -0
  80. data/sample/Room3/image/congratulation.png +0 -0
  81. data/sample/Room3/image/congratulation_bg.png +0 -0
  82. data/sample/Room3/image/cursor.png +0 -0
  83. data/sample/Room3/image/midori.png +0 -0
  84. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  85. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  86. data/sample/Room3/image/room_blue.png +0 -0
  87. data/sample/Room3/image/room_green.png +0 -0
  88. data/sample/Room3/image/room_red.png +0 -0
  89. data/sample/Room3/image/start.png +0 -0
  90. data/sample/Room3/image/three_doors.png +0 -0
  91. data/sample/Room3/image/wait_cursor.png +0 -0
  92. data/sample/Room3/main.rb +102 -0
  93. data/sample/Room3/main_component.rb +58 -0
  94. data/sample/Room3/readme.txt +76 -0
  95. data/sample/Room3/red.rb +200 -0
  96. data/sample/Room3/room3.rb +26 -0
  97. data/sample/Room3/title.rb +171 -0
  98. data/sample/fixed_map_test/cursor.png +0 -0
  99. data/sample/fixed_map_test/fixed_map_sample.rb +149 -0
  100. data/sample/fixed_map_test/map.csv +19 -0
  101. data/sample/fixed_map_test/map_01.png +0 -0
  102. data/sample/fixed_map_test/map_sample.rb +121 -0
  103. data/sample/fixed_map_test/mapchip.csv +23 -0
  104. data/sample/fixed_map_test/monster.png +0 -0
  105. data/sample/fixed_map_test/readme.txt +72 -0
  106. data/sample/map_test/chara.rb +50 -0
  107. data/sample/map_test/chr1.png +0 -0
  108. data/sample/map_test/cursor.png +0 -0
  109. data/sample/map_test/main_parts.rb +48 -0
  110. data/sample/map_test/main_scene.rb +137 -0
  111. data/sample/map_test/map.png +0 -0
  112. data/sample/map_test/map2.png +0 -0
  113. data/sample/map_test/map_layer.csv +127 -0
  114. data/sample/map_test/map_manager.rb +92 -0
  115. data/sample/map_test/map_test.rb +23 -0
  116. data/sample/map_test/mapchip.csv +21 -0
  117. data/sample/map_test/oasis.rb +65 -0
  118. data/sample/map_test/readme.txt +87 -0
  119. data/sample/map_test/route.rb +144 -0
  120. data/sample/map_test/sea.png +0 -0
  121. data/sample/map_test/town.rb +68 -0
  122. data/sample/map_test/wait_cursor.png +0 -0
  123. data/sample/map_test/window.png +0 -0
  124. data/win/miyako_no_katana.so +0 -0
  125. metadata +194 -0
@@ -0,0 +1,308 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.0
5
+ Copyright (C) 2007-2008 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
+ Choice = Struct.new(:body, :body_selected, :condition, :selected, :result, :left, :right, :up, :down, :base)
41
+
42
+ #==選択肢を管理するクラス
43
+ #選択肢は、Shapeクラスから生成したスプライトもしくは画像で構成される
44
+ class Choices
45
+ include Layout
46
+ include SpriteBase
47
+ include Animation
48
+ include Enumerable
49
+ extend Forwardable
50
+
51
+ # インスタンスを生成する
52
+ # 返却値:: 生成された Choices クラスのインスタンス
53
+ def initialize
54
+ @choices = []
55
+ @now = nil
56
+ @non_select = false
57
+ @last_selected = nil
58
+ end
59
+
60
+ # 選択肢を作成する
61
+ # Choice 構造体のインスタンスを作成する
62
+ #
63
+ # 構造体には、引数bodyと、必ず true を返す条件ブロックが登録されている。残りは nil
64
+ #_body_:: 選択肢を示す画像
65
+ #_body_selected_:: 選択肢を示す画像(選択時)。デフォルトはnil
66
+ #_selected_:: 生成時に選択されているときはtrue、そうでないときはfalseを設定する
67
+ #返却値:: 生成された Choice構造体のインスタンス
68
+ def Choices.create_choice(body, body_selected = nil, selected = false)
69
+ choice = Choice.new(body, body_selected, Proc.new{ true }, selected,
70
+ nil, nil, nil, nil, nil, nil)
71
+ choice.left = choice
72
+ choice.right = choice
73
+ choice.up = choice
74
+ choice.down = choice
75
+ return choice
76
+ end
77
+
78
+ # 選択肢集合(Choice 構造体の配列)を選択肢リストに登録する
79
+ def create_choices(choices)
80
+ choices.each{|v| v.base = choices}
81
+ @choices.push(choices)
82
+ @last_selected = @choices[0][0] if (@choices.length == 1 && @last_selcted == nil)
83
+ return self
84
+ end
85
+
86
+ # 選択肢データを解放する
87
+ def dispose
88
+ @choices.each{|c| c.clear }
89
+ @choices.clear
90
+ @choices = []
91
+ end
92
+
93
+ def each #:nodoc:
94
+ @choices.each{|ch| yield ch }
95
+ end
96
+
97
+ def_delegators(:@choices, :push, :pop, :shift, :unshift, :[], :[]=, :clear, :length)
98
+
99
+ #===選択を開始する
100
+ #選択肢の初期位置を指定することができる
101
+ #_x_:: 初期位置(x 座標)。規定値は 0。nilを渡すと、最後に選択した選択肢が選ばれる。
102
+ #_y_:: 初期位置(y 座標)。規定値は 0
103
+ def start_choice(x = 0, y = 0)
104
+ raise MiyakoError, "Illegal choice position! [#{x}][#{y}]" if (x != nil && x < 0 || x >= @choices.length || y < 0 || y >= @choices[x].length)
105
+ @now = x ? @choices[x][y] : @last_selected
106
+ @now.selected = true
107
+ @last_selected = @now
108
+ @non_select = false
109
+ end
110
+
111
+ #===選択肢本体を取得する
112
+ #選択肢の表示対象となる
113
+ #返却値::
114
+ def body
115
+ return @now.body_selected ? @now.body_selected : @now.body
116
+ end
117
+
118
+ #===選択結果を取得する
119
+ #現在の選択肢が所持している結果インスタンスを返す
120
+ #返却値:: 選択結果
121
+ def result
122
+ return @now.result
123
+ end
124
+
125
+ def update_choices(org, nxt) #:nodoc:
126
+ obase = org.base
127
+ nbase = nxt.base
128
+ unless obase.eql?(nbase)
129
+ obase.each{|b|
130
+ b.body.stop
131
+ b.body_selected.stop if b.body_selected
132
+ }
133
+ nbase.each{|b|
134
+ b.body.start
135
+ b.body_selected.start if b.body_selected
136
+ }
137
+ end
138
+ end
139
+
140
+ private :update_choices
141
+
142
+ #===選択肢を非選択状態に変更する
143
+ #現在の選択状態を、全部選択していない状態にする
144
+ #返却値:: 自分自身を返す
145
+ def non_select
146
+ @now.base.each{|c| c.selected = false }
147
+ @non_select = true
148
+ return self
149
+ end
150
+
151
+ #===選択肢を変更する
152
+ #現在の選択状態を、全部選択していない状態にする
153
+ #_x_:: x方向位置
154
+ #_y_:: y方向位置
155
+ #返却値:: 自分自身を返す
156
+ def select(x, y)
157
+ raise MiyakoError, "Illegal choice position! [#{x}][#{y}]" if (x < 0 || x >= @choices.length || y < 0 || y >= @choices[x].length)
158
+ @now = @choices[x][y]
159
+ return self
160
+ end
161
+
162
+ #===選択肢を非選択状態に変更する
163
+ #現在の選択状態を、全部選択していない状態にする
164
+ #返却値:: 自分自身を返す
165
+ def non_select
166
+ @now.base.each{|c| c.selected = false }
167
+ @non_select = true
168
+ return self
169
+ end
170
+
171
+ #===画面に描画を指示する
172
+ #現在表示できる選択肢を、現在の状態で描画するよう指示する
173
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る。
174
+ #ブロックの引数は、|インスタンスのSpriteUnit, 画面のSpriteUnit|となる。
175
+ #返却値:: 自分自身を返す
176
+ def render(&block)
177
+ @now.base.each{|c|
178
+ ((c.body_selected && c.selected) ?
179
+ c.body_selected.render(&block) :
180
+ c.body.render(&block)) if c.condition.call
181
+ }
182
+ return self
183
+ end
184
+
185
+ #===画像に描画を指示する
186
+ #現在表示できる選択肢を、現在の状態で描画するよう指示する
187
+ #ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る。
188
+ #ブロックの引数は、|インスタンスのSpriteUnit, 画像のSpriteUnit|となる。
189
+ #_dst_:: 描画対象の画像インスタンス
190
+ #返却値:: 自分自身を返す
191
+ def render_to(dst, &block)
192
+ @now.base.each{|c|
193
+ ((c.body_selected && c.selected) ?
194
+ c.body_selected.render_to(dst, &block) :
195
+ c.body.render_to(dst, &block)) if c.condition.call
196
+ }
197
+ return self
198
+ end
199
+
200
+ #===スプライトに変換した画像を表示する
201
+ #すべてのパーツを貼り付けた、1枚のスプライトを返す
202
+ #返却値:: 生成したスプライト
203
+ def to_sprite
204
+ rect = self.broad_rect
205
+ sprite = Sprite.new(:size=>rect.to_a[2,2], :type=>:ac)
206
+ self.render_to(sprite){|sunit, dunit| sunit.x -= rect.x; sunit.y -= rect.y }
207
+ return sprite
208
+ end
209
+
210
+ #===現在の画面の最大の大きさを矩形で取得する
211
+ #選択肢の状態により、取得できる矩形の大きさが変わる
212
+ #但し、選択肢が一つも見つからなかったときはnilを返す
213
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
214
+ def broad_rect
215
+ choice_list = @now.base.find_all{|c| c.condition.call }.map{|c| (c.body_selected && c.selected) ? c.body_selected : c.body}
216
+ return nil if choice_list.length == 0
217
+ return Rect.new(*(choice_list[0].rect.to_a)) if choice_list.length == 1
218
+ rect = choice_list.shift.to_a
219
+ rect_list = rect.zip(*(choice_list.map{|c| c.broad_rect.to_a}))
220
+ # width -> right
221
+ rect_list[2] = rect_list[2].zip(rect_list[0]).map{|xw| xw[0] + xw[1]}
222
+ # height -> bottom
223
+ rect_list[3] = rect_list[3].zip(rect_list[1]).map{|xw| xw[0] + xw[1]}
224
+ x, y = rect_list[0].min, rect_list[1].min
225
+ return Rect.new(x, y, rect_list[2].max - x, rect_list[3].max - y)
226
+ end
227
+
228
+ # 選択肢を左移動させる
229
+ # 返却値:: 自分自身を返す
230
+ def left
231
+ @last_selected = @now
232
+ @now.selected = false
233
+ obj = @now.left
234
+ update_choices(@now, obj)
235
+ @now = obj
236
+ @now.selected = true
237
+ return self
238
+ end
239
+
240
+ # 選択肢を右移動させる
241
+ # 返却値:: 自分自身を返す
242
+ def right
243
+ @last_selected = @now
244
+ @now.selected = false
245
+ obj = @now.right
246
+ update_choices(@now, obj)
247
+ @now = obj
248
+ @now.selected = true
249
+ return self
250
+ end
251
+
252
+ # 選択肢を上移動させる
253
+ # 返却値:: 自分自身を返す
254
+ def up
255
+ @last_selected = @now
256
+ @now.selected = false
257
+ obj = @now.up
258
+ update_choices(@now, obj)
259
+ @now = obj
260
+ @now.selected = true
261
+ return self
262
+ end
263
+
264
+ # 選択肢を下移動させる
265
+ # 返却値:: 自分自身を返す
266
+ def down
267
+ @last_selected = @now
268
+ @now.selected = false
269
+ obj = @now.down
270
+ update_choices(@now, obj)
271
+ @now = obj
272
+ @now.selected = true
273
+ return self
274
+ end
275
+
276
+ # 選択肢のアニメーションを開始する
277
+ # 返却値:: 自分自身を返す
278
+ def start
279
+ @now.base.each{|c| c.body.start if c.condition.call }
280
+ return self
281
+ end
282
+
283
+ # 選択肢のアニメーションを終了させる
284
+ # 返却値:: 自分自身を返す
285
+ def stop
286
+ @now.base.each{|c| c.body.stop if c.condition.call }
287
+ return self
288
+ end
289
+
290
+ # 選択肢のアニメーションの再生位置を最初に戻す
291
+ # 返却値:: 自分自身を返す
292
+ def reset
293
+ @now.base.each{|c| c.body.reset if c.condition.call }
294
+ return self
295
+ end
296
+
297
+ # 選択肢のアニメーションを更新させる
298
+ # (手動で更新する必要があるときに呼び出す)
299
+ # 返却値:: 自分自身を返す
300
+ def update_animation
301
+ @now.base.each{|c|
302
+ ((c.body_selected && c.selected) ?
303
+ c.body_selected.update_animation :
304
+ c.body.update_animation) if c.condition.call
305
+ }
306
+ end
307
+ end
308
+ end