ページ 11

クラス同士の橋渡し

Posted: 2012年2月01日(水) 18:42
by korokoro
質問させて頂きます

現在専門学校でC++で3Dのゲーム制作を行っているのですがクラスのアルゴリズムについて悩んでいます

現在、開発中のゲームには以下のクラスがあります

jikiクラス    自機の移動やステージ(壁、床)との当たり判定
enemyクラス   敵の移動やステージ(壁、床)との当たり判定
stageクラス   ステージ上でのイベントを管理
cameraクラス  カメラの注視点や座標を設定

このクラス達の間である特定の情報だけを他のクラスに渡して処理をしていきたいと思っています

例えば、「ステージのこの場所で自機が範囲内に入ったらこのイベントを起こす」という処理ならばstageクラスはjikiクラスの持っている自機の現在位置の情報を持っていないとだめだと考えています


自機の移動やその方向も今のところカメラの注視点と位置情報を頼りに動かしている構造なので
jikiクラスはcameraクラスの持っている注視点座標と位置座標の情報が必要です


今のところは素直にヘッダファイルをインクルードし、オブジェクトを宣言したりして情報を扱っているのですが、
「メンバ変数を1,2個他で使うだけなのにわざわざインクルードやオブジェクト宣言するのはちょっと……」と
思っています

何か最善の策はないでしょうか?

ちなみに先生からのアドバイスは
「いっそのこと、4つのクラスをグローバル変数としてオブジェクトを宣言する」
「クラス間の橋渡しだけをする専用のクラスを作る」
でした

Re: クラス同士の橋渡し

Posted: 2012年2月01日(水) 19:39
by beatle
ソースファイルa.cppでクラスBに含まれる機能を使う場合,a.cppではBが定義されているヘッダファイルをインクルードしなければならないのは,C++を使う以上仕方のないことだと思います.

この質問だけでは様々な用語の意味が曖昧です.現状のソースファイルを簡略化したソースファイルを示していただけたら,具体的な議論ができると思います.

Re: クラス同士の橋渡し

Posted: 2012年2月01日(水) 21:27
by softya(ソフト屋)
メンバ変数を直接見せている設計自体が問題な気もしますので、当たり判定用の座標クラスに集めた方が良いんじゃないでしょうか?
それ以上は情報だけだはなんとも言えないです。

Re: クラス同士の橋渡し

Posted: 2012年2月01日(水) 22:25
by SUE
まあ参考になるかどうかは微妙ですが・・・

僕の場合は、「橋渡しクラスを作る」ことで解決しています。つまりどういうことかというと、

まずその橋渡しクラス――ここでは"Scene"とします――を作ります。

コード:

//Scene.h
class Scene{
public:
	void	update();//WinMainか何かから1フレームに1回呼ばれる
	void	getCameraData( 【カメラデータの型】 *pData );//意味は後ほど
	void	setEvent( int eventNum );//これも後ほど
private:
	Jiki*	mJiki;//配列
	Enemy*	mEnemy;//配列
	【カメラデータの型】	mCamera;

	//その他データ・・・
};

//Scene.cpp
void Scene::update(){
	for( int i = 0; i < 自機の数; i++ ){
		mJiki[ i ].update( this );
	}
	for( int i = 0; i < 敵の数; i++ ){
		mEnemy[ i ].update( this );
	}

	//その他処理・・・
}

void Scene::getCameraData( 【カメラデータの型】* pData ){
    pData = カメラデータ;
}
このクラスは自機・敵などゲーム中すべてのデータを掌握していて、順次メンバのupdate関数を呼んでやることで実際の処理が進行します。
でメンバの方は、

コード:

//Jiki.h
class Jiki{
public:
	void update( Scene* pScene );
private:
	//自機に関わるデータ・・・
};


//Jiki.cpp
void Jiki::update( Scene* pScene ){

	//カメラデータが欲しくなったら
	【カメラデータの型】 data;
	pScene->getCameraData( &data );

	//イベントを発生させたくなったら
	pScene->setEvent( 255 );

	//あとは煮るなり焼くなり
	position.x = data->うんたらかんたら;
	position.y = data->うんたらかんたら;
	//みたいな
}
感じで、他のクラスのデータが必要になったりしたらSceneの関数を通じてデータを入手します。あとはEnemyなども同様の設計にします。

で、こういうタイプの設計を考える上で大事なのは「いかにSceneの関数を減らし、JikiやEnemyそれぞれでどれだけ完結させられるか」だと勝手に思っています。実際どうすれば最適、というのはゲームによっても変わってくるので一概には言えませんが、少なくとも最初におっしゃったクラス設計ではまずいと思われます。もっと試行錯誤する必要がありそうです。

長文すいません。しかもかなり微妙な・・・どうでしょうかね?

Re: クラス同士の橋渡し

Posted: 2012年2月02日(木) 08:53
by nullptr
Mediatorパターンを使う…とか
http://www.geocities.jp/ky_webid/design ... n/020.html