0

Ok。AS3 ゲームの構造について質問があります。シンプルなシューティングゲームの組み立て方。

メインヒーローと弾丸を発射する船があります。2 つのレベルを追加したいのですが、それらを適切に構成する方法や、どちらの方法が適切かわかりません。

私はすべてを保持し、トラフレベルを切り替える必要があるメインクラスを持っています。そのため、各レベルを個別のクラスとして分けています。

サンプルコード

package
{
    // imports

    public class Main extends Sprite
    {
         // properties
         private var testLevel:Level1;

         public function Main():void 
         {
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE, init);
     }

         private function init(e:Event = null):void 
     { 
             testLevel  = new Level1();
             addChild(testLevel);
         } 
    }
}

// Level1 code
package Levels
{
    // imports
    public class Level1 extends Sprite
{
         // properties
         private var ship:Ship;

         public function Level1(stage:Object) 
     {
            // do some stuff
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
         }

         public function onEnterFrame(e:Event):void
     {
              // do some stuff
         }

    }
}

したがって、このコードによると、私の質問は次のとおりです。Ship内で別のENTER_FRAME関数を使用して船の弾丸を追加する必要がありますか、それともレベルループに追加する必要がありますか?

両方の方法を実行できますが、弾丸がシーンの最後に到達したとき、またはヒーローに当たったときにいくつかのアクションを追加する予定であるため、パフォーマンスとマイナーのどちらが優れています.

4

2 に答える 2

3

これは妥協ですが:

  • 単一の ENTER_FRAME リスナーを使用すると、パフォーマンスが向上します

  • ただし、メンテナンスのために、Ship クラス内とゲーム内の各オブジェクト (たとえば、Enemy クラス、Bullet クラスなど) 内に個別の更新関数を用意することをお勧めします。

したがって、通常、これに対処して両方のオプションを最大限に活用するための推奨される方法は、メイン クラスに 1 つのメイン ENTER_FRAME リスナーを配置することです。これは通常、メイン ゲーム ループと呼ばれます。これは、ゲームで実行されている唯一の ENTER_FRAME リスナーでなければなりません。このゲーム ループから、現在ゲーム内にある各オブジェクトの更新関数を呼び出す必要があります。これは、ゲーム内のオブジェクトの位置、ステータスなどを更新する役割を果たします。

于 2013-03-05T13:25:46.303 に答える
1

私の意見では、レベルごとにクラスを作成するのではなく、レベル エンジンを作成し、xml でレベルを記述します。弾丸を保持するシュートエンジンを作成し、タムを更新します。コリジョンを確認するためにコリジョン エンジンを作成します。良い例は Waste Invaders のコードです。リンク src/com/shooty/engine コードを確認してください。これは非常に役立ちます。

于 2013-03-05T13:21:33.407 に答える