将绘图 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 对象作为成员,并将其传递给所有已创建的 World
、Battle
等 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 指针来赋予它绘制自己的能力。
我正在使用 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 对象作为成员,并将其传递给所有已创建的 World
、Battle
等 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 指针来赋予它绘制自己的能力。