Skip to content
uupaa edited this page Dec 20, 2014 · 9 revisions

API

  • new WMClock - インスタンスを生成します
  • base time
  • clock state
  • register / unregister callback functions
    • WMClock#on - 定期的に呼び出すコールバック関数を登録します
    • WMClock#off - 定期的に呼び出すコールバック関数の登録を抹消します
    • WMClock#has - コールバック関数が登録済みならtrueを返します
    • WMClock#clear - 登録済みのコールバック関数を全て抹消します
  • register temporary callback function
    • WMClock#nth - 一時的なコールバック関数を登録します
  • utility

WMClock

new WMClock(ticks:TickFunctionArray = [], options:Object = {}) はインスタンスを作成し返します。

ticks にはコールバックする関数(tick)の配列を指定します。tick とは一定間隔で呼び出される関数の総称です(言語によってはonEnterFrameとも呼ばれます)。

インスタンス生成直後は、クロックの供給が行われていない状態です。 クロックの供給は WMClock#start() で明示的に開始するか、options.start = true で行います。

options には以下のプロパティを指定できます。

options description
start:Boolean = false auto start
WMClock#start() を行います
vsync:Boolean = false requestAnimationFrame を使用します
speed:Number = 0.0 setInterval(, speed) を指定します
pulse:Number = 0.0 timeStamp と deltaTime の値を pulse の値で整形します
baseTime:Number = 0.0 WMClock#setBaseTime の値を指定します
  • vsync が false なら、クロックの供給源に setInterval(, 16.666) を使用します
  • vsync が true なら、クロックの供給源に requestAnimationFrame を使用します
    • requestAnimationFrame が利用できない環境では setTimeout(, 4) で代用します
  • pulse を指定しない場合は、tick に渡される引数(timeStamp, deltaTime)が環境に依存した値になります
  • pulse を指定した場合は、timeStamp, deltaTime が pulse の数値に整形された環境に依存しない値になります
var clock = new WMClock([tick], { vsync: true, start: true });

function tick(timeStamp, deltaTime, count) {
    console.log(timeStamp, deltaTime, count);
}

こちらの使用例も参照してください。

WMClock.prototype.setBaseTime

WMClock#setBaseTime(baseTime:Number):void は、基準時刻(BaseTime)を設定します。

function WMClock_setBaseTime(baseTime) { // @arg Number - base time
//{@dev
    $valid($type(baseTime, "Number"), WMClock_setBaseTime, "baseTime");
//}@dev
    this._baseTime = baseTime;
    this._baseTimeDiff = Date.now() - baseTime;
}

WMClock.prototype.getBaseTime

WMClock#getBaseTime():Number は、基準時刻(BaseTime)を返します。

function WMClock_getBaseTime() { // @ret Number - base time
    return this._baseTime;
}

WMClock.prototype.now

WMClock#now():Number は、 基準時間(BaseTime) に基づいた相対時刻を返します。 BaseTime が設定されていない場合は Date.now() と同じ値を返します。

function WMClock_now() { // @ret Number
    return Date.now() - this._baseTimeDiff;
}

WMClock.prototype.start

WMClock#start():this は、クロックの供給を開始します。

クロック供給中は、登録済みのコールバック関数(tick)が順次呼び出されます。

WMClock.prototype.pause

WMClock#pase():this は、クロック供給の一時停止と再開を行います。

クロックが供給中なら一時停止し、供給していなければ供給を開始します。

WMClock.prototype.stop

WMClock#stop():this は、クロックの供給を停止します。

クロックの供給を停止すると、コールバック関数(tick)は呼ばれなくなります。

WMClock.prototype.isActive

WMClock#isActive():Boolean は、クロックが供給中なら true を返します。

WMClock.prototype.on

WMClock#on(tick:Function):this はコールバック関数(tick)を登録します。
二重登録はできません。

