Текстура SFML не загружается при вызове функции-члена класса извне

tl/dr: я переместил вызов функции изнутри класса наружу, и функция перестала работать.

Я столкнулся с самой сложной проблемой года или около того, я работал с C++. Я не могу найти ничего, чтобы объяснить, что здесь происходит, но, честно говоря, мне трудно даже сформулировать вопрос SEO.

базовая операция здесь довольно проста,

  1. создать объект sf::Texture и sf::Sprite
  2. Загрузите текстуру в объект sf::Texture
  3. установить текстуру sf::Sprite для объекта текстуры
  4. отобразить sf::Sprite

все 4 шага прошли нормально в одной функции, но, поскольку моей целью было создание игрового движка, я начал инкапсулировать его в более крупные классы.

Я создал класс GameEngine и позволил ему обработать шаг 4. После некоторых исправлений все прошло хорошо.

затем я создал класс GameObject для обработки первых трех шагов, и все, что мне нужно было сделать в качестве "пользователя" фреймворка, - создать объект и сказать ему, чтобы он отображался, это также сработало.

Затем я столкнулся с трудностью, когда переместил вызов функции для шага 2. из конструктора объекта наружу объекта.

старая ситуация: класс 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 ответ

Предполагая, что вы на самом деле визуализируете 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);
}

Глядя на API SFML, Texture а также Sprite иметь оба правильных конструктора копирования, так что все должно быть в порядке.

Другие вопросы по тегам