ゲームがあります。ゲーム自体がクラスです。
ゲームには、デバッグ情報を表示する専用の行がいくつかあります。
RECT rct;
rct.left = 10;
rct.right = 780;
rct.top = 10;
rct.bottom = screen.GetWindowHeight() - rct.top;
std::string debugStringResult;
std::stringstream debugString;
debugString << "Mouse X: " << mouse.GetMouseX() << ",\nMouse Y: " << mouse.GetMouseY() << ",\nLeft mouse down: " << mouse.LeftMouseDown() << ",\nRight mouse down: " << mouse.RightMouseDown() << ",\nScreen width: " << screen.GetScreenWidth() << ",\nScreen height: " << screen.GetScreenHeight() << "\nSystem resolution: " << screen.GetWindowWidth() << " x " << screen.GetWindowHeight();
debugStringResult = debugString.str();
font.handle->DrawText( NULL, debugStringResult.c_str(), -1, &rct, 0, font.color );
このコードは現在、ゲームの描画ループにあります。怠け者ですね:)
そのため、変数を宣言して、rct とその位置プロパティ、および "debugStringResult" と "debugString" を使用している文字列のメモリを再宣言し続けないようにします。怠惰ではありません:)
前述の変数といくつかのメソッドを使用して、Debug というクラスを作成することにしました。インスタンスを作成できるようにするには、Game クラスで変数を作成する必要があることに気付きました
Debug debug;
次に、マウス、スクリーン、および gfx (実際の画面部分への描画) クラス参照をデバッグに渡して、Debug クラスがそれらを画面に出力できるようにする必要があることに気付きました。
Game::Game( HWND hWnd, const MouseServer &mouseServer, const ScreenServer &screenServer )
: mouse( mouseServer ),
screen( screenServer ),
gfx( screen, hWnd ),
font( gfx ),
viewport( screen, gfx ),
debug( gfx, mouse, screen )
{
それからそれは私を襲います。Game クラスに Debug() という関数を作成して、rct などを含む以前のコードを保持してみませんか。しかし、ゲーム クラスで、rct、debugString、および debugResult の変数を宣言する必要があることに気付きました...正直なところ、これらはゲームとはあまり関係がなく、ゲームのデバッグと関係があります...そのため、ゲーム変数の非常に膨大なリストがさらに大きくなりました...
このすべての後、私の質問は次のとおりです。
ゲームクラスで使用されているすべての変数にアクセスできるデバッグ関連のセットが必要な場合、皆さんはどうしますか。
ゲームクラスの友達にしますか?
唇を噛んで、すべてのクラスをデバッグ コンストラクターに渡すだけですか?
どこからでもアクセスできるように、マウス、キーボード、画面、およびグラフィックスをグローバルに宣言していますか? アイテムを監視する必要があるため、デバッグが難しくなるとは思いません。
一種の「その他」クラスを作成し、奇妙なファンキーな雑多なものをすべてデバッグのようにバッチ処理しますか
多くのパスを通過することになるクラスへの参照のセットとして機能するクラスを作成しますか? ビューポートとデバッグ クラスに必要な特定のものを渡す代わりに、ゲーム コンストラクターからの参照を保持する作成するクラスである「参照」を渡すだけですか?
他の人が何をしているのかわからないだけで、自分のやり方にコミットするのが難しくなっていますか?