Class: Miyako::WaitCounter

Inherits:
Object show all
Defined in:
lib/Miyako/API/wait_counter.rb

Overview

タイマーを管理するクラス

Constant Summary collapse

SECOND2TICK =
1000
@@callbacks =
{}
@@post_callbacks =
{}
@@initialized =
false

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#nameObject

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

.callbacksObject

コールバックハッシュを参照する

コールバック処理を登録しているハッシュを参照する キー(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_callbacksObject

コールバックハッシュを参照する

コールバック処理を登録しているハッシュを参照する キー(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_updateObject

コールバック処理を更新する

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

.tickObject

起算時からのミリ秒数を取得する

起算時からのミリ秒数を整数で取得する

返却値

起算時からのミリ秒数(整数)


39
40
41
# File 'lib/Miyako/API/wait_counter.rb', line 39

def WaitCounter.tick
  return SDL.getTicks
end

.ticksObject

起算時からのミリ秒数を取得する

起算時からのミリ秒数を整数で取得する

返却値

起算時からのミリ秒数(整数)


46
47
48
# File 'lib/Miyako/API/wait_counter.rb', line 46

def WaitCounter.ticks
  return SDL.getTicks
end

.updateObject

コールバック処理を更新する

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を渡す

返却値

レシーバ

Raises:


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を渡す

返却値

レシーバ

Raises:


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_callsObject

コールバックを指定したときの呼び出し数を求める

コールバックに登録されていないレシーバを指定したときは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_countObject

コールバックを指定したときの現在の呼び出し数を求める

コールバックに登録されていないレシーバを指定したときは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

#disposeObject

インスタンスないで所持している領域を開放する

(現段階ではダミー)


346
347
# File 'lib/Miyako/API/wait_counter.rb', line 346

def dispose
end

#execute?Boolean Also known as: executing?

タイマー処理中かを返す

タイマー処理中ならばtrue、停止中ならばfalseを返す

返却値

タイマー処理中かどうかを示すフラグ

Returns:

  • (Boolean)

285
286
287
# File 'lib/Miyako/API/wait_counter.rb', line 285

def execute?
  @counting
end

#finish?Boolean Also known as: finished?

タイマーが制限時間に達したかを返す

タイマーが制限時間に達した(もしくはオーバーした)らtrue、制限時間内ならfalseを返す タイマーが

返却値

タイマー処理が終わったかどうかを示すフラグ

Returns:

  • (Boolean)

309
310
311
# File 'lib/Miyako/API/wait_counter.rb', line 309

def finish?
  return wait_inner(false)
end

#lengthObject Also known as: size

設定されているウェイトの長さを求める

ウェイトの長さをミリ秒単位で取得する

返却値

ウェイトの長さ


203
204
205
# File 'lib/Miyako/API/wait_counter.rb', line 203

def length
  return @wait
end

#nowObject

開始からの経過時間を求める

タイマー実行中のとき現在の経過時間をミリ秒単位(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

#remainObject 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_callbackObject

自分自身をコールバック処理から解除する

コールバックに登録されていないレシーバを指定したときは例外が発生する

返却値

レシーバ


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_callbackObject

自分自身をコールバック処理から解除する

コールバックに登録されていないレシーバを指定したときは例外が発生する

返却値

レシーバ


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

#resetObject

タイマーを開始前の状態に戻す

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

#resumeObject

タイマー処理を再会する

停止前の状態から再びタイマー処理を開始する

返却値

自分自身を返す


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

#startObject

タイマー処理を開始状態にする

返却値

自分自身を返す


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

#stopObject

タイマー処理を停止状態にする

この状態で、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_innerObject

コールバックブロック内部でコールバックを終了させる

コールバック内部で、何らかの理由で次からのコールバックを行わせないときに呼び出す コールバック回数が規定の回数に達したのと同じ効果を与えている 現在実行しているブロックには、このメソッドによる影響を受けない

返却値

レシーバ


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

#waitObject

: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を返す

返却値

タイマー処理中かどうかを示すフラグ

Returns:

  • (Boolean)

301
302
303
# File 'lib/Miyako/API/wait_counter.rb', line 301

def waiting?
  return wait_inner(true)
end