オブジェクト指向言語でゲームを作成しようとするときはいつも、(どんな種類のゲームを書くかを考えた後に)私が常に直面する最初の問題は、エンジンの設計方法です。SDLのような既存のライブラリまたはフレームワークを使用している場合でも、メニューを管理するためにステートマシンを使用するか、リソースの読み込みに使用するクラスの種類など、すべてのゲームに対して特定の決定を行う必要があります。
優れた設計とは何ですか?どのように実装されますか?行わなければならないトレードオフとその長所/短所は何ですか?
オブジェクト指向言語でゲームを作成しようとするときはいつも、(どんな種類のゲームを書くかを考えた後に)私が常に直面する最初の問題は、エンジンの設計方法です。SDLのような既存のライブラリまたはフレームワークを使用している場合でも、メニューを管理するためにステートマシンを使用するか、リソースの読み込みに使用するクラスの種類など、すべてのゲームに対して特定の決定を行う必要があります。
優れた設計とは何ですか?どのように実装されますか?行わなければならないトレードオフとその長所/短所は何ですか?
回答:
誰かが「あなたはこれとあれ、これとこのスロットをパターンXを使ってやらなければならない」と言うことができるとは思えない
しかし、いくつかの有用なリソース:
Enginuity-Gamedev.netの一連のエンジン構築記事。
Game Coding Complete-私はこの本を所有しており、ゲームプログラミングのすべての(まあ、ほぼ)側面をうまく行き来しています。また、本全体にエンジンが組み込まれています。
ゲームエンジンアーキテクチャ -これは、エンジン設計に関するもう1つの素晴らしい本です。
C4エンジンレイアウト -私のコメントから引用しましたが、これはエンジンの各部分を合わせる高レベルの方法を示しています。
これらはあなたが必要とするものには少し多すぎるかもしれませんが、あなたは何かについてあまり知ることはできません。あなたはそれらから良い計画を得ると確信しています。
編集:新しいサイト以来、Gamedevの記事がアーカイブされているのを忘れていましたが、修正されました:)
例として、私の現在のローグライクプロジェクトの構造を(Javaで)示します。2Dグラフィックエンジンを使用しているため、多くのレンダリングコードが既に処理されています。批判を歓迎します。
class Game
このクラスは、ゲームの現在の状態を管理する状態マシンをセットアップします。(メニュー内、新しいゲームの開始、保存したゲームのプレイ)
interface State
各Stateクラスには、ロジックを更新するためのループとレンダリングのためのループの2つのループが含まれています。また、Game
クラスを呼び出して別の状態への変更を要求するためのコードも含まれています。
class ResourceManager
Game
必要なすべてのリソースをロードし、それらへのアクセスを許可
するクラスによって初期化されるシングルトン。たとえば、異なるレベルでリソースをロード/アンロードするのが難しくなるため、この設計は好きではありません。最初からやり直す場合は、おそらく別の方法で設計します。
class Map
マップには、タイルの配列と、マップ上のすべてのクリーチャーとアイテムのリストが含まれています。とても基本的なクラスです。
class Creature
クリーチャーには、動きの計算などの自分自身に関する情報が含まれています(どのマップにいるかを知り、それを照会して障害物を見つけることができるようにする必要があります)。これを行うか、何らかのマネージャークラスにすべてのクリーチャーの面倒を見てもらうかを決めるのは、私が苦労していることです。
interface AITask
クリーチャーはAITasksのリストを持つことができます。AITasksは、クリーチャーの論理ループが実行されるたびに実行されます。AITaskには、クリーチャーにコマンドを発行する独自のロジックループと、タスクが正常に完了したかどうかを判断する終了条件があります。
interface UIElement
このエンジンに独自のUIを実装しました。各UIElementには、レンダリングループとロジックループがあります。また、キーボード/マウス入力を処理するためのループもあります。すべての要素は、親の後にレンダリングされ、キーボード/マウス入力を引き継ぐいくつかの子要素を持つことができます。これにより、たとえばサブメニュー付きのメニューを使用できます。
作成する最初の重要なポイントは、この質問に対する「良い」答えは誰もいないということです。
正しい答えに最も近いものは次のようなものです:ゲームのタイプ、ターゲットプラットフォーム、制約(時間)などに大きく依存します。
それは他の人々がどのようにこの問題に答えようとしたかを示すいくつかの本当に良い記事があることを言いました(私は過去にこれに関する情報を見つけようとしたので)。
共産主義のカモがその縁に言及したようにがゲームに関する記事にゲームアーキテクチャのいくつかの部分を理解するのに役立ちました。
私の現在のデザインは、Quake3 / Doom3のハイブリッドですと少しの.NETクラスライブラリの :)
私は2つのライブラリ(静的または動的はビルド/配信方法に依存します)とを持ってFramework
いLibrary
ます。
ライブラリには、ゲームソフトウェアの生産を支援するために存在するすべてのヘルパークラスが含まれていますが、この種の製品に限定されません。つまり、ゲームコード用に最適化されたリンクリストの実装がありますが、リンクリストのサービスを必要とするものなら何でも使用できます。
フレームワークは、それを呼び出したい場合の「エンジン」の根幹です。これの多くは、Quake3の設計哲学に従っています(よりオブジェクト指向の方法で)。CLIが含まれています、タイミング管理、OS固有のコード、および最終的にネットワーク層など。
これらの2つは、作成中の実際のアプリに対してリンクされます。のGame
ゲーム固有のコードが含まれている場合のように、。ほぼ同じ方法で、Quake3はどの「mod」が再生されているかに応じてDLLをロードします。
ここで構造のアイデアを提供するために、各libのフォルダーとコンテンツを簡単に説明します。
HTH!あなたにいくつかのポインタを与える必要があります...
考慮事項
良いデザイン
データはプログラミングの鍵です。データを適切に設計する場合、通常はアルゴリズムからアルゴリズムが出現します(行列式の計算など、数値アルゴリズムを数えない場合)。