【问题标题】:How to manage SFML rendering, the "signals" way?如何管理 SFML 渲染,“信号”方式?
【发布时间】:2011-03-14 11:40:13
【问题描述】:

我正在开发一个用 C++ 编写并使用 SFML 2D 库的小蛇游戏。问题是:为了渲染一个窗口并在其中打印任何内容,您必须通过

while (App->IsOpened())
{
    //Do the stuff
    App->Clear();
    App->Display();
}

但是,我想以更通用的方式构建我的程序,这将使我能够只初始化窗口,然后向它发送信号,例如其中的“RenderARect”或“ClearTheWindow”,从 while 语句之外。它可以让我将我的渲染类实例用作动态库,例如,使游戏代码和渲染代码成为两个不同且独立的东西......

您对如何在我的 SFML 程序中实施这样的信号系统有什么建议吗?

PS:我听说过 libsigc++,但不知道如何实现它...

谢谢!

【问题讨论】:

    标签: c++ signals signals-slots sfml


    【解决方案1】:

    没有必要发送这样的信号。一切都应该在那个 while 循环(主循环)中处理,并且每一帧都应该被清除,并单独和整体绘制,而不是在区域中,因此 SFML 使用 OpenGL。

    将游戏逻辑与主循环分开的最明显方法是使游戏面向对象。 当然,它只会将其分离为单独的逻辑单元,在单独的文件中,但它们将在同一个循环中“一起”运行。我认为这是期望(但至少可以接受)的行为。

    因此,您将拥有一个 Game 类,该类将具有一个 Update() 方法。这是游戏逻辑发生的地方,事件被处理(最好在调用之前查询事件,并作为参数传递给 Update()),并更新所有必须显示的状态。 您应该在主循环的每次迭代中调用它。

    该类还将有一个 Render() 方法,该方法将根据需要绘制所有内容。

    所以它看起来像这样:

    while (App->IsOpened())
    {
        Game->Update();
        App->Clear();
        Game->Render();
        App->Display();
    }

    P.S.:对不起,我的英语不好,希望你能理解。

    【讨论】:

    • 感谢您的帮助,但实际上,我确实需要用信号系统来实现它。我的游戏类必须与许多图形库兼容,将它们作为动态库加载。所以,我需要我的游戏类能够以通用方式调用更新、清除等,而无需费心……这样,我可以轻松实现 Qt 或 GtkMM。我可以制作像 Current = game->Init(); 这样的东西当前->更新();当前->清除();
    • 哦,那你真的应该使用 libsigc++。抱歉,这个库我不能帮你,因为我不是很熟悉。
    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 2018-10-14
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多