私は現在、C++ でターンベースの RPG (ローグライク) を開発しており、他のプロジェクトでこのような構造のコードを見たことを覚えているので、デザイン パターンのように見えるきちんとしたアーキテクチャをコードに作成しました。これが私が偶然見つけたある種のデザインパターンであるかどうか、もしそうなら、その名前は何ですか. プログラムの他の部分では、Factory や Singleton などのいくつかのパターンを意図的に適用していますが、以下は、パターンかどうかわからないプログラムの別の部分の大まかな説明です。
GameElementという基本クラスがあります。これは、ゲーム フィールド内に表示される可能性のあるすべてのオブジェクトのルートです。このクラスは、要素のタイプに関係なく共通の動作であるため、すべてのサブクラスが継承する移動、衝突の検出などに関する基本的かつ複雑な動作を実装します。さらに、デフォルトでは何もしませんが、サブクラスによってオーバーライドできる 2 つの仮想メソッド: handleCollision( GameElement* e )とhandleTurn()があります。オブジェクトが別のオブジェクト (特にプレーヤー) と衝突したときに何をすべきかをオブジェクトが認識できるように、handleCollisionメソッドを再実装できます。オブジェクトが自分の番になったときにやりたいことを何でもできるようにするために存在します。これまでのところ、いくつかのサブクラス、つまりSolidElement、PushableElement、FighterElement (プレイヤーと敵用)、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 イベント ループです。
このアーキテクチャが何らかの設計パターンである場合、そしてそれがどのようなパターンであるかを知っていれば、他のプロジェクトで使用するのがはるかに簡単になり、必要なときに他の人に説明するのにはるかに時間がかからなくなるでしょう。に。