Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从外部调用封装类成员函数时未加载SFML纹理_C++_C++11_Sfml - Fatal编程技术网

C++ 从外部调用封装类成员函数时未加载SFML纹理

C++ 从外部调用封装类成员函数时未加载SFML纹理,c++,c++11,sfml,C++,C++11,Sfml,tl/dr:我将一个函数调用从类内部移动到类外部,函数停止工作 我已经遇到了一年左右的最令人困惑的问题,我一直在用C++工作。我找不到任何东西来解释这里发生了什么,但老实说,我甚至很难制定一个SEO问题 这里的基本操作相当简单 创建sf::纹理和sf::精灵对象 将纹理加载到sf::texture对象 将sf::Sprite的纹理设置为纹理对象 显示sf::Sprite 在一个函数中,所有4个步骤都很顺利,但因为我的目标是构建一个游戏引擎,所以我开始将其封装到更大的类中 我创建了一个GameEn

tl/dr:我将一个函数调用从类内部移动到类外部,函数停止工作

我已经遇到了一年左右的最令人困惑的问题,我一直在用C++工作。我找不到任何东西来解释这里发生了什么,但老实说,我甚至很难制定一个SEO问题

这里的基本操作相当简单

  • 创建sf::纹理和sf::精灵对象
  • 将纹理加载到sf::texture对象
  • 将sf::Sprite的纹理设置为纹理对象
  • 显示sf::Sprite
  • 在一个函数中,所有4个步骤都很顺利,但因为我的目标是构建一个游戏引擎,所以我开始将其封装到更大的类中

    我创建了一个GameEngine类并让它处理步骤4。经过一些修正后,进展顺利

    然后我创建了一个GameObject类来处理前三个步骤,作为框架的“用户”,我所要做的就是创建对象并告诉它进行渲染,这也很有效

    然后,当我移动步骤2的函数调用时,遇到了一个障碍。从对象的构造函数到对象的外部

    旧情况: 类游戏对象 { 对象类型d_类型; 游戏引擎*d_引擎

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


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

    假设您实际渲染的是d_背景,我认为错误在这里:

    Loading_Screen::Loading_Screen(GameEngine *engine)
    {
        GameObject temp(engine, ObjectType::BACKGROUND);
        d_backgrounds.push_back(temp);
        temp.addtexture("textures//MenuBackGround.png");
    }
    
    您正在创建一个
    GameObject
    对象。然后将其副本插入容器中,您稍后尝试添加纹理的对象与插入的对象不同

    试试这个:

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

    看看SFML api,
    Texture
    Sprite
    都有合适的复制构造函数,所以这样应该没问题。

    不,这不起作用,同时我自己也在玩它,试图让d_背景成为指针向量,这很遗憾并没有解决问题。就像我说的,我唯一需要做的事情就是从工作变为不工作的更改是调用addtexture函数的位置的更改,在这两种情况下渲染都是以相同的方式完成的。无论如何,这是错误的。您在传递对象的副本时没有初始化纹理。尝试使用指针时,是否添加了如下对象?GameObject*tmp=new GameObject(…);temp->addtexture(…);d_背景。向后推(temp);我目前还没有想到SFML api,但可能是精灵和作为对象和复制构造函数的纹理弄乱了。我将sf::texture和sf::sprite更改为游戏对象的指针,从而消除了在处理游戏对象时可能发生的任何复制。谢谢您的时间。
    Loading_Screen::Loading_Screen(GameEngine *engine)
    {
        GameObject temp(engine, ObjectType::BACKGROUND);
        d_backgrounds.push_back(temp);
        temp.addtexture("textures//MenuBackGround.png");
    }
    
    Loading_Screen::Loading_Screen(GameEngine *engine)
    {
        GameObject temp(engine, ObjectType::BACKGROUND);
        d_backgrounds.push_back(temp);
        temp.addtexture("textures//MenuBackGround.png");
    }
    
    Loading_Screen::Loading_Screen(GameEngine *engine)
    {
        GameObject temp(engine, ObjectType::BACKGROUND);
        temp.addtexture("textures//MenuBackGround.png");
        d_backgrounds.push_back(temp);
    }