SFML наследник sf::Sprite не рендерится
У меня есть наследник класса sf::Sprite и он без проблем отрисовывается если я создаю его в main. Однако, когда я пытаюся создать его в другом классе и рисовать несколько штук примерно так:
for (auto c : controller.objects) {
Window.draw(c);
}
(где objects это вектор), то рендер не дает результата. При том, это не проблема белого квадрата, квадрата вообще нет
Как это решить?
Ответы (1 шт):
Думаю, дело в том, что у Вашего класса не определён ни конструктор копирования, ни то, что такого конструктора нет, а в данном случае, по логике, должен вызываться именно такой конструктор (если controller.objects это std::vector<наследников sf::Sprite>):
for (auto c : controller.objects) {
Window.draw(c);
}
Т.е. в коде for (auto c : controller.objects) Вы создаёте не ссылки/указатели на существующие спрайты, а какие-то неинициализированные спрайты, которые, естественно, не имеют ни текстуры, ни прямоугольника - именно поэтому их невозможно отрисовать - как любой свежесозданный sf::Sprite. Попробуйте такой код:
sf::RenderWindow window;
sf::Sprite sprite;
int main(int argc, char* argv[]){
window.create(sf::VideoMode(800, 600), "SFML OpenGL"));
window.clear();
window.draw(sprite);
window.display();
return 0;
}
Думаю, Вы увидите ровно то же самое - SFML ничего не нарисует (потому, что спрайт не инициализирован: без текстуры).
Если я прав в том, что controller.objects это std::vector<наследников sf::Sprite>, то заменив for (auto c : controller.objects) на for (auto &c : controller.objects) (обратите внимание на ссылку: auto &c, вместо копии переменной как у Вас auto c!) - Вы получите что-то более адекватное - вроде отрисовки Вашего класса-наследника sf::Sprite.
Ещё раз, сравните 2 варианта:
Вариант 1
for (auto c : container)
...
Вариант 2
for (auto &c : container)
...
Варианты 1 и 2 не тождественны: в 1м варианте !!!копируются!!! элементы (т.е. создаются новые объекты конструктором копирования) из container в переменную c, а во 2м варианте - создаются ссылки на элементы в container-е, в виде переменной c (т.е. c является именно ссылкой на тот или иной объект в контейнере - его адресом, а вовсе не новым объектом того же типа).