ruby-miyako 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/README +275 -20
  2. data/extern.h +21 -1
  3. data/install_miyako.rb +5 -3
  4. data/lib/Miyako/API/audio.rb +11 -6
  5. data/lib/Miyako/API/basic_data.rb +0 -985
  6. data/lib/Miyako/API/bitmap.rb +19 -22
  7. data/lib/Miyako/API/choices.rb +203 -69
  8. data/lib/Miyako/API/collision.rb +451 -9
  9. data/lib/Miyako/API/color.rb +177 -0
  10. data/lib/Miyako/API/diagram.rb +18 -20
  11. data/lib/Miyako/API/fixedmap.rb +207 -73
  12. data/lib/Miyako/API/font.rb +111 -18
  13. data/lib/Miyako/API/i_yuki.rb +1201 -0
  14. data/lib/Miyako/API/input.rb +65 -0
  15. data/lib/Miyako/API/layout.rb +41 -29
  16. data/lib/Miyako/API/map.rb +202 -157
  17. data/lib/Miyako/API/map_event.rb +86 -19
  18. data/lib/Miyako/API/map_struct.rb +268 -0
  19. data/lib/Miyako/API/modules.rb +136 -37
  20. data/lib/Miyako/API/movie.rb +8 -8
  21. data/lib/Miyako/API/parts.rb +63 -20
  22. data/lib/Miyako/API/plane.rb +4 -4
  23. data/lib/Miyako/API/screen.rb +16 -8
  24. data/lib/Miyako/API/sprite.rb +290 -23
  25. data/lib/Miyako/API/sprite_animation.rb +23 -11
  26. data/lib/Miyako/API/sprite_list.rb +406 -183
  27. data/lib/Miyako/API/story.rb +4 -65
  28. data/lib/Miyako/API/struct_point.rb +157 -0
  29. data/lib/Miyako/API/struct_rect.rb +233 -0
  30. data/lib/Miyako/API/struct_segment.rb +641 -0
  31. data/lib/Miyako/API/struct_size.rb +158 -0
  32. data/lib/Miyako/API/struct_square.rb +253 -0
  33. data/lib/Miyako/API/textbox.rb +49 -35
  34. data/lib/Miyako/API/viewport.rb +5 -5
  35. data/lib/Miyako/API/wait_counter.rb +350 -0
  36. data/lib/Miyako/API/yuki.rb +95 -60
  37. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  38. data/lib/Miyako/EXT/slides.rb +6 -6
  39. data/lib/Miyako/miyako.rb +25 -11
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/miyako_basicdata.c +201 -17
  43. data/miyako_collision.c +315 -6
  44. data/miyako_diagram.c +331 -0
  45. data/miyako_drawing.c +26 -7
  46. data/miyako_font.c +259 -129
  47. data/miyako_input_audio.c +24 -14
  48. data/miyako_layout.c +106 -8
  49. data/miyako_no_katana.c +398 -171
  50. data/miyako_sprite2.c +275 -38
  51. data/miyako_transform.c +113 -107
  52. data/miyako_utility.c +34 -48
  53. data/miyako_yuki.c +241 -0
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  55. data/sample/Room3/blue.rb +19 -19
  56. data/sample/Room3/green.rb +9 -9
  57. data/sample/Room3/main.rb +12 -12
  58. data/sample/Room3/red.rb +12 -12
  59. data/sample/Room3/title.rb +15 -10
  60. data/sample/collision_test2.rb +2 -1
  61. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  62. data/sample/map_test/main_scene.rb +12 -10
  63. data/sample/map_test/map_manager.rb +14 -13
  64. data/sample/rasterscroll.rb +5 -5
  65. data/sample/takahashi.rb +3 -3
  66. data/sample/textbox_sample.rb +7 -6
  67. data/sample/transform.rb +2 -1
  68. data/uninstall_miyako.rb +4 -1
  69. data/win/miyako_no_katana.so +0 -0
  70. metadata +15 -4
  71. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  72. data/sample/cairo_sample.rb +0 -25
