Текстура SFML не загружается при вызове функции-члена класса извне
tl/dr: я переместил вызов функции изнутри класса наружу, и функция перестала работать.
Я столкнулся с самой сложной проблемой года или около того, я работал с C++. Я не могу найти ничего, чтобы объяснить, что здесь происходит, но, честно говоря, мне трудно даже сформулировать вопрос SEO.
базовая операция здесь довольно проста,
- создать объект sf::Texture и sf::Sprite
- Загрузите текстуру в объект sf::Texture
- установить текстуру sf::Sprite для объекта текстуры
- отобразить 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
иметь оба правильных конструктора копирования, так что все должно быть в порядке.