Class: Miyako::WaitCounter
Overview
タイマーを管理するクラス
Constant Summary collapse
- SECOND2TICK =
1000
- @@callbacks =
{}
- @@post_callbacks =
{}
- @@initialized =
false
Instance Attribute Summary collapse
-
#name ⇒ Object
WaitCounterインスタンス固有の名前 デフォルトはインスタンスIDを文字列化したもの.
Class Method Summary collapse
-
.callback_inner(hash) ⇒ Object
:nodoc:.
-
.callbacks ⇒ Object
コールバックハッシュを参照する コールバック処理を登録しているハッシュを参照する キー(WaitCounterインスタンス)に対応する中身は配列になっており、 [block(callするブロック), loops(呼び出し回数(設定値)), count(呼び出し回数(現在値))] で構成される.
-
.get_second_to_tick(s) ⇒ Object
:nodoc:.
-
.post_callbacks ⇒ Object
コールバックハッシュを参照する コールバック処理を登録しているハッシュを参照する キー(WaitCounterインスタンス)に対応する中身は配列になっており、 [block(callするブロック), loops(呼び出し回数(設定値)), count(呼び出し回数(現在値))] で構成される.
-
.post_update ⇒ Object
コールバック処理を更新する Miyako.main_loop内では、Screen.renderが呼ばれる直前(画面更新直前)に呼ばれる WaitCounterの処理を確認して、タイマーが制限時間オーバーしたら登録しているブロックを評価する.
-
.tick ⇒ Object
起算時からのミリ秒数を取得する 起算時からのミリ秒数を整数で取得する 返却値:: 起算時からのミリ秒数(整数).
-
.ticks ⇒ Object
起算時からのミリ秒数を取得する 起算時からのミリ秒数を整数で取得する 返却値:: 起算時からのミリ秒数(整数).
-
.update ⇒ Object
コールバック処理を更新する Miyako.main_loop内では、Screen.clearが呼ばれる直前(画面消去直前)に呼ばれる WaitCounterの処理を確認して、タイマーが制限時間オーバーしたら登録しているブロックを評価する.
Instance Method Summary collapse
-
#append_callback(calls = 0, &block) ⇒ Object
自分自身をコールバック処理に追加する Miyako.main_loop内では、Screen.clearが呼ばれる直前(画面消去直前)にブロックが評価される コールバックは、レシーバが明示的に起動している間だけ呼ばれる (ただし、繰り返し呼ばれているときは、自動的にタイマーを再起動する また、呼び出し回数が既定値に達したときは自動的にタイマーを終了する) 呼び出し時にブロックを渡さないと例外が発生する また、既にappend_post_callbackメソッドで別のコールバックに登録されているときも例外が発生する 引数として、呼び出し回数を渡す 無限に呼び出すときは0以下の値を渡す。省略時は0を渡す 渡される引数は、(レシーバ,呼び出し回数(設定値),呼び出し回数(現在数))で構成される calls:: レシーバの呼び出し回数。無限に呼び出すときは0以下の値を渡す。省略時は0を渡す 返却値:: レシーバ.
-
#append_post_callback(calls = 0, &block) ⇒ Object
自分自身をコールバック処理に追加する Miyako.main_loop内では、Screen.renderが呼ばれる直前(画面更新直前)にブロックが評価される コールバックは、レシーバが明示的に起動している間だけ呼ばれる (ただし、繰り返し呼ばれているときは、自動的にタイマーを再起動する また、呼び出し回数が既定値に達したときは自動的にタイマーを終了する) 呼び出し時にブロックを渡さないと例外が発生する また、既にappend_callbackメソッドで別のコールバックに登録されているときも例外が発生する 引数として、呼び出し回数を渡す 無限に呼び出すときは0以下の値を渡す。省略時は0を渡す 渡される引数は、(レシーバ,呼び出し回数(設定値),呼び出し回数(現在数))で構成される calls:: レシーバの呼び出し回数。無限に呼び出すときは0以下の値を渡す。省略時は0を渡す 返却値:: レシーバ.
-
#call(waiting = lambda{|*params|}, pre = lambda{|*params|}, post = lambda{|*params|}, *params) ⇒ Object
残り時間に応じたブロックを呼び出す タイマー処理の状態に応じてブロックを評価して、その結果を渡す タイマー開始前はpre、タイマー実行中はwaiting、制限時間オーバー後はpostに渡したブロックを評価する callを呼び出すときに、ブロックに渡すparamsの数とブロックで定義したparamsの数との整合に注意する(例外が発生する) waiting:: タイマー実行中に行うブロック。省略時は空のブロックを渡す pre:: タイマー開始前に行うブロック。省略時は空のブロックを渡す post:: タイマー制限時間オーバ後に実行中に行うブロック。省略時は空のブロックを渡す params:: ブロックに渡す引数。可変引数 返却値:: 各ブロックを評価した結果.
-
#callback_calls ⇒ Object
コールバックを指定したときの呼び出し数を求める コールバックに登録されていないレシーバを指定したときはnilを返す 返却値:: 整数もしくはnil.
-
#callback_count ⇒ Object
コールバックを指定したときの現在の呼び出し数を求める コールバックに登録されていないレシーバを指定したときはnilを返す 呼び出し回数が無限の時は-1を返す 返却値:: -1以上の整数もしくはnil.
-
#dispose ⇒ Object
インスタンスないで所持している領域を開放する (現段階ではダミー).
-
#execute? ⇒ Boolean
(also: #executing?)
タイマー処理中かを返す タイマー処理中ならばtrue、停止中ならばfalseを返す 返却値:: タイマー処理中かどうかを示すフラグ.
-
#finish? ⇒ Boolean
(also: #finished?)
タイマーが制限時間に達したかを返す タイマーが制限時間に達した(もしくはオーバーした)らtrue、制限時間内ならfalseを返す タイマーが 返却値:: タイマー処理が終わったかどうかを示すフラグ.
-
#initialize(seconds, name = nil) ⇒ WaitCounter
constructor
インスタンスを生成する seconds:: タイマーとして設定する秒数(実数で指定可能) name:: インスタンス固有の名称。デフォルトはnil (nilを渡した場合、インスタンスIDを文字列化したものが名称になる) 返却値:: 生成されたインスタンス.
-
#length ⇒ Object
(also: #size)
設定されているウェイトの長さを求める ウェイトの長さをミリ秒単位で取得する 返却値:: ウェイトの長さ.
-
#now ⇒ Object
開始からの経過時間を求める タイマー実行中のとき現在の経過時間をミリ秒単位(0以上の整数)で取得する 制限時間を超えていれば、制限時間+1を返す まだスタートしてないときは-1を返す 返却値:: 現在の経過長.
-
#remain ⇒ Object
(also: #remind)
開始からの残り時間を求める タイマー実行中のとき、残り時間の長さをミリ秒単位(0以上の整数)で取得する 制限時間を超えていれば-1を返す まだスタートしてないときは制限時間+1を返す 返却値:: 残り時間の長さ.
-
#remove_callback ⇒ Object
自分自身をコールバック処理から解除する コールバックに登録されていないレシーバを指定したときは例外が発生する 返却値:: レシーバ.
-
#remove_post_callback ⇒ Object
自分自身をコールバック処理から解除する コールバックに登録されていないレシーバを指定したときは例外が発生する 返却値:: レシーバ.
-
#reset ⇒ Object
タイマーを開始前の状態に戻す remain,nowの結果がstart前の状態に戻る ただし、停止中の時にしか戻せない 返却値:: 自分自身を返す.
-
#resume ⇒ Object
タイマー処理を再会する 停止前の状態から再びタイマー処理を開始する 返却値:: 自分自身を返す.
-
#start ⇒ Object
タイマー処理を開始状態にする 返却値:: 自分自身を返す.
-
#stop ⇒ Object
タイマー処理を停止状態にする この状態で、startメソッドを呼ぶと、開始前の状態に戻って処理を開始する resumeメソッドを呼ぶと、停止直前の状態に戻って処理を開始する 返却値:: 自分自身を返す.
-
#stop_callback_inner ⇒ Object
コールバックブロック内部でコールバックを終了させる コールバック内部で、何らかの理由で次からのコールバックを行わせないときに呼び出す コールバック回数が規定の回数に達したのと同じ効果を与えている 現在実行しているブロックには、このメソッドによる影響を受けない 返却値:: レシーバ.
-
#wait ⇒ Object
:nodoc:.
-
#waiting? ⇒ Boolean
タイマー処理中かを返す タイマー処理中ならばtrue、停止中ならばfalseを返す 返却値:: タイマー処理中かどうかを示すフラグ.
Constructor Details
#initialize(seconds, name = nil) ⇒ WaitCounter
インスタンスを生成する
- seconds
-
タイマーとして設定する秒数(実数で指定可能)
- name
-
インスタンス固有の名称。デフォルトはnil
(nilを渡した場合、インスタンスIDを文字列化したものが名称になる)
- 返却値
-
生成されたインスタンス
106 107 108 109 110 111 112 |
# File 'lib/Miyako/API/wait_counter.rb', line 106 def initialize(seconds, name=nil) @seconds = seconds @name = name ? name : __id__.to_s @wait = WaitCounter.get_second_to_tick(@seconds) @st = 0 @counting = false end |
Instance Attribute Details
#name ⇒ Object
WaitCounterインスタンス固有の名前 デフォルトはインスタンスIDを文字列化したもの
34 35 36 |
# File 'lib/Miyako/API/wait_counter.rb', line 34 def name @name end |
Class Method Details
.callback_inner(hash) ⇒ Object
:nodoc:
72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/Miyako/API/wait_counter.rb', line 72 def WaitCounter.callback_inner(hash) #:nodoc: hash.each{|wait, array| next unless wait.executing? if wait.finished? callback[0].call(wait, array[1], array[2]) if array[1] > 0 && array[1] == array[2] wait.stop else array[2] = array[2] + 1 if array[1] > 0 wait.start end end } end |
.callbacks ⇒ Object
コールバックハッシュを参照する
コールバック処理を登録しているハッシュを参照する キー(WaitCounterインスタンス)に対応する中身は配列になっており、
- block(callするブロック), loops(呼び出し回数(設定値)), count(呼び出し回数(現在値))
-
で構成される
59 60 61 |
# File 'lib/Miyako/API/wait_counter.rb', line 59 def WaitCounter.callbacks @@callbacks end |
.get_second_to_tick(s) ⇒ Object
:nodoc:
50 51 52 |
# File 'lib/Miyako/API/wait_counter.rb', line 50 def WaitCounter.get_second_to_tick(s) #:nodoc: return (SECOND2TICK * s).to_i end |
.post_callbacks ⇒ Object
コールバックハッシュを参照する
コールバック処理を登録しているハッシュを参照する キー(WaitCounterインスタンス)に対応する中身は配列になっており、
- block(callするブロック), loops(呼び出し回数(設定値)), count(呼び出し回数(現在値))
-
で構成される
68 69 70 |
# File 'lib/Miyako/API/wait_counter.rb', line 68 def WaitCounter.post_callbacks @@post_callbacks end |
.post_update ⇒ Object
コールバック処理を更新する
Miyako.main_loop内では、Screen.renderが呼ばれる直前(画面更新直前)に呼ばれる WaitCounterの処理を確認して、タイマーが制限時間オーバーしたら登録しているブロックを評価する
97 98 99 |
# File 'lib/Miyako/API/wait_counter.rb', line 97 def WaitCounter.post_update WaitCounter.callback_inner(@@post_callbacks) end |
.tick ⇒ Object
起算時からのミリ秒数を取得する
起算時からのミリ秒数を整数で取得する
- 返却値
-
起算時からのミリ秒数(整数)
39 40 41 |
# File 'lib/Miyako/API/wait_counter.rb', line 39 def WaitCounter.tick return SDL.getTicks end |
.ticks ⇒ Object
起算時からのミリ秒数を取得する
起算時からのミリ秒数を整数で取得する
- 返却値
-
起算時からのミリ秒数(整数)
46 47 48 |
# File 'lib/Miyako/API/wait_counter.rb', line 46 def WaitCounter.ticks return SDL.getTicks end |
.update ⇒ Object
コールバック処理を更新する
Miyako.main_loop内では、Screen.clearが呼ばれる直前(画面消去直前)に呼ばれる WaitCounterの処理を確認して、タイマーが制限時間オーバーしたら登録しているブロックを評価する
90 91 92 |
# File 'lib/Miyako/API/wait_counter.rb', line 90 def WaitCounter.update WaitCounter.callback_inner(@@callbacks) end |
Instance Method Details
#append_callback(calls = 0, &block) ⇒ Object
自分自身をコールバック処理に追加する
Miyako.main_loop内では、Screen.clearが呼ばれる直前(画面消去直前)にブロックが評価される コールバックは、レシーバが明示的に起動している間だけ呼ばれる (ただし、繰り返し呼ばれているときは、自動的にタイマーを再起動する また、呼び出し回数が既定値に達したときは自動的にタイマーを終了する) 呼び出し時にブロックを渡さないと例外が発生する また、既にappend_post_callbackメソッドで別のコールバックに登録されているときも例外が発生する 引数として、呼び出し回数を渡す 無限に呼び出すときは0以下の値を渡す。省略時は0を渡す 渡される引数は、(レシーバ,呼び出し回数(設定値),呼び出し回数(現在数))で構成される
- calls
-
レシーバの呼び出し回数。無限に呼び出すときは0以下の値を渡す。省略時は0を渡す
- 返却値
-
レシーバ
126 127 128 129 130 131 |
# File 'lib/Miyako/API/wait_counter.rb', line 126 def append_callback(calls = 0, &block) raise MiyakoError, "This method needs some block!" unless block_given? raise MiyakoError, "This instance registerd to post_callback!" if @@post_callbacks.has_key?(self) @@callbacks[self] = [block, calls, 1] self end |
#append_post_callback(calls = 0, &block) ⇒ Object
自分自身をコールバック処理に追加する
Miyako.main_loop内では、Screen.renderが呼ばれる直前(画面更新直前)にブロックが評価される コールバックは、レシーバが明示的に起動している間だけ呼ばれる (ただし、繰り返し呼ばれているときは、自動的にタイマーを再起動する また、呼び出し回数が既定値に達したときは自動的にタイマーを終了する) 呼び出し時にブロックを渡さないと例外が発生する また、既にappend_callbackメソッドで別のコールバックに登録されているときも例外が発生する 引数として、呼び出し回数を渡す 無限に呼び出すときは0以下の値を渡す。省略時は0を渡す 渡される引数は、(レシーバ,呼び出し回数(設定値),呼び出し回数(現在数))で構成される
- calls
-
レシーバの呼び出し回数。無限に呼び出すときは0以下の値を渡す。省略時は0を渡す
- 返却値
-
レシーバ
145 146 147 148 149 150 |
# File 'lib/Miyako/API/wait_counter.rb', line 145 def append_post_callback(calls = 0, &block) raise MiyakoError, "This method needs some block!" unless block_given? raise MiyakoError, "This instance registerd to callback!" if @@callbacks.has_key?(self) @@post_callbacks[self] = [block, calls, 1] self end |
#call(waiting = lambda{|*params|}, pre = lambda{|*params|}, post = lambda{|*params|}, *params) ⇒ Object
残り時間に応じたブロックを呼び出す
タイマー処理の状態に応じてブロックを評価して、その結果を渡す タイマー開始前はpre、タイマー実行中はwaiting、制限時間オーバー後はpostに渡したブロックを評価する callを呼び出すときに、ブロックに渡すparamsの数とブロックで定義したparamsの数との整合に注意する(例外が発生する)
- waiting
-
タイマー実行中に行うブロック。省略時は空のブロックを渡す
- pre
-
タイマー開始前に行うブロック。省略時は空のブロックを渡す
- post
-
タイマー制限時間オーバ後に実行中に行うブロック。省略時は空のブロックを渡す
- params
-
ブロックに渡す引数。可変引数
- 返却値
-
各ブロックを評価した結果
333 334 335 336 337 338 339 340 341 342 |
# File 'lib/Miyako/API/wait_counter.rb', line 333 def call(waiting=lambda{|*params|}, pre=lambda{|*params|}, post=lambda{|*params|}, *params) case self.now when -1 return pre.call(*params) when @wait+1 return post.call(*params) else return waiting.call(*params) end end |
#callback_calls ⇒ Object
コールバックを指定したときの呼び出し数を求める
コールバックに登録されていないレシーバを指定したときはnilを返す
- 返却値
-
整数もしくはnil
171 172 173 174 175 |
# File 'lib/Miyako/API/wait_counter.rb', line 171 def callback_calls array = @@callbacks[self] || @@post_callbacks[self] return nil unless array array[1] end |
#callback_count ⇒ Object
コールバックを指定したときの現在の呼び出し数を求める
コールバックに登録されていないレシーバを指定したときはnilを返す 呼び出し回数が無限の時は-1を返す
- 返却値
-
-1以上の整数もしくはnil
181 182 183 184 185 186 187 |
# File 'lib/Miyako/API/wait_counter.rb', line 181 def callback_count array = @@callbacks[self] || @@post_callbacks[self] return nil unless array return -1 if array[1] <= 0 return array[2] if @counting==false && array[1] == array[2] array[2] - 1 end |
#dispose ⇒ Object
インスタンスないで所持している領域を開放する
(現段階ではダミー)
346 347 |
# File 'lib/Miyako/API/wait_counter.rb', line 346 def dispose end |
#execute? ⇒ Boolean Also known as: executing?
タイマー処理中かを返す
タイマー処理中ならばtrue、停止中ならばfalseを返す
- 返却値
-
タイマー処理中かどうかを示すフラグ
285 286 287 |
# File 'lib/Miyako/API/wait_counter.rb', line 285 def execute? @counting end |
#finish? ⇒ Boolean Also known as: finished?
タイマーが制限時間に達したかを返す
タイマーが制限時間に達した(もしくはオーバーした)らtrue、制限時間内ならfalseを返す タイマーが
- 返却値
-
タイマー処理が終わったかどうかを示すフラグ
309 310 311 |
# File 'lib/Miyako/API/wait_counter.rb', line 309 def finish? return wait_inner(false) end |
#length ⇒ Object Also known as: size
設定されているウェイトの長さを求める
ウェイトの長さをミリ秒単位で取得する
- 返却値
-
ウェイトの長さ
203 204 205 |
# File 'lib/Miyako/API/wait_counter.rb', line 203 def length return @wait end |
#now ⇒ Object
開始からの経過時間を求める
タイマー実行中のとき現在の経過時間をミリ秒単位(0以上の整数)で取得する 制限時間を超えていれば、制限時間+1を返す まだスタートしてないときは-1を返す
- 返却値
-
現在の経過長
214 215 216 217 218 219 220 221 222 |
# File 'lib/Miyako/API/wait_counter.rb', line 214 def now if @stop_tick cnt = @stop_tick - @st return @wait < cnt ? @wait+1 : cnt end return -1 unless @counting cnt = SDL.getTicks - @st return @wait < cnt ? @wait+1 : cnt end |
#remain ⇒ Object Also known as: remind
開始からの残り時間を求める
タイマー実行中のとき、残り時間の長さをミリ秒単位(0以上の整数)で取得する 制限時間を超えていれば-1を返す まだスタートしてないときは制限時間+1を返す
- 返却値
-
残り時間の長さ
229 230 231 232 233 234 235 236 237 |
# File 'lib/Miyako/API/wait_counter.rb', line 229 def remain if @stop_tick cnt = @stop_tick - @st return @wait < cnt ? -1 : @wait - cnt end return @wait+1 unless @counting cnt = SDL.getTicks - @st return @wait < cnt ? -1 : @wait - cnt end |
#remove_callback ⇒ Object
自分自身をコールバック処理から解除する
コールバックに登録されていないレシーバを指定したときは例外が発生する
- 返却値
-
レシーバ
155 156 157 158 |
# File 'lib/Miyako/API/wait_counter.rb', line 155 def remove_callback @@callbacks.delete(self) || raise(MiyakoError, "This instance unregisterd to callback!") self end |
#remove_post_callback ⇒ Object
自分自身をコールバック処理から解除する
コールバックに登録されていないレシーバを指定したときは例外が発生する
- 返却値
-
レシーバ
163 164 165 166 |
# File 'lib/Miyako/API/wait_counter.rb', line 163 def remove_post_callback @@post_callbacks.delete(self) || raise(MiyakoError, "This instance unregisterd to post-callback!") self end |
#reset ⇒ Object
タイマーを開始前の状態に戻す
remain,nowの結果がstart前の状態に戻る ただし、停止中の時にしか戻せない
- 返却値
-
自分自身を返す
264 265 266 267 268 269 |
# File 'lib/Miyako/API/wait_counter.rb', line 264 def reset return self if @counting @st = 0 @stop_tick = nil return self end |
#resume ⇒ Object
タイマー処理を再会する
停止前の状態から再びタイマー処理を開始する
- 返却値
-
自分自身を返す
274 275 276 277 278 279 280 |
# File 'lib/Miyako/API/wait_counter.rb', line 274 def resume return self unless @stop_tick @st += (SDL.getTicks - @stop_tick) @stop_tick = nil @counting = true return self end |
#start ⇒ Object
タイマー処理を開始状態にする
- 返却値
-
自分自身を返す
243 244 245 246 247 248 |
# File 'lib/Miyako/API/wait_counter.rb', line 243 def start @st = SDL.getTicks @stop_tick = nil @counting = true return self end |
#stop ⇒ Object
タイマー処理を停止状態にする
この状態で、startメソッドを呼ぶと、開始前の状態に戻って処理を開始する resumeメソッドを呼ぶと、停止直前の状態に戻って処理を開始する
- 返却値
-
自分自身を返す
254 255 256 257 258 |
# File 'lib/Miyako/API/wait_counter.rb', line 254 def stop @stop_tick = SDL.getTicks @counting = false return self end |
#stop_callback_inner ⇒ Object
コールバックブロック内部でコールバックを終了させる
コールバック内部で、何らかの理由で次からのコールバックを行わせないときに呼び出す コールバック回数が規定の回数に達したのと同じ効果を与えている 現在実行しているブロックには、このメソッドによる影響を受けない
- 返却値
-
レシーバ
194 195 196 197 198 |
# File 'lib/Miyako/API/wait_counter.rb', line 194 def stop_callback_inner array = @@callbacks[self] || @@post_callbacks[self] || raise(MiyakoError, "This instance unregisterd to post-callback!") array[2] = array[1] return self end |
#wait ⇒ Object
:nodoc:
315 316 317 318 319 320 321 322 |
# File 'lib/Miyako/API/wait_counter.rb', line 315 def wait #:nodoc: st = SDL.getTicks t = SDL.getTicks until (t - st) >= @wait do t = SDL.getTicks end return self end |
#waiting? ⇒ Boolean
タイマー処理中かを返す
タイマー処理中ならばtrue、停止中ならばfalseを返す
- 返却値
-
タイマー処理中かどうかを示すフラグ
301 302 303 |
# File 'lib/Miyako/API/wait_counter.rb', line 301 def waiting? return wait_inner(true) end |