質問させて頂きます
現在専門学校でC++で3Dのゲーム制作を行っているのですがクラスのアルゴリズムについて悩んでいます
現在、開発中のゲームには以下のクラスがあります
jikiクラス 自機の移動やステージ(壁、床)との当たり判定
enemyクラス 敵の移動やステージ(壁、床)との当たり判定
stageクラス ステージ上でのイベントを管理
cameraクラス カメラの注視点や座標を設定
このクラス達の間である特定の情報だけを他のクラスに渡して処理をしていきたいと思っています
例えば、「ステージのこの場所で自機が範囲内に入ったらこのイベントを起こす」という処理ならばstageクラスはjikiクラスの持っている自機の現在位置の情報を持っていないとだめだと考えています
自機の移動やその方向も今のところカメラの注視点と位置情報を頼りに動かしている構造なので
jikiクラスはcameraクラスの持っている注視点座標と位置座標の情報が必要です
今のところは素直にヘッダファイルをインクルードし、オブジェクトを宣言したりして情報を扱っているのですが、
「メンバ変数を1,2個他で使うだけなのにわざわざインクルードやオブジェクト宣言するのはちょっと……」と
思っています
何か最善の策はないでしょうか?
ちなみに先生からのアドバイスは
「いっそのこと、4つのクラスをグローバル変数としてオブジェクトを宣言する」
「クラス間の橋渡しだけをする専用のクラスを作る」
でした
クラス同士の橋渡し
Re: クラス同士の橋渡し
ソースファイルa.cppでクラスBに含まれる機能を使う場合,a.cppではBが定義されているヘッダファイルをインクルードしなければならないのは,C++を使う以上仕方のないことだと思います.
この質問だけでは様々な用語の意味が曖昧です.現状のソースファイルを簡略化したソースファイルを示していただけたら,具体的な議論ができると思います.
この質問だけでは様々な用語の意味が曖昧です.現状のソースファイルを簡略化したソースファイルを示していただけたら,具体的な議論ができると思います.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: クラス同士の橋渡し
メンバ変数を直接見せている設計自体が問題な気もしますので、当たり判定用の座標クラスに集めた方が良いんじゃないでしょうか?
それ以上は情報だけだはなんとも言えないです。
それ以上は情報だけだはなんとも言えないです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: クラス同士の橋渡し
まあ参考になるかどうかは微妙ですが・・・
僕の場合は、「橋渡しクラスを作る」ことで解決しています。つまりどういうことかというと、
まずその橋渡しクラス――ここでは"Scene"とします――を作ります。
このクラスは自機・敵などゲーム中すべてのデータを掌握していて、順次メンバのupdate関数を呼んでやることで実際の処理が進行します。
でメンバの方は、
感じで、他のクラスのデータが必要になったりしたらSceneの関数を通じてデータを入手します。あとはEnemyなども同様の設計にします。
で、こういうタイプの設計を考える上で大事なのは「いかにSceneの関数を減らし、JikiやEnemyそれぞれでどれだけ完結させられるか」だと勝手に思っています。実際どうすれば最適、というのはゲームによっても変わってくるので一概には言えませんが、少なくとも最初におっしゃったクラス設計ではまずいと思われます。もっと試行錯誤する必要がありそうです。
長文すいません。しかもかなり微妙な・・・どうでしょうかね?
僕の場合は、「橋渡しクラスを作る」ことで解決しています。つまりどういうことかというと、
まずその橋渡しクラス――ここでは"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 = カメラデータ;
}
でメンバの方は、
//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の関数を減らし、JikiやEnemyそれぞれでどれだけ完結させられるか」だと勝手に思っています。実際どうすれば最適、というのはゲームによっても変わってくるので一概には言えませんが、少なくとも最初におっしゃったクラス設計ではまずいと思われます。もっと試行錯誤する必要がありそうです。
長文すいません。しかもかなり微妙な・・・どうでしょうかね?
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】
Re: クラス同士の橋渡し
Mediatorパターンを使う…とか
http://www.geocities.jp/ky_webid/design ... n/020.html
http://www.geocities.jp/ky_webid/design ... n/020.html
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK