因此,我一直在尝试使用指向结构的共享指针来保存程序中可以在状态机的状态之间共享的所有数据。
struct GameData
{
StateMachine machine;
sf::RenderWindow window;
AssetManager assets;
InputManger input;
const int x = 1;
};
typedef std::shared_ptr<GameData> GameDataRef;这是一个仅在共享数据资源之间提供接口的文件。称为GameData.cpp
GameDataRef _data = std::make_shared<GameData>();在我的game.cpp文件中,如果我理解正确的话,make_shared会创建对象并将名为_data的shared_ptr分配给它。
StateRef _splash = std::make_unique<State_Splash>(_data);这是创建游戏开始时的基本状态的代码行。除了将共享指针作为参数之外,不要关心其他任何部分。
GameDataRef _data;我在State_Splash.cpp中创建了另一个名为_data的共享指针
State_Splash::State_Splash(GameDataRef GDR) : _data(GDR)在构造函数中,我(忘记了后面的术语: here)
std::cout << _data->x;这会将0输出到控制台,即使x在结构中定义为1。我之所以运行此测试,是因为当我试图在State_Splash.cpp中引用sprite时,加载到Game.cpp中的_data->assets中的纹理超出了范围(空白白屏)。
我的问题是,我是不是在共享指针方面做错了什么?或者,有没有更好的方法来为整个程序创建一些共享资源库?
发布于 2017-08-05 16:15:54
或者有没有更好的方法来为整个程序创建一些共享资源库?
单身人士的名声不好。其中很多都来自于C++11之前的时代,当时很难把它们写对。C++11使它们变得安全。它也是一个全局对象--所以它受到关于全局变量的所有考虑。除非它们能让你的程序变得更好,否则应该避免它们。
单例在游戏应用程序中工作得很好。我只是创建了像GameContext singleton这样的东西,而忘记了共享指针。您的游戏数据在设计上是全局的。
然而,如果你的代码被设计成有多个这样的对象,那么单例就不适合你了。
发布于 2017-08-05 16:50:14
任何类型的单例或全局都会破坏组合和可测试性。对于这样的事情,几乎从来没有一个好的理由。
最好使用依赖注入。然后,您可以仅使用依赖关系的模型来测试游戏的组件。
#include <vector>
struct StateMachine{};
namespace sf { struct RenderWindow {}; }
struct AssetManager {};
struct InputManager {};
struct GameData
{
StateMachine machine;
sf::RenderWindow window;
AssetManager assets;
InputManager input;
const int x = 1;
};
struct action {};
std::vector<action> checkInputs(InputManager&);
void runGame(GameData& gameData)
{
while (1) {
auto inputActions = checkInputs(gameData.input);
}
}
int main()
{
GameData gameData;
runGame(gameData);
}https://stackoverflow.com/questions/45519274
复制相似问题