オブジェクト指向言語でゲームエンジンを設計する方法は?[閉まっている]


26

オブジェクト指向言語でゲームを作成しようとするときはいつも、(どんな種類のゲームを書くかを考えた後に)私が常に直面する最初の問題は、エンジンの設計方法です。SDLのような既存のライブラリまたはフレームワークを使用している場合でも、メニューを管理するためにステートマシンを使用するか、リソースの読み込みに使用するクラスの種類など、すべてのゲームに対して特定の決定を行う必要があります。

優れた設計とは何ですか?どのように実装されますか?行わなければならないトレードオフとその長所/短所は何ですか?


12
衝動を起こし、分析麻痺に苦しむのではなく、そこからリファクタリングすることの何が問題なのでしょうか?
共産主義のダック

7
@TheCommunistDuck衝動に乗ることは以前のすべてのプロジェクトで採用したアプローチであるため、新しい機能を追加するには途方もない労力と複雑さが必要であることがわかった数か月後に、すべてのプロジェクトが壁にぶつかります。今は、ゲーム自体を書くよりもエンジンの書き換えに多くの時間を費やしているので、少し前向きに計画することで、長い目で見れば時間を節約できることを望んでいます。
extropicエンジン

3
@chuzzum、良い点。私がお勧めすることの1つは、C4エンジンのアーキテクチャを確認することです。terathon.com/c4engine/images/architecture.pngそれはあなたが必要とするよりもはるかに高いレベルかもしれませんが、あなたにいくつかのアイデアを与えるかもしれません;-)
共産主義のダック


3
また、この質問は曖昧なものです。おそらくあなたの例の1つを取り上げて、それをさらに深い質問にしてください。
テトラッド

回答:


24

誰かが「あなたはこれとあれ、これとこのスロットをパターンXを使ってやらなければならない」と言うことができるとは思えない

しかし、いくつかの有用なリソース:
Enginuity-Gamedev.netの一連のエンジン構築記事。
Game Coding Complete-私はこの本を所有しており、ゲームプログラミングのすべての(まあ、ほぼ)側面をうまく行き来しています。また、本全体にエンジンが組み込まれています。
ゲームエンジンアーキテクチャ -これは、エンジン設計に関するもう1つの素晴らしい本です。
C4エンジンレイアウト -私のコメントから引用しましたが、これはエンジンの各部分を合わせる高レベルの方法を示しています。

これらはあなたが必要とするものには少し多すぎるかもしれませんが、あなたは何かについてあまり知ることはできません。あなたはそれらから良い計画を得ると確信しています。

編集:新しいサイト以来、Gamedevの記事がアーカイブされているのを忘れていましたが、修正されました:)


Enginuityリンクが壊れていたため、記事をグーグルで検索すると、それらがWeb上にないことがわかりました。(?)本は良いリソースのように見えますが、私は常により多くのプログラミング本に目を光らせています;)
extropic-engine

また、あなたの最初のコメントに関して、私は誰もがすべてのゲームに合うマスタープランを思い付くことを期待していません。いくつかのゲームを開発する過程で、よくあるパターンがよく出てくることに気づいたので、他の人がゲームで何を使っているのかと思いました。
extropicエンジン

1
リンクを修正しました。
共産主義のダック

Enginuityの場合は+1。@chuzzumいくつかのゲームエンジンを調べて、彼らにインスピレーションを与え、自分に最適なアーキテクチャを導き出します。さらに、ゲームエンジンコンポーネントを階層化するよりもベースにする方がよい場合がよくあります。cowboyprogramming.com/ 2007/01/05 / evolve
Dave O.

1
集約する必要があるのはエンジンであり、エンティティフレームワークの部分であるとは言いません。
共産主義のダック

7

例として、私の現在のローグライクプロジェクトの構造を(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には、レンダリングループとロジックループがあります。また、キーボード/マウス入力を処理するためのループもあります。すべての要素は、親の後にレンダリングされ、キーボード/マウス入力を引き継ぐいくつかの子要素を持つことができます。これにより、たとえばサブメニュー付きのメニューを使用できます。


これで何が問題になっているのでしょうか?私にはまったく問題ないようです。
共産主義のダック

@TheCommunistDuck私が選んだ例では本当にうまくいきませんが、このコードには多くの問題があります。ResourceManagerクラスもその1つですが、私も状態に問題があります。私はそれらの大規模な拡散に陥り、多くのコードをコピーします。特にRPGでは、プレーヤーが一度に多くの選択肢を持っているため、非常に複雑な状態グラフになる可能性があります。例:呪文を唱えます。NormalState-> SelectSpellState-> SelectTargetState-> InvalidTargetState(失敗した場合)-> DoSpellAnimationState-> NormalStateから移動します。そして、それはただ一つのアクションです。
extropicエンジン

1
いやいや いいえ。いや。いいえ ああ、あなたはそれが好きではないと言ったのを待ってください。
Bartek Banachewicz

6

作成する最初の重要なポイントは、この質問に対する「良い」答えは誰もいないということです。

正しい答えに最も近いものは次のようなものです:ゲームのタイプ、ターゲットプラットフォーム、制約(時間)などに大きく依存します。

それは他の人々がどのようにこの問題に答えようとしたかを示すいくつかの本当に良い記事があることを言いました(私は過去にこれに関する情報を見つけようとしたので)。
共産主義のカモがその縁に言及したようにがゲームに関する記事にゲームアーキテクチャのいくつかの部分を理解するのに役立ちました。

私の現在のデザインは、Quake3 / Doom3のハイブリッドですと少しの.NETクラスライブラリの :)