@@ -0,0 +1,350 @@
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
+ class WaitCounter
26
+ SECOND2TICK = 1000
27
+
28
+ @@callbacks = {}
29
+ @@post_callbacks = {}
30
+ @@initialized = false
31
+
32
+ #WaitCounterインスタンス固有の名前
33
+ #デフォルトはインスタンスIDを文字列化したもの
34
+ attr_accessor :name
35
+
36
+ #===起算時からのミリ秒数を取得する
37
+ #起算時からのミリ秒数を整数で取得する
38
+ #返却値:: 起算時からのミリ秒数(整数)
39
+ def WaitCounter.tick
40
+ return SDL.getTicks
41
+ end
42
+
43
+ #===起算時からのミリ秒数を取得する
44
+ #起算時からのミリ秒数を整数で取得する
45
+ #返却値:: 起算時からのミリ秒数(整数)
46
+ def WaitCounter.ticks
47
+ return SDL.getTicks
48
+ end
49
+
50
+ def WaitCounter.get_second_to_tick(s) #:nodoc:
51
+ return (SECOND2TICK * s).to_i
52
+ end
53
+
54
+ #===コールバックハッシュを参照する
55
+ #コールバック処理を登録しているハッシュを参照する
56
+ #キー(WaitCounterインスタンス)に対応する中身は配列になっており、
57
+ #[block(callするブロック), loops(呼び出し回数(設定値)), count(呼び出し回数(現在値))]
58
+ #で構成される
59
+ def WaitCounter.callbacks
60
+ @@callbacks
61
+ end
62
+
63
+ #===コールバックハッシュを参照する
64
+ #コールバック処理を登録しているハッシュを参照する
65
+ #キー(WaitCounterインスタンス)に対応する中身は配列になっており、
66
+ #[block(callするブロック), loops(呼び出し回数(設定値)), count(呼び出し回数(現在値))]
67
+ #で構成される
68
+ def WaitCounter.post_callbacks
69
+ @@post_callbacks
70
+ end
71
+
72
+ def WaitCounter.callback_inner(hash) #:nodoc:
73
+ hash.each{|wait, array|
74
+ next unless wait.executing?
75
+ if wait.finished?
76
+ callback[0].call(wait, array[1], array[2])
77
+ if array[1] > 0 && array[1] == array[2]
78
+ wait.stop
79
+ else
80
+ array[2] = array[2] + 1 if array[1] > 0
81
+ wait.start
82
+ end
83
+ end
84
+ }
85
+ end
86
+
87
+ #===コールバック処理を更新する
88
+ #Miyako.main_loop内では、Screen.clearが呼ばれる直前(画面消去直前)に呼ばれる
89
+ #WaitCounterの処理を確認して、タイマーが制限時間オーバーしたら登録しているブロックを評価する
90
+ def WaitCounter.update
91
+ WaitCounter.callback_inner(@@callbacks)
92
+ end
93
+
94
+ #===コールバック処理を更新する
95
+ #Miyako.main_loop内では、Screen.renderが呼ばれる直前(画面更新直前)に呼ばれる
96
+ #WaitCounterの処理を確認して、タイマーが制限時間オーバーしたら登録しているブロックを評価する
97
+ def WaitCounter.post_update
98
+ WaitCounter.callback_inner(@@post_callbacks)
99
+ end
100
+
101
+ #===インスタンスを生成する
102
+ #_seconds_:: タイマーとして設定する秒数(実数で指定可能)
103
+ #_name_:: インスタンス固有の名称。デフォルトはnil
104
+ #(nilを渡した場合、インスタンスIDを文字列化したものが名称になる)
105
+ #返却値:: 生成されたインスタンス
106
+ def initialize(seconds, name=nil)
107
+ @seconds = seconds
108
+ @name = name ? name : __id__.to_s
109
+ @wait = WaitCounter.get_second_to_tick(@seconds)
110
+ @st = 0
111
+ @counting = false
112
+ end
113
+
114
+ #===自分自身をコールバック処理に追加する
115
+ #Miyako.main_loop内では、Screen.clearが呼ばれる直前(画面消去直前)にブロックが評価される
116
+ #コールバックは、レシーバが明示的に起動している間だけ呼ばれる
117
+ #(ただし、繰り返し呼ばれているときは、自動的にタイマーを再起動する
118
+ # また、呼び出し回数が既定値に達したときは自動的にタイマーを終了する)
119
+ #呼び出し時にブロックを渡さないと例外が発生する
120
+ #また、既にappend_post_callbackメソッドで別のコールバックに登録されているときも例外が発生する
121
+ #引数として、呼び出し回数を渡す
122
+ #無限に呼び出すときは0以下の値を渡す。省略時は0を渡す
123
+ #渡される引数は、(レシーバ,呼び出し回数(設定値),呼び出し回数(現在数))で構成される
124
+ #_calls_:: レシーバの呼び出し回数。無限に呼び出すときは0以下の値を渡す。省略時は0を渡す
125
+ #返却値:: レシーバ
126
+ def append_callback(calls = 0, &block)
127
+ raise MiyakoError, "This method needs some block!" unless block_given?
128
+ raise MiyakoError, "This instance registerd to post_callback!" if @@post_callbacks.has_key?(self)
129
+ @@callbacks[self] = [block, calls, 1]
130
+ self
131
+ end
132
+
133
+ #===自分自身をコールバック処理に追加する
134
+ #Miyako.main_loop内では、Screen.renderが呼ばれる直前(画面更新直前)にブロックが評価される
135
+ #コールバックは、レシーバが明示的に起動している間だけ呼ばれる
136
+ #(ただし、繰り返し呼ばれているときは、自動的にタイマーを再起動する
137
+ # また、呼び出し回数が既定値に達したときは自動的にタイマーを終了する)
138
+ #呼び出し時にブロックを渡さないと例外が発生する
139
+ #また、既にappend_callbackメソッドで別のコールバックに登録されているときも例外が発生する
140
+ #引数として、呼び出し回数を渡す
141
+ #無限に呼び出すときは0以下の値を渡す。省略時は0を渡す
142
+ #渡される引数は、(レシーバ,呼び出し回数(設定値),呼び出し回数(現在数))で構成される
143
+ #_calls_:: レシーバの呼び出し回数。無限に呼び出すときは0以下の値を渡す。省略時は0を渡す
144
+ #返却値:: レシーバ
145
+ def append_post_callback(calls = 0, &block)
146
+ raise MiyakoError, "This method needs some block!" unless block_given?
147
+ raise MiyakoError, "This instance registerd to callback!" if @@callbacks.has_key?(self)
148
+ @@post_callbacks[self] = [block, calls, 1]
149
+ self
150
+ end
151
+
152
+ #===自分自身をコールバック処理から解除する
153
+ #コールバックに登録されていないレシーバを指定したときは例外が発生する
154
+ #返却値:: レシーバ
155
+ def remove_callback
156
+ @@callbacks.delete(self) || raise(MiyakoError, "This instance unregisterd to callback!")
157
+ self
158
+ end
159
+
160
+ #===自分自身をコールバック処理から解除する
161
+ #コールバックに登録されていないレシーバを指定したときは例外が発生する
162
+ #返却値:: レシーバ
163
+ def remove_post_callback
164
+ @@post_callbacks.delete(self) || raise(MiyakoError, "This instance unregisterd to post-callback!")
165
+ self
166
+ end
167
+
168
+ #===コールバックを指定したときの呼び出し数を求める
169
+ #コールバックに登録されていないレシーバを指定したときはnilを返す
170
+ #返却値:: 整数もしくはnil
171
+ def callback_calls
172
+ array = @@callbacks[self] || @@post_callbacks[self]
173
+ return nil unless array
174
+ array[1]
175
+ end
176
+
177
+ #===コールバックを指定したときの現在の呼び出し数を求める
178
+ #コールバックに登録されていないレシーバを指定したときはnilを返す
179
+ #呼び出し回数が無限の時は-1を返す
180
+ #返却値:: -1以上の整数もしくはnil
181
+ def callback_count
182
+ array = @@callbacks[self] || @@post_callbacks[self]
183
+ return nil unless array
184
+ return -1 if array[1] <= 0
185
+ return array[2] if @counting==false && array[1] == array[2]
186
+ array[2] - 1
187
+ end
188
+
189
+ #===コールバックブロック内部でコールバックを終了させる
190
+ #コールバック内部で、何らかの理由で次からのコールバックを行わせないときに呼び出す
191
+ #コールバック回数が規定の回数に達したのと同じ効果を与えている
192
+ #現在実行しているブロックには、このメソッドによる影響を受けない
193
+ #返却値:: レシーバ
194
+ def stop_callback_inner
195
+ array = @@callbacks[self] || @@post_callbacks[self] || raise(MiyakoError, "This instance unregisterd to post-callback!")
196
+ array[2] = array[1]
197
+ return self
198
+ end
199
+
200
+ #===設定されているウェイトの長さを求める
201
+ #ウェイトの長さをミリ秒単位で取得する
202
+ #返却値:: ウェイトの長さ
203
+ def length
204
+ return @wait
205
+ end
206
+
207
+ alias :size :length
208
+
209
+ #===開始からの経過時間を求める
210
+ #タイマー実行中のとき現在の経過時間をミリ秒単位(0以上の整数)で取得する
211
+ #制限時間を超えていれば、制限時間+1を返す
212
+ #まだスタートしてないときは-1を返す
213
+ #返却値:: 現在の経過長
214
+ def now
215
+ if @stop_tick
216
+ cnt = @stop_tick - @st
217
+ return @wait < cnt ? @wait+1 : cnt
218
+ end
219
+ return -1 unless @counting
220
+ cnt = SDL.getTicks - @st
221
+ return @wait < cnt ? @wait+1 : cnt
222
+ end
223
+
224
+ #===開始からの残り時間を求める
225
+ #タイマー実行中のとき、残り時間の長さをミリ秒単位(0以上の整数)で取得する
226
+ #制限時間を超えていれば-1を返す
227
+ #まだスタートしてないときは制限時間+1を返す
228
+ #返却値:: 残り時間の長さ
229
+ def remain
230
+ if @stop_tick
231
+ cnt = @stop_tick - @st
232
+ return @wait < cnt ? -1 : @wait - cnt
233
+ end
234
+ return @wait+1 unless @counting
235
+ cnt = SDL.getTicks - @st
236
+ return @wait < cnt ? -1 : @wait - cnt
237
+ end
238
+
239
+ alias :remind :remain
240
+
241
+ #===タイマー処理を開始状態にする
242
+ #返却値:: 自分自身を返す
243
+ def start
244
+ @st = SDL.getTicks
245
+ @stop_tick = nil
246
+ @counting = true
247
+ return self
248
+ end
249
+
250
+ #===タイマー処理を停止状態にする
251
+ #この状態で、startメソッドを呼ぶと、開始前の状態に戻って処理を開始する
252
+ #resumeメソッドを呼ぶと、停止直前の状態に戻って処理を開始する
253
+ #返却値:: 自分自身を返す
254
+ def stop
255
+ @stop_tick = SDL.getTicks
256
+ @counting = false
257
+ return self
258
+ end
259
+
260
+ #===タイマーを開始前の状態に戻す
261
+ #remain,nowの結果がstart前の状態に戻る
262
+ #ただし、停止中の時にしか戻せない
263
+ #返却値:: 自分自身を返す
264
+ def reset
265
+ return self if @counting
266
+ @st = 0
267
+ @stop_tick = nil
268
+ return self
269
+ end
270
+
271
+ #===タイマー処理を再会する
272
+ #停止前の状態から再びタイマー処理を開始する
273
+ #返却値:: 自分自身を返す
274
+ def resume
275
+ return self unless @stop_tick
276
+ @st += (SDL.getTicks - @stop_tick)
277
+ @stop_tick = nil
278
+ @counting = true
279
+ return self
280
+ end
281
+
282
+ #===タイマー処理中かを返す
283
+ #タイマー処理中ならばtrue、停止中ならばfalseを返す
284
+ #返却値:: タイマー処理中かどうかを示すフラグ
285
+ def execute?
286
+ @counting
287
+ end
288
+
289
+ alias :executing? :execute?
290
+
291
+ def wait_inner(f) #:nodoc:
292
+ now_time = @stop_tick ? @stop_tick : SDL.getTicks
293
+ (now_time - @st) >= @wait ? !f : f
294
+ end
295
+
296
+ private :wait_inner
297
+
298
+ #===タイマー処理中かを返す
299
+ #タイマー処理中ならばtrue、停止中ならばfalseを返す
300
+ #返却値:: タイマー処理中かどうかを示すフラグ
301
+ def waiting?
302
+ return wait_inner(true)
303
+ end
304
+
305
+ #===タイマーが制限時間に達したかを返す
306
+ #タイマーが制限時間に達した(もしくはオーバーした)らtrue、制限時間内ならfalseを返す
307
+ #タイマーが
308
+ #返却値:: タイマー処理が終わったかどうかを示すフラグ
309
+ def finish?
310
+ return wait_inner(false)
311
+ end
312
+
313
+ alias :finished? :finish?
314
+
315
+ def wait #:nodoc:
316
+ st = SDL.getTicks
317
+ t = SDL.getTicks
318
+ until (t - st) >= @wait do
319
+ t = SDL.getTicks
320
+ end
321
+ return self
322
+ end
323
+
324
+ #===残り時間に応じたブロックを呼び出す
325
+ #タイマー処理の状態に応じてブロックを評価して、その結果を渡す
326
+ #タイマー開始前はpre、タイマー実行中はwaiting、制限時間オーバー後はpostに渡したブロックを評価する
327
+ #callを呼び出すときに、ブロックに渡すparamsの数とブロックで定義したparamsの数との整合に注意する(例外が発生する)
328
+ #_waiting_:: タイマー実行中に行うブロック。省略時は空のブロックを渡す
329
+ #_pre_:: タイマー開始前に行うブロック。省略時は空のブロックを渡す
330
+ #_post_:: タイマー制限時間オーバ後に実行中に行うブロック。省略時は空のブロックを渡す
331
+ #_params_:: ブロックに渡す引数。可変引数
332
+ #返却値:: 各ブロックを評価した結果
333
+ def call(waiting=lambda{|*params|}, pre=lambda{|*params|}, post=lambda{|*params|}, *params)
334
+ case self.now
335
+ when -1
336
+ return pre.call(*params)
337
+ when @wait+1
338
+ return post.call(*params)
339
+ else
340
+ return waiting.call(*params)
341
+ end
342
+ end
343
+
344
+ #===インスタンスないで所持している領域を開放する
345
+ #(現段階ではダミー)
346
+ def dispose
347
+ end
348
+ end
349
+ end
350
+