tick は tick(timeStamp:Number, deltaTime:Number, count:Integer):void の形でコールバックします。

  • timeStamp は クロックの供給を開始 WMClock#start した時点からの秒数(単位はms)です
  • deltaTime は 前回のコールバックからの差分です(単位はms)です
    • requestAnimationFrame を使用している場合は、恐らくこの値は、16.66ms前後(または33.33ms前後)になるでしょう。
  • new WMClock(, { pulse }) を指定している場合は、timeStamp と deltaTime は pulse の値で整形されます
    • pulse が100なら、timeStamp は 100の倍数になり、deltaTimeは常に100になります(初回のみdeltaTimeは0になります)
  • count はクロックを供給する度に+1される値です。0から始まります。

WMClock.prototype.off

WMClock#off(tick:Function):this は WMClock#on で登録済みのコールバック関数を抹消します。

WMClock.prototype.has

WMClock#has(tick:Function):Boolean は tick が登録済みなら true を返します。

WMClock.prototype.clear

WMClock#clear():this は、WMClock#on で登録済みのコールバック関数を全て抹消します。

WMClock.prototype.nth

WMClock#nth(callback:Function, times:Integer = 1):this は times 回呼ばれた後に自動的に登録を抹消する callback を登録します。

このメソッドで登録した callback は callback(timeStamp:Number, deltaTime:Number, count:Integer) の形でコールバックします。

  • timeStamp は クロックの供給を開始 WMClock#start した時点からの秒数(単位はms)です
  • deltaTime は 前回のコールバックからの差分です(単位はms)です
    • requestAnimationFrame を使用している場合は、恐らくこの値は、16.66ms前後(または33.33ms前後)になるでしょう。
  • new WMClock(, { pulse }) を指定している場合は、timeStamp と deltaTime は pulse の値で整形されます
    • pulse が100なら、timeStamp は 100の倍数になり、deltaTimeは常に100になります(初回のみdeltaTimeは0になります)
  • count はクロックを供給する度に+1される値です。0から始まります。
    • WMClock#nth の count は常に0から始まり、WMClock#resetCountではリセットできません
function WMClock_nth(callback, // @arg Function - callback(timeStamp:Number, deltaTime:Number, count:Integer):void
                     times) {  // @arg Integer = 1 - value from 1.
                               // @ret this
                               // @desc register the callback function of number of times.
//{@dev
    $valid($type(callback, "Function"),  WMClock_nth, "callback");
    $valid($type(times, "Integer|omit"), WMClock_nth, "times");
    if (times !== undefined) {
        $valid(times > 0,                WMClock_nth, "times");
    }
//}@dev

    times = times || 1;

    var that = this;
    var counter = 0;

    if (this["has"](callback)) {
        throw new TypeError("callback function already exists");
    }
    return that["on"](_handler);

    function _handler(timeStamp, deltaTime) {
        if (counter + 1 >= times) {
            that["off"](_handler);
        }
        callback(timeStamp, deltaTime, counter++);
    }
}
new WMClock().nth(function(timeStamp, deltaTime, count) {
    console.log(count); // 0, 1, 2, 3, 4
}, 5).start();

WMClock.prototype.resetCount

WMClock#resetCount は、tick 関数が返す count の値を 0 にリセットします。

var clock = new WMClock([tick], { start: true, speed: 1000 });

function tick(timeStamp, deltaTime, count) {
    if (count > 3) {
        clock.resetCount();
    }
    console.log({ timeStamp:timeStamp, deltaTime:deltaTime, count:count });
}
Object {timeStamp: 1001, deltaTime: 0, count: 0}
Object {timeStamp: 2002, deltaTime: 1001, count: 1}
Object {timeStamp: 3004, deltaTime: 1002, count: 2}
Object {timeStamp: 4004, deltaTime: 1000, count: 3}
Object {timeStamp: 5005, deltaTime: 1001, count: 4}
Object {timeStamp: 6006, deltaTime: 1001, count: 0}
Object {timeStamp: 7007, deltaTime: 1001, count: 1}
Object {timeStamp: 8007, deltaTime: 1000, count: 2}
Object {timeStamp: 9009, deltaTime: 1002, count: 3}