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(用于实际绘制到屏幕部分)类引用传递给调试,以便调试类将它们输出到屏幕。

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 的变量......老实说,这与我的游戏无关,它们与调试我的游戏有关......所以我庞大的游戏变量列表变得越来越大......

毕竟我的问题是:

如果您想要一组可以访问游戏类中使用的所有变量的调试相关的东西,你们会怎么做。

你让它成为游戏类的朋友吗?

您是否只是咬紧牙关继续将所有类传递给调试构造函数?

您是否在全局范围内声明您的鼠标、键盘、屏幕和图形,以便您可以在任何地方访问它们?我认为不是因为您需要观看该项目,因此调试起来更加困难。

您是否创建了一种“其他”类并将所有奇怪的时髦杂项批量放入其中,例如 Debug

您是否创建了一个类来作为对最终通过很多的类的一组引用......?这样我就不需要将我需要的特定内容传递给我的视口和调试类,而是通过“引用”,这是我将创建的一个类,它包含来自我的游戏构造函数的引用?

我只是不知道其他人在做什么,并且越来越难以致力于我的做事方法?

4

1 回答 1

2

您的绘图代码不应该知道如何构建“调试字符串”。你想要的是模型和视图的分离。

例如,有一个专门用于将调试信息输出到屏幕的方法,该方法将成为渲染引擎的一部分。然后,该函数可能会从您的游戏引擎中调用某种类型,GetDebugInfo()然后从所有模块中提取所有必要的信息,并通过调用 Debug 对象将其推送,该对象将格式化字符串,对信息执行任何操作并返回适当的调试信息到游戏引擎。然后游戏引擎将调试字符串返回给界面,界面只是绘制它,根本没有任何解释。

我还想补充一点,您推送到 Debug 对象的信息应该尽可能灵活,因此您可能希望使用属性的哈希映射,例如。这可能不是最好的方法(哈希映射),但我鼓励您查看将属性映射到它们的值的不同方法(如果您有浮点和字符串值,您会怎么做?)。这样,Debug 对象可以查看或不查看它想要处理的属性,并且不会使函数调用中的参数更重。您只需传递一个对象(或集合、映射等),它就会由 Debug 对象处理。

这是一个简单system sequence diagram的可视化。

获取调试信息

于 2013-05-18T19:27:23.373 回答