C++ シューティングゲーム オブジェクト指向について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Saula

C++ シューティングゲーム オブジェクト指向について

#1

投稿記事 by Saula » 13年前

はじめまして。現在「龍神録プログラミングの館」「新・ゲームプログラミングの館」を参考に
シューティングゲームの作成に取り組んでいます。
OSはWindows 7 Home Premium ( 64 bit )、Visual C++ 2008 Express Editionを使用しています。
C++の知識としては、「新・ゲームプログラミングの館」の内容を一通り理解した上でコーディングできる程度です。

今回ゲームを作成するにあたって、オブジェクト指向の勉強も進めようと思い
自機のクラスMyShip、敵機のクラスEnemy等、ゲーム本体に登場させるキャラクターを作成し、それぞれに初期化・計算・描画等の処理を持たせました。
今回質問したいのは、画像や音楽の扱い方に関してです。

今のところ、画像ハンドルを保持するクラスを作成し、画像の種類ごとに以下のような変数を持たせています。
privateには各種ハンドルを、publicにはそのハンドルを返す関数を入れています。
<Graph.h>

コード:

class CGraph{
private:
	int Mover[MOVER_TYPE][MOVER_NUM][ANIMATION];	//Moverの画像ハンドル
	int Effect[IMG_EFFECT][COLORTYPE];	//エフェクトの
	int Board[IMG_BOARD];				//ボードの
	int BG[IMG_BG];						//背景の
	int Other[IMG_OTHER];				//その他の

public:
	CGraph();						//コンストラクタ
	//画像ハンドルを返す関数
	int GetMover(int, int, int);	//[種類][番号][アニメーション]
	int GetEffect(int, int);		//[番号][色]
	int GetBoard(int);				//[番号]
	int GetBG(int);					//[番号]
	int GetOther(int);				//[番号]
};
コンストラクタで

コード:

LoadDivGraph("./img/char/myship.png", 12, 4, 3, 64, 64, Mover[0][0]);
のように画像を読み込んでいます。

また、先述した各種クラスは画像ハンドルを保持しておらず、「描画処理」の部分で

コード:

//[x座標][y座標][拡大率][角度][画像ハンドル][透過]
DrawRotaGraph((int)x, (int)y, scale, 0, Graph1->GetMover(mover_type, img_num, img_type), TRUE);
という風に、CGraphクラスのGraph1から、画像ハンドルを直接与えるようにしています。

これは、オブジェクト指向としては誤った作成方法でしょうか。
また、もし誤っているのならば、各種画像ハンドルはいつ、どのようなタイミングで作成すべきなのでしょうか。
また、音楽ファイルについても同様の形で作っているのですが、同様の悩みを抱えております。

初めての書き込みのため至らぬ点は多いかと思いますが、どうぞご教示のほどよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++ シューティングゲーム オブジェクト指向について

#2

投稿記事 by softya(ソフト屋) » 13年前

特に別に問題ないと思います。
「龍神録プログラミングの館」の最後にDixqさんのC++版の設計例があるので参考にしてみてください。

ところで、CGraphはシングルトンでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: C++ シューティングゲーム オブジェクト指向について

#3

投稿記事 by ISLe » 13年前

オブジェクト指向的に正しいかどうかは分かりませんが、わたしも同じようにします。

ただ、わたしはすべてを通して連番を振って、インターフェースというかメソッドはひとつにしてしまいます。
複数の画像をまとめて描画するとかアニメーションまでモジュール側で管理してたりするからですけど。

Saula

Re: C++ シューティングゲーム オブジェクト指向について

#4

投稿記事 by Saula » 13年前

softya(ソフト屋)さん、ISLeさん、返信ありがとうございます。
設計として誤っているものではない、ということで安心しました。
画像自体はこのまま現在のように読み込ませておいて、
MyShip等のクラスが自分でハンドルを持つかどうかは、コーディングしながら考えていこうと思います。

>softoya(ソフト屋)さん
CGraphはシングルトンにはしておりません。
「プロジェクトに1つしかないことを保証すべきクラスはシングルトンにすべき」だったでしょうか。
まだ小規模なものしか作成していないため、クラス継承等をまだ使いこなせていない自分では
困難さが増えてしまうだけのように思ってしまいます。
全体の設計を拙いながらも見直して、シングルトンにすべきクラスを見極めたいと思います。
難しそうだから、と避けていては上達はありませんもの。ご指摘、ありがとうございます。