私は2つのライブラリ(静的または動的はビルド/配信方法に依存します)とを持ってFrameworkLibraryます。

ライブラリには、ゲームソフトウェアの生産を支援するために存在するすべてのヘルパークラスが含まれていますが、この種の製品に限定されません。つまり、ゲームコード用に最適化されたリンクリストの実装がありますが、リンクリストのサービスを必要とするものなら何でも使用できます。

フレームワークは、それを呼び出したい場合の「エンジン」の根幹です。これの多くは、Quake3の設計哲学に従っています(よりオブジェクト指向の方法で)。CLIが含まれています、タイミング管理、OS固有のコード、および最終的にネットワーク層など。

これらの2つは、作成中の実際のアプリに対してリンクされます。のGameゲーム固有のコードが含まれている場合のように、。ほぼ同じ方法で、Quake3はどの「mod」が再生されているかに応じてDLLをロードします。

ここで構造のアイデアを提供するために、各libのフォルダーとコンテンツを簡単に説明します。


  • 枠組み
    • IO(スペシャリストファイル管理クラス、テキスト印刷クラス(CLIなど)、ロギングなど)
    • ネットワーク
      • クライアント(フレームワークが「ゲームをプレイ/接続している人」と見なすものを表すクラス)
      • サーバー(フレームワークへの接続を管理し、プレーヤーを管理するクラス)
    • プラットフォーム(キーボード/マウス/コントローラー処理クラス、getTime()などのOS固有のルーチン)
    • システム(エラーメッセージの印刷を支援するエラークラス、タイミングクラス、CLI自体などの非常に低レベルのクラス)
    • レンダラー(自明)

  • としょうかん
    • コレクション(データのコレクション、リンクリスト/ハッシュテーブルなどを表すクラス)
    • 数学(ベクトルや行列などの基本的な数学ヘルパークラス)

HTH!あなたにいくつかのポインタを与える必要があります...



-3

考慮事項

  • 通常、オブジェクト指向言語にはファーストクラスの関数がないか、すべてのデータがオブジェクト(Javaの整数や浮動小数点数)ではないため、問題があります。設計パターンは、これらの問題をいくつかのパターンで解決します。一般に、コーディングが高速で、それらを実行できる言語(ファーストクラスオブジェクト)を使用するのが容易です。たとえば、Python(オブジェクト指向設計も可能)では、速度が遅くなります。
  • 少なくともAIへのイベント計算
  • ロジックを整理し、事前条件と事後条件を使用して少なくともコードをテストします
  • エージェント、Quakeエンティティを見る
  • リレーショナルデータベース、データを保存する強力な方法

良いデザイン

  • ER図を作成する
  • 正しくする
  • データベース、オブジェクト、またはデータ構造を作成します

データはプログラミングの鍵です。データを適切に設計する場合、通常はアルゴリズムからアルゴリズムが出現します(行列式の計算など、数値アルゴリズムを数えない場合)。


-1この答えは非常に曖昧でわかりにくいためです。リレーショナルデータベースは、OOエンジンとはまったく関係ありません。英語はあなたの第一言語ではないことは理解できますが、最初の段落であなたが何を意味するのか説明してもらえますか?矛盾しているようです(オブジェクト指向言語には問題がありますが、デザインパターンを持つ言語でプログラミングする方が簡単です。デザインパターンはほとんど常にオブジェクト指向構造ですが)。
共産主義のダック

@duck Contradictory?OOには他の言語にはない問題があり、DPはそれらを解決しますc2.com/cgi/wiki?DesignPatternsInDynamicProgrammingを参照してください。
user712092

@Duck 1)C ++でSQLを使用できます2)ERからオブジェクトの属性を推測できます(推奨されるプラクティスではありませんが)3)リレーションから構造子をデータ化できます(これはリストです。要素を自由に並べ替える必要があるためです)高速な検索が必要なため、これはハッシュです)
-user712092

@Duck申し訳ありませんが、注文し直して間違えました。「DPはXYに簡単だ」と主張したくはありませんでしたが、「一流の言語は...」です。:)
user712092

はい、関数型言語には利点があるかもしれません。ただし、公平にさえ、私はオブジェクト指向のアプローチがgamedevの観点から論理的に理にかなっていると感じています。また、リレーショナルデータベースが必要な理由はどこにもありません。確かに、彼らは役に立つことができます。ただし、どこでも必要なコンポーネントにはなりません。
共産主義者ダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.