前にこちらで質問させていただき、一度組んだコードを指導していただきました。
今回は、見よう見まねで自分で組んでみました。オブジェクト指向を目指しています。
この設計は良さそうに見えるかという点と、組んでいる間に出てきた疑問点をお伺いしたいです。
一部分だけへの回答でも大丈夫です。よろしくお願いします。
3/21 10:00前:図を書きなおして差し替えました
3/21 21:45前:TileIndexerを忘れていたのでクラス図を差し替えました 何度もごめんなさい
■シーケンス図
本「ゲームプログラマになる前に覚えておきたい技術」で出てきたやり方を真似しました。
今はこの部分をそこまで重要視していませんが、一応貼っておきます。
■クラス図
クラス図だけでオブジェクト指向になっているかどうか分かるものなのでしょうか。
依存関係にある場合は、オブジェクトの生成時に依存先のオブジェクトの参照を渡しています。
ActorManager以下はまだまだ書いている途中です。
ここまででどうでしょうか?! 結構手応えがあるのですが!!
■出てきた疑問
1.列挙体 EPoint をグローバル領域に公開している: int型の引数を指定するのに楽なため
これは悪手ですか。
enum EPoint{
LEFT_UP, // etc.
}
class A{
void ( int, int, int*, int*, int ); // 5つ目はEPoint.LEFT_UPのようにして指定する
};
struct Cell
{
int layer[3]; // 【警告】マジックナンバ タイル番号を格納
bool isPassable; // isPassableをタイルからセットする関数が必要
};
これは悪手でしょうか。
// MapDrawer.cpp
Cell &cell = mMapData.GetCell( xi, yi );
for( int i = 0; i < allLayerNum; i++ ){
int handle = mTile.GetTileGraph( cell.layer[i] );
DrawGraph( drawX, drawY, handle, TRUE);
}
ISLeさんのおっしゃるGameContextがどういうものか僕は分かっていませんが、
離れているオブジェクト同士を結び付ける? ためのものだと思います。
僕は、オブジェクトを持っているGameParentから、直接の参照をもらうようにしています。
例えばPlayクラスでは、
// GameParent *parentを引数でもらってある
e.g. parent->GetMapScaleManager.GetCellSize( 引数 );
これも悪手なのでしょうか。
4.シングルトンはコピペするもの?
僕は、DxLibの館のシングルトンのコードをコピーしては、
コンストラクタや型の名前をシングルトンにするクラスの名前に書き換えています。
例えば継承するだけで使えるような、スマートで速いシングルトンはあるものでしょうか。
5.シングルトンでグローバル変数
は悪手なのでしょうか。
僕がシングルトンにしたのは以下のオブジェクトです。
・Input // キーボード、ゲームパッド、マウス
・GameWindow // ウィンドウサイズ
6.Get系とSet系のインターフェースを分けたくなった
他の場合ではSet系の関数は見えない方がいい、という場面があると思います。
例としては悪いのですが
// シングルトン
class GameWindow
{
public:
static GameWindow *Inst(){
static GameWindow inst;
return &inst;
};
void GetWindowSize( int *width, int *height );
void SetWindowSize( int width, int height ); // 【警告】これが公開されても良い?
private:
int mWindowWidth, mWindowHeight;
// 封印
GameWindow(){} // default
GameWindow( const GameWindow& r ){} // copy
GameWindow& operator=( const GameWindow& r ){} // 代入演算子
};
今のところゲーム起動時だけです。
他の場合はGet系の関数しか使えない方がいいと思います。
何が良い方法だと思われますか。
シングルトンの例は一度忘れて…
僕が思いついた対策方法は、SetterとGetterでインターフェースを分けて、
実装クラスはSetterとGetterクラスを両方継承するというものです。
Getterのインターフェースのポインタを引数にもらえば、
インターフェースを制限できると思いました。
この方法は悪手でしょうか。
よろしくお願いいたします。
追記:
7.参照ではNULLを返せない?
返すべきものが無かった場合はどうしたらいいのでしょうか。
NULLでも返したいのならば、ポインタを返すべきなのでしょうか。