描画の設計 (基礎設計)
描画の設計はハードウェア、OS、プログラム言語により大きく異なるもので、更に2D、3Dゲームによりアプローチが変ります。
今回からしばらくの間はこれらを抽象化したレベルの設計(つまり共通で検討できる内容)を説明し、その後に別カテゴリにて言語別に説明ができれば良いなと思っています。
【流れ】
本カテゴリー
「ゲームプログラミング [共通] 」
にて概要設計を説明。
↓
別カテゴリー
2D→「ゲームプログラミング [Java] 」
3D→「ゲームプログラミング [XNA] 」
にて具体的な設計を説明。
という感じでしょうか。
◇ ◇ ◇
さて、抽象化レベルでの描画の設計というで、どのように検討すべきかを考えると、まず描画というのは、
・なにかしらのイメージを画面に表示する。
・イメージを表示する場所は演算の結果(タスク処理の結果)を元に表示する。
・内容によっては表示しなくても良いものがある。
・描画するものはできるだけ一括で描画した方が理解しやすいし効率が良い。
という事柄があると考えられます。
この事から2008/01/04にてイメージで表わしたように、

タスク(集合)処理の後に描画処理を行うのがと良いと考えます。
そして前回「キャラクタータスクに描画属性を持たせた設計」にて説明したとおり、描画属性を持つキャラクタークラスから派生したクラス(タスク)のみを描画対象とし、そのクラスが持つ描画情報を描画するという設計を行えば良いと考えます。
次に一括で描画する仕様を考案するのですが、単純にタスク集合の配列を走査してキャラクタークラスより派生したタスクを順番に描画するという考え方もあるのですが、これだとタスクが配列に登録された順番となり、優先順位を持つことができません。

※これは特に2Dのゲーム描画の際に如実に発生します。
3Dの場合はZソート、Zバッファの考え方があるので、このイメージとは考え方が異ります。
これをタスク集合の配列の登録順序を変更して実現を行うという仕組みを検討する方法もあるのですが、できるだけタスク処理と描画処理とは関係を切り離したいことから、描画専用の配列を用意すると関係を切り離すことができます。
この配列を実現した場合、配列への登録タイミングと抹消タイミングは、タスクの登録、抹消タイミングと同じで構わなく、タスクの実行中などに任意に順序を切り替えることができる仕組みを導入します。
これをイメージすると以下のような設計になります。

タスクの登録はJavaやC#の言語にある「関数のオーバーロード」として作成すると、シームレスに登録が実装できます。
この例では、タスク管理クラスのaddメソッドにより、キャラクタータスククラスより派生していないタスククラスは「タスクの登録」のメソッドが呼び出され、キャラクタータスククラスより派生しているタスククラスは「キャラクタータスクの登録」のメソッドが呼び出されます。
後者の場合は、タスク管理クラスの登録と同時に描画管理の配列"DrawManager"に登録されます。
このDrawManagerは描画処理時に参照され、描画対象となるタスクを描画します。
もしも描画の順序を変更したい場合はこの配列の中に登録されているタスク情報の順番を変更すれば実現が可能となります。
次回は2Dの描画処理設計をJava言語を基に説明したいと思います。
今回からしばらくの間はこれらを抽象化したレベルの設計(つまり共通で検討できる内容)を説明し、その後に別カテゴリにて言語別に説明ができれば良いなと思っています。
【流れ】
本カテゴリー
「ゲームプログラミング [共通] 」
にて概要設計を説明。
↓
別カテゴリー
2D→「ゲームプログラミング [Java] 」
3D→「ゲームプログラミング [XNA] 」
にて具体的な設計を説明。
という感じでしょうか。
◇ ◇ ◇
さて、抽象化レベルでの描画の設計というで、どのように検討すべきかを考えると、まず描画というのは、
・なにかしらのイメージを画面に表示する。
・イメージを表示する場所は演算の結果(タスク処理の結果)を元に表示する。
・内容によっては表示しなくても良いものがある。
・描画するものはできるだけ一括で描画した方が理解しやすいし効率が良い。
という事柄があると考えられます。
この事から2008/01/04にてイメージで表わしたように、

タスク(集合)処理の後に描画処理を行うのがと良いと考えます。
そして前回「キャラクタータスクに描画属性を持たせた設計」にて説明したとおり、描画属性を持つキャラクタークラスから派生したクラス(タスク)のみを描画対象とし、そのクラスが持つ描画情報を描画するという設計を行えば良いと考えます。
次に一括で描画する仕様を考案するのですが、単純にタスク集合の配列を走査してキャラクタークラスより派生したタスクを順番に描画するという考え方もあるのですが、これだとタスクが配列に登録された順番となり、優先順位を持つことができません。

※これは特に2Dのゲーム描画の際に如実に発生します。
3Dの場合はZソート、Zバッファの考え方があるので、このイメージとは考え方が異ります。
これをタスク集合の配列の登録順序を変更して実現を行うという仕組みを検討する方法もあるのですが、できるだけタスク処理と描画処理とは関係を切り離したいことから、描画専用の配列を用意すると関係を切り離すことができます。
この配列を実現した場合、配列への登録タイミングと抹消タイミングは、タスクの登録、抹消タイミングと同じで構わなく、タスクの実行中などに任意に順序を切り替えることができる仕組みを導入します。
これをイメージすると以下のような設計になります。

タスクの登録はJavaやC#の言語にある「関数のオーバーロード」として作成すると、シームレスに登録が実装できます。
単純なコーディング例(Java)
// タスク管理 // 描画管理 // タスクの登録 // キャラクタータスクの登録 } |
この例では、タスク管理クラスのaddメソッドにより、キャラクタータスククラスより派生していないタスククラスは「タスクの登録」のメソッドが呼び出され、キャラクタータスククラスより派生しているタスククラスは「キャラクタータスクの登録」のメソッドが呼び出されます。
後者の場合は、タスク管理クラスの登録と同時に描画管理の配列"DrawManager"に登録されます。
このDrawManagerは描画処理時に参照され、描画対象となるタスクを描画します。
もしも描画の順序を変更したい場合はこの配列の中に登録されているタスク情報の順番を変更すれば実現が可能となります。
次回は2Dの描画処理設計をJava言語を基に説明したいと思います。
コメント
コメントの投稿
« Sample Action Gameの紹介 [ステージ4] l Home l 昔のゲームの想い出 [0008] 「オーダイン」 [ナムコ] [1988] [アーケード] »