1

XNA 4.0 でタクティカル RPG ゲームを作成していますが、「フェーズ」を実行する最善の方法は何でしょうか? フェーズとは、プレイヤーが兵士をマップに配置できるようにするフェーズを作成し、プレーヤーのターン用のフェーズと敵のターン用の別のフェーズを作成することです。

ある種の列挙型を作成し、それに応じてアップグレード/描画メソッドでコードを設定できると考えていましたが、これが最初に実行する最善の方法であることを確認したいと思います。

ありがとう!

編集:以下のアナキシマンダーへ:

これについては前に言及する必要がありましたが、あなたが言及したものと同様のものがすでにアプリケーションに実装されています。私のものは and と呼ばれScreenManagerますScreenが、まったく同じように機能します。問題は、画面、フェーズ、状態などを別のものとして扱っていることだと思いますが、実際には同じものです。

基本的に、私が本当に望んでいるのは、1 つの画面でさまざまな「フェーズ」を管理する方法です。呼び出された画面の 1 つは、map基本的に、ゲーム内で可能なすべてのマップを表します。これは、戦闘などが行われる場所です。これについて最善の方法を知りたいです。

  • 、などの値FightStageを保持 する列挙型を作成し、列挙型に従ってand メソッドを分割します。PlacementPhasePlayerPhaseDrawUpdate
  • または、これを管理する外部クラスを作成します。

混乱させて申し訳ありません!

4

1 に答える 1

1

状態またはフェーズでよく使用するアプローチは、マネージャー クラスを使用することです。基本的に、 、、およびメソッドGamePhaseを持つオブジェクトが必要であり、場合によってはおよびも必要です。また、ハンドオーバーを処理するための何らかの方法が必要になることもよくあります。それについては後で詳しく説明します。このクラスを取得したら、それを継承して各フェーズのクラスを作成します。、、、などInitialise()Update()Draw()Dispose()Pause()Resume()SoldierPlacementPhaseMovementPhaseAttackPhase

次に、 、、およびメソッドGamePhaseManagerを持つクラスがあり、おそらく何らかのメソッドがあります。また、マネージャーに状態を追加するメソッドも必要です。状態を保存する方法も必要です。またはをキーとして使用することをお勧めします。メソッドはそのキーをパラメーターとして受け取ります。Initialise()Update()Draw()Dispose()SetCurrentPhase()Add()Dictionary<>int/enumstringSetCurrentPhase()

基本的に、GamePhaseManagerゲーム内に のインスタンスを設定し、各フェーズ オブジェクトを作成して初期化し、マネージャに追加します。次に、ゲームの更新ループが を呼び出しますGamePhaseManager.Update()。これは、現在の状態の Update メソッドを呼び出してパラメーターを渡すだけです。

フェーズには、いつ終了するかを伝える何らかの方法と、それを処理する何らかの方法が必要になります。最も簡単な方法は、オブジェクトをセットアップしてから、次のフェーズへの参照を各フェーズに与えるGamePhaseようなメソッドを用意することです。GamePhase.SetNextPhase(GamePhase next)次に必要なのはExiting、保護されたセッターとパブリックゲッターを備えたブール値だけです。これにより、内部ロジックがフェーズが終了したと判断したときにExiting = true設定できるようになり、次のことができます。Update()GamePhaseManager.Update()

public void Update(TimeSpan elapsed)
{
    if (CurrentPhase.Exiting)
    {
        CurrentPhase.HandOver();
        CurrentPhase = CurrentPhase.NextPhase;
    }
    CurrentPhase.Update(elapsed);
}

更新にフェーズが変更されていることに気付くでしょう。これは、終了フェーズがそのサイクルを終了できるようにするためです。そうしないと、奇妙な動作が発生します。このCurrentPhase.HandOver()メソッドは基本的に、現在のフェーズを取得して、次のフェーズが適切なポイントから続行するために知る必要があるものをすべて渡します。これはおそらくNextPhase.Resume()、内部的に呼び出し、必要な情報をパラメーターとして渡すことによって行われます。ここでも設定することを忘れないでくださいExiting = false。そうしないと、更新ループが 1 回だけの後で引き続き引き渡されます。

メソッドはDraw()同じ方法で処理されます。ゲーム ループはを呼び出しますGamePhaseManager.Draw()。これは単に を呼び出しCurrentPhase.Draw()、パラメータを渡します。

フェーズに依存しないもの (マップなど) がある場合は、それを に格納し、のGamePhaseManagerメソッドでそのメソッドを呼び出すGamePhaseManagerか、フェーズにそれを渡し、そのメソッドを呼び出させることができます。または、トップレベルに維持して、の横にあるメソッドを呼び出すことができますGamePhaseManager。フェーズが必要とするアクセスの量によって異なります。

編集 あなたの編集は、上記のかなりの部分があなたに知られていることを示していますが、将来この質問に出くわした人を助けるためにそこに残しておきます。

ゲームのステージを処理するマネージャーが既にいる場合、私の直感はそれを入れ子にすることです。ゲームにステージがあることを確認し、それらを処理するクラスを作成しました。独自のステージを持つステージがあるので、既に作成したステージ処理コードを使用してみませんか? Screenオブジェクトからクラスを継承するSubdividedScreenか、それを呼び出したいと思うものは何でも継承します。この新しいクラスはほとんど親と同じですが、クラスの独自のインスタンスも含まれていますScreenManagerScreen呼び出しmapているオブジェクトをこれらのオブジェクトのいずれかに置き換え、さまざまな段階 ( 、など)を表すインスタンスSubdividedScreenで埋めます。にいくつかの調整が必要な場合がありますScreenManagerScreenPlacementPhasePlayerPhaseScreenManager適切な情報が必要なメソッドに確実に届くようにコードを作成する必要がありますが、Update()switch ケースごとに細分化された乱雑なメソッドを使用するよりもはるかにすっきりしています。

于 2013-01-29T13:06:12.813 に答える