2種類のゲームループの回し方
いくつかサンプルをみていると、ゲームループの回し方に複数あることに気づきました。
ループの起動パターンA
this.addEventListener(egret.Event.ENTER_FRAME, this.loop, this);
ループの起動パターンB
egret.Ticker.getInstance().register(loop, this);
APIドキュメントを確認してみる
パターンA: egret.Event.ENTER_FRAME
Event.ENTER_FRAME
[Broadcast Event] 次のフレームが開始されると、このコールバックが呼び出されます。このオブジェクトが表示されているかいないか関係なくこのイベントは発生します。
パターンB:
Public register( listener:Function,thisObject:any ,priority:number ):void
Language version: Egret 2.4
Runtime version: Web, Native
フレームを処理するコールバックを登録する。同じコールバック関数が登録された場合は無視されます。このメソッドの代わりにegret.startTick
を使うことが推奨されています。
引数:
listener:Function
フレーム処理のコールバック関数、第一引数に前のフレームと今回のフレームとの間のインタバールが渡されます
本命パターン?のegret.startTick
どこにもstartTick
なるメソッドはないw
startTick
のサンプルとドキュメント
時間制御
2.Ticker heartbeat
グローバル関数の
egret.startTick
(停止はstopTick
)により、60フレーム毎にコールバック関数が呼び出されます。ENTER_FRAMEイベント
とは異なります。ENTER_FAME
イベントはフレーム毎に発生します。フレームレートを変更すればコールバックの呼び出し間隔も変わります。startTick
はフレームレートに影響されません。
サンプルコード:this.time = egret.getTimer(); egret.startTick(this.moveStar,this); } private moveStar(timeStamp:number):boolean { var now = timeStamp; var time = this.time; var pass = now - time; console.log("moveStar: ",(1000 / pass).toFixed(5)); this.time = now; return false; }
ENTER_FRAME
のサンプルとドキュメント
3. Frame event
フレームイベント
ENTER_FRAME
は次のフレームの開始時に発生します。設定されたフレームレートに依存します。
結論
-
egret.DisplayObject#addEventListener(egret.Event.ENTER_FRAME,...);
を使いましょう - index.htmlで指定したフレームレートが有効になります