1

私は現在、C++ でターンベースの RPG (ローグライク) を開発しており、他のプロジェクトでこのような構造のコードを見たことを覚えているので、デザイン パターンのように見えるきちんとしたアーキテクチャをコードに作成しました。これが私が偶然見つけたある種のデザインパターンであるかどうか、もしそうなら、その名前は何ですか. プログラムの他の部分では、Factory や Singleton などのいくつかのパターンを意図的に適用していますが、以下は、パターンかどうかわからないプログラムの別の部分の大まかな説明です。

GameElementという基本クラスがあります。これは、ゲーム フィールド内に表示される可能性のあるすべてのオブジェクトのルートです。このクラスは、要素のタイプに関係なく共通の動作であるため、すべてのサブクラスが継承する移動、衝突の検出などに関する基本的かつ複雑な動作を実装します。さらに、デフォルトでは何もしませんが、サブクラスによってオーバーライドできる 2 つの仮想メソッド: handleCollision( GameElement* e )handleTurn()があります。オブジェクトが別のオブジェクト (特にプレーヤー) と衝突したときに何をすべきかをオブジェクトが認識できるように、handleCollisionメソッドを再実装できますオブジェクトが自分の番になったときにやりたいことを何でもできるようにするために存在します。これまでのところ、いくつかのサブクラス、つまりSolidElementPushableElementFighterElement (プレイヤーと敵用)、FighterElementを継承するPlayerElement (プレイヤー) 、およびFighterElementも継承するEnemyElement (すべての悪の根源) を作成しました。

run()メソッドでゲーム ループ (SDL イベント ループも含む) をカプセル化するGameEngineというクラスもあります。これは、このメソッドの (かなり短い) 実装です。

void GameEngine::run()
{
    SDL_Event evt;

    while ( running ) {
        handlePlayerCollisions();
        handleTurns();
        updateScreen();
        delay();

        SDL_PollEvent(&evt);

        if ( evt.type == SDL_KEYDOWN )
            handleKeyInput( evt.key.keysym.sym );
            continue;
    }
}

ゲーム ループ内で、現在のシーンのGameElement*コンテナ全体を通過するループを持つhandlePlayerCollisionsを呼び出し、それぞれでhandleCollision( player )を呼び出します。要素の型であり、プレイヤーを傷つける、道を塞ぐ、移動する (つまり、押される) など、クラスがhandleCollisionメソッドで実装したその他のことを行うことができます。また、メソッドhandleTurnsが呼び出されます。これは、 handleTurnを呼び出すことを除いて、handlePlayerCollisionsとほぼ同じことを行います。彼らが好きなことをできるように、あらゆる要素で。呼び出されるもう 1 つのメソッドはupdateScreenで、その名前が示すとおりのことを行います。最後に、キー入力の処理に使用される SDL イベント ループです。

このアーキテクチャが何らかの設計パターンである場合、そしてそれがどのようなパターンであるかを知っていれば、他のプロジェクトで使用するのがはるかに簡単になり、必要なときに他の人に説明するのにはるかに時間がかからなくなるでしょう。に。

4

2 に答える 2

1

あなたが持っているものとはまったく異なりますが、多くのシミュレーターのパターンは、OODA ループ(観察、向き、決定、行動) またはバリアント Sense Decide Act に基づいています。ビジュアライゼーションのあるゲームまたはシミュレーターでは、レンダリングを各ループ サイクルにタグ付けします。

あなたのゲームでhandlePlayerCollisions()は、観察ステップの一部です。各コンポーネントは、プレイヤーと同じ場所にあるかどうかを判断します。おそらくhandleTurns()、プレーヤーに従うか逃げるかの決定、およびその他の決定とアクションがあります。updateScreen現在のゲームの状態をレンダリングします。観察と決定から行動を分離することで、シミュレーションは既知の状態からすべての観察を計算し、次に既知の観察から決定を計算し、それらの決定からアクションを計算できます。これは、シミュレーションを歪曲しないことを意味し、後者のエンティティが以前のエンティティのアクションの結果を観察していることを意味します同じサイクル。ただし、プレーヤーのみを観察することに限定し、観察、決定、および一緒に行動することをまとめたので、その保証はありません (updateScreenシミュレーション状態の更新も含まれない限り)。

ゲーム内のエンティティが単一の深い階層であるか、コンポーネントの集合体であるか、またはインテリジェントな動作のコンサートであるかは、別の議論です。

于 2012-07-14T10:26:44.010 に答える
0

あなたが説明するメソッドは、「テンプレートメソッド」(GoF)パターンの実装です http://www.vincehuston.org/dp/template_method.html

于 2012-07-14T10:01:13.113 に答える