>ISleさん 
「すべてを通して連番を振る」というのはつまり

コード:

int Mover[MOVER_TYPE][MOVER_NUM][ANIMATION];	//Moverの画像ハンドル
int Effect[IMG_EFFECT][COLORTYPE];	//エフェクト
//(以下略)
・・・と分けず、1種類の変数で保持するということでしょうか。
もしそうであれば、例えばキャラクターは12種類のアニメーションを持ち、ショット画像は色で分け・・・という風に
画像ハンドルを与えるのが難しいと思うのですが、どうすればよいのでしょうか。
既にこのトピックのタイトルとは関係ないことになってしまっているかもしれませんので、問題あれば新たにトピックを立て直そうと思います。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: C++ シューティングゲーム オブジェクト指向について

#5

投稿記事 by ISLe » 13年前

Saula さんが書きました:・・・と分けず、1種類の変数で保持するということでしょうか。
もしそうであれば、例えばキャラクターは12種類のアニメーションを持ち、ショット画像は色で分け・・・という風に
画像ハンドルを与えるのが難しいと思うのですが、どうすればよいのでしょうか。
既にこのトピックのタイトルとは関係ないことになってしまっているかもしれませんので、問題あれば新たにトピックを立て直そうと思います。
そういうことです。
最終的に同一ステージに出てくるキャラクタの画像をまとめたりもするので、画像ハンドルと一対一と決め付けることができないのです。
画像内のどの部分をどの(相対)位置に描画するというテーブルデータを用意しておいて、キャラクターごとに振ったIDやアニメーションカウンタを元にテーブル参照するという形をとります。

そうすると画像ハンドルはゲームアプリのレイヤーからは直接見えない、ワンクッション先の管理対象です。
そこでは、このステージではこれとこれとこれの画像をあらかじめ読み込んでおく必要があるといった感じの管理の仕方になります。

開発の初期段階では細かいファイルごとに分けて修正を入れて、完成が近付いたらまとめる、という場合でも、テーブルデータを変更しますがキャラクターごとに振ったIDは変わらないのでゲームのメインのコードには影響が出ません。

Saula

Re: C++ シューティングゲーム オブジェクト指向について

#6

投稿記事 by Saula » 13年前

ISLe さんが書きました: そういうことです。
最終的に同一ステージに出てくるキャラクタの画像をまとめたりもするので、画像ハンドルと一対一と決め付けることができないのです。
画像内のどの部分をどの(相対)位置に描画するというテーブルデータを用意しておいて、キャラクターごとに振ったIDやアニメーションカウンタを元にテーブル参照するという形をとります。

そうすると画像ハンドルはゲームアプリのレイヤーからは直接見えない、ワンクッション先の管理対象です。
そこでは、このステージではこれとこれとこれの画像をあらかじめ読み込んでおく必要があるといった感じの管理の仕方になります。

開発の初期段階では細かいファイルごとに分けて修正を入れて、完成が近付いたらまとめる、という場合でも、テーブルデータを変更しますがキャラクターごとに振ったIDは変わらないのでゲームのメインのコードには影響が出ません。
つまり、最終的には複数の画像ファイルをひとつの巨大なファイルにしてしまう、ということですか?
画像の読み込みを行うときには

コード:

int handle[12];
LoadDivGraph("img.png", 12, 4, 3, 64, 64, handle);
という風にするはずなので、そのような解釈になったのですが。
まだ私の力量ではぴんとこないところではあるのですが、一口に画像を扱うと言っても様々な方法があるのですね。勉強になりました。
今回のところはいったん解決としておこうと思います。
それでは回答をくださったお二方、このたびはありがとうございました。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: C++ シューティングゲーム オブジェクト指向について

#7

投稿記事 by ISLe » 13年前

DXライブラリで言えばDrawRectGraphとか使います。

そういう点ではDXライブラリは制約が多いですね。
そのおかげで扱い易くなっているわけですが。

閉鎖

“C言語何でも質問掲示板” へ戻る