1

私は通常、XNA を使用してゲームを開発します。XNA を使用するときに行う一般的なことの 1 つは、ElapsedGameTime に基づいて各エンティティを更新することです。これにより、可変フレームレートでもスムーズな動きが可能です。

FlashDevelop を使用して AS3 でその機能を探しています。

これまでのところ、私は思いついた:

public function Update():void
{
    var currentTime:Number = getTimer();
    var elapsedTime:Number = currentTime - lastFrame;
    elapsedTime /= 1000;

    //use elapsedTime here for movement
    player.x += speed.x * elapsedTime

    lastFrame = getTimer();
}

これを使用すると、実際に機能しているかどうかはわかりません。これを実装すると、違いがよくわかりません。

これは似ていますか?これを行う別の方法はありますか?

4

2 に答える 2

2

特定のフレームに必要なすべての処理が割り当てられた時間内に発生し、実際にスムーズに更新できる場合は、これを使用する場合と enter_frame ハンドラーを使用する場合の違いが見られない可能性があるようです。 1/24 秒 (デフォルトの frameRate は 24)。違いをテストする 1 つの方法は、frameRate プロパティを変更し、「キャラクター」の速度が frameRate の変更によって影響を受けるかどうかを確認することです。また、trace(elapsedTime) のようなトレース ステートメントを使用することもできます。また、enter_frame イベント ハンドラーを追加して、フレームを追跡し、それをトレースして、これがどのように実行されているか、またどのような違いが生じているかについてより良い洞察を得ることができます。これは、私が持っていないものの、完全に有効な方法のように思えます。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/Application.html#frameRate

純粋な AS3 を使用する場合は、次のようにメイン クラスのメタデータを使用してこれを設定します。

http://flassari.is/2009/02/swf-metadata-in-pure-as3-projects/

http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf680e1-7ffe.html#WS4b4ddee4904fe7796d38fa291219d46bcb4-8000

于 2012-06-12T22:42:05.243 に答える
0

ENTER_FRAMEの代わりにタイマークラスを使用してみることができます

var myTimer:Timer = new Timer(1000, 1); // (ms, repeats = set to 0 for infinity)
myTimer.addEventListener(TimerEvent.TIMER, runOnce);
myTimer.start();

function runOnce(event:TimerEvent):void {
    trace("runOnce() called @ " + getTimer() + " ms");
}


var myTimer:Timer = new Timer(1000); // (ms)
myTimer.addEventListener(TimerEvent.TIMER, runMany);
myTimer.start();

function runMany(event:TimerEvent):void {
    trace("runMany() called @ " + getTimer() + " ms");
}
于 2012-06-13T08:20:06.563 に答える