[英]SFML drawing elements of vector of pointers
這是我程序的結構:
class Game
{
public:
unsigned int progressFlags;
sf::RenderWindow appWindow;
Screen* currentScreen;
Game(const unsigned int& width, const unsigned int& height,
const unsigned int& bitsPerPixel, const std::string& windowName);
~Game();
void drawScreen();
};
游戲包含一個屏幕,該屏幕定義為:
class Screen
{
public:
std::vector<sf::Drawable*> sceneElements;
sf::Sprite backgroundSprite;
Screen();
virtual ~Screen();
protected:
sf::Texture backgroundTexture;
};
std :: vector scene的元素是從屏幕收集的,如下所示:
sceneElements.push_back(&backgroundSprite);
最后,我嘗試使用一種簡單的方法繪制所有圖形對象:
void Game::drawScreen()
{
for (unsigned int i = 0; i < currentScreen->sceneElements.size(); i++)
appWindow.draw(*currentScreen->sceneElements(i));
}
但是appWindow.draw()失敗。 我認為這與取消引用指針有關(我不記得一些基本的c ++知識),但是我不知道如何解決它。 我將不勝感激任何幫助。
我只是從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
。 使用繼承,可以避免此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.