クラス同士の橋渡し

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

クラス同士の橋渡し

#1

投稿記事 by korokoro » 7年前

質問させて頂きます

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

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

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

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

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


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


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

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

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

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: クラス同士の橋渡し

#2

投稿記事 by beatle » 7年前

ソースファイルa.cppでクラスBに含まれる機能を使う場合,a.cppではBが定義されているヘッダファイルをインクルードしなければならないのは,C++を使う以上仕方のないことだと思います.

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

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

Re: クラス同士の橋渡し

#3

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

メンバ変数を直接見せている設計自体が問題な気もしますので、当たり判定用の座標クラスに集めた方が良いんじゃないでしょうか?
それ以上は情報だけだはなんとも言えないです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
SUE
記事: 41
登録日時: 8年前

Re: クラス同士の橋渡し

#4

投稿記事 by SUE » 7年前

まあ参考になるかどうかは微妙ですが・・・

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

まずその橋渡しクラス――ここでは"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それぞれでどれだけ完結させられるか」だと勝手に思っています。実際どうすれば最適、というのはゲームによっても変わってくるので一概には言えませんが、少なくとも最初におっしゃったクラス設計ではまずいと思われます。もっと試行錯誤する必要がありそうです。

長文すいません。しかもかなり微妙な・・・どうでしょうかね?
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

アバター
nullptr
記事: 239
登録日時: 8年前

Re: クラス同士の橋渡し

#5

投稿記事 by nullptr » 7年前

Mediatorパターンを使う…とか
http://www.geocities.jp/ky_webid/design ... n/020.html
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

閉鎖

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