这是我程序的结构:
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 ++知识),但是我不知道如何解决它。我将不胜感激。
答案 0 :(得分:2)
我只是从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
。使用继承,可以避免此问题。