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.
- data/README +275 -20
- data/extern.h +21 -1
- data/install_miyako.rb +5 -3
- data/lib/Miyako/API/audio.rb +11 -6
- data/lib/Miyako/API/basic_data.rb +0 -985
- data/lib/Miyako/API/bitmap.rb +19 -22
- data/lib/Miyako/API/choices.rb +203 -69
- data/lib/Miyako/API/collision.rb +451 -9
- data/lib/Miyako/API/color.rb +177 -0
- data/lib/Miyako/API/diagram.rb +18 -20
- data/lib/Miyako/API/fixedmap.rb +207 -73
- data/lib/Miyako/API/font.rb +111 -18
- data/lib/Miyako/API/i_yuki.rb +1201 -0
- data/lib/Miyako/API/input.rb +65 -0
- data/lib/Miyako/API/layout.rb +41 -29
- data/lib/Miyako/API/map.rb +202 -157
- data/lib/Miyako/API/map_event.rb +86 -19
- data/lib/Miyako/API/map_struct.rb +268 -0
- data/lib/Miyako/API/modules.rb +136 -37
- data/lib/Miyako/API/movie.rb +8 -8
- data/lib/Miyako/API/parts.rb +63 -20
- data/lib/Miyako/API/plane.rb +4 -4
- data/lib/Miyako/API/screen.rb +16 -8
- data/lib/Miyako/API/sprite.rb +290 -23
- data/lib/Miyako/API/sprite_animation.rb +23 -11
- data/lib/Miyako/API/sprite_list.rb +406 -183
- data/lib/Miyako/API/story.rb +4 -65
- data/lib/Miyako/API/struct_point.rb +157 -0
- data/lib/Miyako/API/struct_rect.rb +233 -0
- data/lib/Miyako/API/struct_segment.rb +641 -0
- data/lib/Miyako/API/struct_size.rb +158 -0
- data/lib/Miyako/API/struct_square.rb +253 -0
- data/lib/Miyako/API/textbox.rb +49 -35
- data/lib/Miyako/API/viewport.rb +5 -5
- data/lib/Miyako/API/wait_counter.rb +350 -0
- data/lib/Miyako/API/yuki.rb +95 -60
- data/lib/Miyako/EXT/raster_scroll.rb +30 -8
- data/lib/Miyako/EXT/slides.rb +6 -6
- data/lib/Miyako/miyako.rb +25 -11
- data/lib/miyako.rb +28 -0
- data/lib/miyako_require_only.rb +35 -0
- data/miyako_basicdata.c +201 -17
- data/miyako_collision.c +315 -6
- data/miyako_diagram.c +331 -0
- data/miyako_drawing.c +26 -7
- data/miyako_font.c +259 -129
- data/miyako_input_audio.c +24 -14
- data/miyako_layout.c +106 -8
- data/miyako_no_katana.c +398 -171
- data/miyako_sprite2.c +275 -38
- data/miyako_transform.c +113 -107
- data/miyako_utility.c +34 -48
- data/miyako_yuki.c +241 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
- data/sample/Room3/blue.rb +19 -19
- data/sample/Room3/green.rb +9 -9
- data/sample/Room3/main.rb +12 -12
- data/sample/Room3/red.rb +12 -12
- data/sample/Room3/title.rb +15 -10
- data/sample/collision_test2.rb +2 -1
- data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
- data/sample/map_test/main_scene.rb +12 -10
- data/sample/map_test/map_manager.rb +14 -13
- data/sample/rasterscroll.rb +5 -5
- data/sample/takahashi.rb +3 -3
- data/sample/textbox_sample.rb +7 -6
- data/sample/transform.rb +2 -1
- data/uninstall_miyako.rb +4 -1
- data/win/miyako_no_katana.so +0 -0
- metadata +15 -4
- data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
- 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
|
+
|