3

私たちのゲーム プロジェクトでは、タイマー ループを 1 秒間に約 20 回 (アプリケーションのフレームレートと同じ) 起動するように設定しました。これを使用して、いくつかのスプライトを移動します。これにより問題が発生する可能性があるので、代わりに EnterFrame イベント ハンドラーを使用して更新を行うべきではないかと考えています。タイマー ループがアプリケーションのフレームレートよりも速く実行されると、問題が発生する可能性が高いという印象を受けました...これは事実ですか?

更新として、EnterFrame で実行しようとすると、非常に奇妙な問題が発生しました。75ms ごとのフレームではなく、突然 25ms に跳ね上がりました。フレームレートが異なると主張したのは私たちの計算だけではなく、突然アニメーションが異常な速さまでスピードアップしたことに注意してください。

4

5 に答える 5

4

いくつかの特殊なケースでは、ロジック用とビジュアル用の 2 つの「ループ」があると便利な場合がありますが、ほとんどのゲームでは、Enter フレーム イベント リスナーに固執します。フレームレート以外に設定すると、モーションがぎくしゃくしたり、見えなくなったりするため(フレームが再描画されないため)、物を移動するための別のタイマーを持つことは少し不要です。

ただし、考慮すべきことの 1 つは、ロジックをフレームレートから切り離すことです。これは、getTimer (as2 と as3 の両方で使用可能) を使用して最後のフレームから経過した時間を計算し、それに応じてモーションなどを調整することで最も簡単に実現できます。

タイマーはエンター フレーム イベントよりも信頼性が高くありません。フラッシュは設定した速度に追いつこうとしますが、負荷の高い処理や複雑なグラフィックスを実行している場合は、タイマーとフレームレートの両方が遅くなります。

于 2008-09-24T14:05:11.473 に答える
4

ここでは、Flash がフレームレートを処理する方法と、コンテンツの再生速度が向上した理由について簡単に説明します。

最も深いレベルでは、Flash が実行されているホスト アプリケーション (通常はブラウザ) が、一定の間隔で Flash をポーリングします。その間隔は、あるブラウザーでは 10 ミリ秒ごと、別のブラウザーでは 50 ミリ秒ごとかもしれません。ポーリングが発生するたびに、Flash は次のようなことを行います。

  • 最後のフレーム更新から (1000/フレームレート) ミリ秒が経過しましたか?
    • いいえの場合: 何もせずに戻る
    • はいの場合: フレームの更新を実行します。
      • すべての (再生中の) タイムラインを 1 フレーム進めます
      • すべてのイベントをディスパッチします (イベントを含むENTER_FRAME)
      • 保留中のイベントがあるすべてのフレーム スクリプトとイベント ハンドラーを実行する
      • 描画画面の更新
      • 戻る

ただし、特定の種類の外部イベント (キー押下、マウス イベント、タイマー イベントなど) は、上記のプロセスとは非同期で処理されます。そのため、キーが押されたときに起動するイベント ハンドラーがある場合、そのハンドラーのコードは、フレームの更新の間に数回実行される可能性があります。updateAfterEvent()メソッド (AS2 ではグローバル、AS3 ではイベントにアタッチ)を使用しない限り、画面はフレーム更新ごとに 1 回だけ再描画されます。

これらのイベントの非同期動作は、フレーム更新のタイミングには影響しないことに注意してください。たとえば、タイマー イベントを使用して 1 秒あたり 50 回画面を再描画する場合でも、フレーム アニメーションはパブリッシュされたフレーム レートで発生し、スクリプト アニメーションは enterFrame イベント (タイマー)。

于 2008-09-25T02:47:32.217 に答える
2

フレーム入力イベントを使用する利点は、処理がレンダリングと同じペースで低下し、コード ブロックが終了した直後に画面が更新されることです。

いずれの方法も、特定の時間間隔で発生するとは限りません。したがって、イベント ハンドラーは、最後に実行されてからの経過時間を判断し、純粋に何回実行されたかではなく、それを基に決定を下す必要があります。

于 2008-09-24T14:32:41.203 に答える
0

TweenLite(http://blog.greensock.com/tweenliteas3/)などの約3kbの軽量クラスを使用することをお勧めします。より多くの電力が必要な場合は、11kbのTweenMaxを使用できます。ここには多くの利点があります。まず、この「エンジン」は徹底的にテストおよびベンチマークされており、少数または多数のアニメーションを作成するための最もリソースに優しい方法の1つとしてよく知られています。AS3では1,500のスプライトがTweenLiteでアニメーション化されており、Tweenerのような競合他社が9 fpsに低下するのと同様に、強力な20fpsを保持しているベンチマークを見てきましたhttp://blog.greensock.com/tweening-speed-テスト/。次の利点は、以下で説明するように使いやすさです。

//以下を含むフォルダを指すクラスパスがあることを確認してください。
gs.TweenLiteをインポートします。
gs.easing。*をインポートします。

var ball_mc:MovieClip = new MovieClip();
var g:Graphics = ball_mc.graphics;
g.beginFill(0xFF0000,1);
g.drawCircle(0,0,10);
g.endFill();

//ここでball_mcをアニメートします
//例:TweenLite.to(displayObjectName、totalTweeningTime、{someProperty:someValue、anotherProperty:anotherValue、onComplete:aFunctionCalledWhenComplete});
TweenLite.to(ball_mc、1、{x:400、alpha:0.5});

したがって、これはball_mcを取得し、x軸上の現在の位置から400に移動し、同じTweenの間に、アルファを現在の値から0.5に増減します。

必要なクラスをインポートした後、各オブジェクトをアニメーション化するのは実際には1行のコードだけです。これは本当に素晴らしいことです。また、使いやすさに影響を与える可能性があります。これは、デフォルトではExpo.easeOut(Strong easeOut)であると私は信じています。バウンスまたは弾力性を持たせたい場合は、次のようにオブジェクトにプロパティを追加するだけで、このような効果を利用できます。

TweenLite.to(ball_mc、1、{x:400、alpha:0.5、ease:Bounce.easeOut});
TweenLite.to(ball_mc、1、{x:400、alpha:0.5、ease:Elastic.easeOut});

イージングは​​すべて、TweenLiteを介して利用されるPennerのイージング方程式であると私が信じるgs.easing。*インポートから来ています。

結局、タイマーなどの管理するポーリング(開ループ)はなく、簡単に修正または削除できる非常に読みやすいコードがあります。

また、TweenLiteとTweenMaxは、ここに表示したものよりもはるかに多くの機能を提供していることに注意することも重要です。すべてのプロジェクトで2つのクラスのいずれかを使用していると言っても過言ではありません。アニメーションはカスタムであり、機能が付加されています(onComplete:functionCall)。また、アニメーションは最適でリソースに優しいものです。

于 2008-09-25T00:21:24.080 に答える
0

timerEvent と Enter Frame はどちらも良いオプションだと思います。ゲームで両方を使用しました。( タイマーループによる timerEvent ということですか? )

PS: 低速のマシンではタイマーが十分に速く更新されない可能性があることに注意してください。そのため、低速のマシンでゲームを「高速」に動作させるようにコードを調整する必要がある場合があります。

于 2008-09-24T11:47:17.733 に答える