Я бы просто получил ваши пользовательские классы от sf::Drawable
(и, возможно, sf::Transformable
). Этот способ рисования иерархически очень прост и в основном выполняется SFML. Следующие фрагменты написаны из памяти; могут быть опечатки. :)
Вам просто нужно создать подкласс вашего Screen
класса:
class Screen : public sf::Drawable
{
public:
std::vector<sf::Drawable*> sceneElements;
sf::Sprite backgroundSprite;
Screen();
virtual ~Screen();
virtual void draw(sf::RenderTarget &rt, sf::RenderStates states) const;
protected:
sf::Texture backgroundTexture;
};
Внутри draw()
вы бы просто перебрали все свои элементы (аналогично тому, как вы уже это сделали):
void draw(sf::RenderTarget &rt, sf::RenderStates states) const
{
for (const auto &e : sceneElements)
rt.draw(*e, states);
}
Здесь мы разыменовываем один раз, чтобы получить указатель обратно на объект, который затем передается по ссылке (где остальное наследует).
Game::drawScreen()
также становится проще:
void Game::drawScreen()
{
appWindow.draw(*currentScreen);
}
Еще раз разыменование, чтобы перейти от указателя к реальному объекту (передается по ссылке).
Также обратите внимание, что ваш оригинальный дизайн нарушает инкапсуляцию, поскольку Game
должен знать, как работать с вещами, которые находятся внутри вашего Scene
. Поэтому, если вы что-то измените внутри Scene
, вам придется соответственно настроить Game
. Используя наследование, вы избегаете этой проблемы.