c++ - 指针向量的 SFML 绘图元素
问题描述
这是我的程序的结构:
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 sceneElements 的元素是从这样的屏幕中收集的:
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
相应的调整。使用继承,您可以避免这个问题。
推荐阅读
- reactjs - 使用 react useDispatch() 钩子如何重命名方法,如连接
- css - Tailwind CSS - 未应用样式
- blob - 什么是 HSQLDB 中 Oracle DB 的 empty_blob() 的计数器部分?
- angular - 使用 Fade Out 隐藏 alt 数据和 Fade In 以在 Angular 中一键加载新数据
- sql - 预计将解析从 S3 加载的雪花数据中的列时到达记录末尾
- python - 训练子模型而不是完整模型 Tensorflow Federated
- google-visualization - 谷歌饼图工具提示闪烁
- java - 正则表达式将所有标签替换为一个
- python - Python“骰子游戏”
- elasticsearch - 如何检测elasticsearch是否启用了动态字段