将绘图 window "deeper" 的控制权传递给程序?

Passing control of a drawing window "deeper" into a program?

我正在使用 SFML 2.3 来控制程序中的图形。我需要一个 class 才能访问 window,即使那个 class 不是最初创建 window 的那个(没有所有权) ).例如。 Battle class 需要能够绘制战斗场景并在那里操纵角色,但是 World class 需要 window 在 [=13 之前和之后=] 显示玩家在主游戏中的动作。

应该如何处理window对象?我最初的想法是让 GameMaster class 具有 window 作为静态成员。但是我认为最好检查一下通常的共识是什么,而不是错误地使用这种方法。

我意识到我总是可以将对 window 的引用传递给每个需要它的 class 但这将使所有需要操作的 classes 的构造函数window 相当臃肿。

恐怕您必须做出选择,是使用允许访问主 window 的 Singleton (GameMaster),还是传递对它的引用与您依赖的 class 对象。

我个人更喜欢后者(我不会考虑向几个 classes 添加另一个构造函数参数,因为 bloat),因为整体的灵活性class 设计会比使用 Singleton.

更好

您可以考虑将您的 World class 汇编代码外包给单独的 Factory class。这个可以将必要的主 window 对象作为成员,并将其传递给所有已创建的 WorldBattle 等 assemble [=11] 所需的实例=],分别发起游戏任务

我在第一次申请时遇到了类似的设计问题,以下是我设置程序的方式:

App.hpp

class App{
    public:
    // Constructor simply creates main window, specify context settings
    // and set position of main window to center of screen
    App(sf::VideoMode mode);
    ~App();

    // init functions for setting up windows / graphics beforehand

    // The main loop of the program, while active, run calculates the delta time
    // for game movement, handles window events for both the console and window,
    void run();

    private:
        sf::Window d_main_window; // main window for program.
        // other data ...
        // bool for main loop , etc.. etc..
};

应用程序是 window 处理程序 class,包含用于初始化任何图形 (openGL) 或设置程序的任何函数,以便它可以准备 运行 .然后主循环开始于 app.run()

ParticleContainer.hpp

class ParticleContainer {
    public:
        ParticleContainer(/* params */);
        ~ParticleContainer

        // object specific functions

        drawParticles();

    private:
        sf::Window *d_parent_window;  // window is passed into the constr
                                      // now we can draw from inside particle
        // additional params
        // vec of all particle objects
};

粒子容器对象包含指向父对象的指针 window,因此它可以将粒子绘制到屏幕上。这种设计将允许您创建能够将自身绘制到屏幕上的离散对象,从而消除一些杂乱绘制的问题 class。如果你创建一个新对象,你需要做的就是通过父 window 指针来赋予它绘制自己的能力。