SFML наследник sf::Sprite не рендерится

У меня есть наследник класса sf::Sprite и он без проблем отрисовывается если я создаю его в main. Однако, когда я пытаюся создать его в другом классе и рисовать несколько штук примерно так:

for (auto c : controller.objects) {
    Window.draw(c);
}

(где objects это вектор), то рендер не дает результата. При том, это не проблема белого квадрата, квадрата вообще нет

Как это решить?


Ответы (1 шт):

Автор решения: VladimirS

Думаю, дело в том, что у Вашего класса не определён ни конструктор копирования, ни то, что такого конструктора нет, а в данном случае, по логике, должен вызываться именно такой конструктор (если 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 является именно ссылкой на тот или иной объект в контейнере - его адресом, а вовсе не новым объектом того же типа).

→ Ссылка