2

ゲームがあります。ゲーム自体がクラスです。

ゲームには、デバッグ情報を表示する専用の行がいくつかあります。

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 の変数を宣言する必要があることに気付きました...正直なところ、これらはゲームとはあまり関係がなく、ゲームのデバッグと関係があります...そのため、ゲーム変数の非常に膨大なリストがさらに大きくなりました...

このすべての後、私の質問は次のとおりです。

ゲームクラスで使用されているすべての変数にアクセスできるデバッグ関連のセットが必要な場合、皆さんはどうしますか。

ゲームクラスの友達にしますか?

唇を噛んで、すべてのクラスをデバッグ コンストラクターに渡すだけですか?

どこからでもアクセスできるように、マウス、キーボード、画面、およびグラフィックスをグローバルに宣言していますか? アイテムを監視する必要があるため、デバッグが難しくなるとは思いません。

一種の「その他」クラスを作成し、奇妙なファンキーな雑多なものをすべてデバッグのようにバッチ処理しますか

多くのパスを通過することになるクラスへの参照のセットとして機能するクラスを作成しますか? ビューポートとデバッグ クラスに必要な特定のものを渡す代わりに、ゲーム コンストラクターからの参照を保持する作成するクラスである「参照」を渡すだけですか?

他の人が何をしているのかわからないだけで、自分のやり方にコミットするのが難しくなっていますか?

4

1 に答える 1

2

描画コードは、「デバッグ文字列」を構築する方法を知っているべきではありません。あなたが望むのは、モデルとビューの分離です。

たとえば、レンダリング エンジンの一部となるデバッグ情報を画面に出力する専用のメソッドを用意します。その関数は、おそらくゲームエンジンから何らかの種類を呼び出しGetDebugInfo()ます。これは、すべてのモジュールから必要なすべての情報を取得し、文字列をフォーマットする Debug オブジェクトへの呼び出しでそれをプッシュし、情報で必要なことを行い、適切なデバッグ情報をゲーム エンジンに送信します。次に、ゲーム エンジンはデバッグ文字列をインターフェイスに返します。インターフェイスは、まったく解釈せずに描画します。

また、Debug オブジェクトにプッシュする情報はできるだけ柔軟にする必要があることも付け加えておきます。たとえば、プロパティのハッシュ マップを使用したい場合があります。これは最善の方法 (ハッシュ マップ) ではないかもしれませんが、プロパティをその値にマッピングするさまざまな方法を検討することをお勧めします (浮動小数点と文字列値がある場合はどうしますか?)。このようにして、Debug オブジェクトは、処理したいプロパティを参照するかどうかを確認でき、関数呼び出しでパラメータが重くなることはありません。オブジェクト (またはコレクション、マップなど) を渡すだけで、Debug オブジェクトによって処理されます。

system sequence diagramここでは視覚的に簡単に説明します。

デバッグ情報の取得

于 2013-05-18T19:27:23.373 に答える