从外部

时间:2015-09-13 17:49:21

标签: c++ c++11 sfml

tl / dr:我已经将一个函数调用从一个类内部移到了一个类之外,并且该函数停止了工作。

我在一年左右的时间里遇到了最令人困惑的问题,我一直在使用c ++。我找不到任何可以解释这里发生的事情但事实上我甚至很难解决搜索引擎优化问题。

这里的基本操作相当简单,

  1. 创建一个sf :: Texture和sf :: Sprite对象
  2. 将纹理加载到sf :: Texture对象
  3. 将sf :: Sprite的纹理设置为纹理对象
  4. 显示sf :: Sprite
  5. 所有4个步骤在一个函数中都很好,但是因为我的目标是构建一个游戏引擎,所以我开始将它封装到更大的类中。

    我创建了一个GameEngine类,让它处理第4步。经过一些修正后,这种情况很顺利。

    然后我创建了一个GameObject类来处理前三个步骤,然后我只需要做一个用户'框架是创建对象并告诉它渲染,这也有效。

    然后当我将第二步的函数调用从对象的构造函数移动到对象外部时,我遇到了障碍。

    旧情况:     class GameObject     {         ObjectType d_type;         GameEngine * d_engine;

        sf::Texture d_texture;
        sf::Sprite d_sprite;
        bool isactive;
        public:
            GameObject(GameEngine *engine, ObjectType type);
    
            void addtexture(std::string textpath);
    
            void render();
    

    GameObject::GameObject(GameEngine *engine, ObjectType type)
    :
        d_type(type),
        d_engine(engine),
        d_texture(),
        d_sprite(),
    isactive{false}
    {
        addtexture("textures//MenuBackGround.png"); //<- problematic line
        d_sprite.setTexture(d_texture);
    }
    
    void GameObject::addtexture(std::string textpath)
    {
        if(!d_texture.loadFromFile(textpath))
        {
            cout << "couldn't load texture in\n";
        } else
        {
            cout << "did load texture\n";
        }
    }
    

    这个工作,我看到我在窗口中创建的纹理。如果我现在创建一个类Loadingscreen:

    class Loading_Screen : public Base_State
    {
        std::vector<GameObject> d_backgrounds;
    
        public:
            Loading_Screen(GameEngine *engine);
            virtual ~Loading_Screen();
    

    实施:

    Loading_Screen::Loading_Screen(GameEngine *engine)
    {
        GameObject temp(engine, ObjectType::BACKGROUND);
        d_backgrounds.push_back(temp);
        temp.addtexture("textures//MenuBackGround.png");
    }
    

    我只看到黑屏。但在这两种情况下,我都会收到纹理已加载的消息。

1 个答案:

答案 0 :(得分:0)

假设您实际渲染了d_backgrounds,我认为错误就在这里:

Loading_Screen::Loading_Screen(GameEngine *engine)
{
    GameObject temp(engine, ObjectType::BACKGROUND);
    d_backgrounds.push_back(temp);
    temp.addtexture("textures//MenuBackGround.png");
}

您正在创建GameObject对象。然后将它的副本插入到容器中,稍后您尝试addtexture的内容与插入的对象不同。

试试这个:

Loading_Screen::Loading_Screen(GameEngine *engine)
{
    GameObject temp(engine, ObjectType::BACKGROUND);
    temp.addtexture("textures//MenuBackGround.png");
    d_backgrounds.push_back(temp);
}

查看SFML api,TextureSprite都有正确的拷贝构造函数,所以它应该是这样的。