我正在使用 C++ 中的 SFML 制作 Asteroids 的基本实现,以练习使用组件实体系统框架。
从概念上讲,玩家飞船、漂浮的小行星等对象共享公共(public)“组件”(例如图形组件、速度组件和方向/位置组件)是有意义的。这使关注点分开并具有一系列好处。
然而,在 SFML 中, Sprite 被渲染到只有他们知道的固定位置!这立即意味着我的图形组件和方向/位置组件必须组合或必须相互了解,这与组件实体系统方法的整体思想背道而驰。另一方面,在 SDL 中,您可以轻松地将纹理渲染到从任何地方构建的单独矩形。
我的问题是:为什么 SFML 中的 Sprites 会保留它们自己的位置信息,背后必须有一些具体的推理 - 这个推理是什么?也许如果我更好地理解这一点,我可以形成一个好的解决方案。
最佳答案
sf::Sprite
类基本上是一种以易于使用的方式快速绘制 Sprite 的方法。
它们不一定是更高级用例的最佳选择,主要是因为它们相当慢(因为它们是非批处理的)。
sf::Sprite
主要面向那些希望在屏幕上轻松获得 Sprite 而不用担心太多实现细节的人(其他 sf::Drawable
派生的也是如此)类)。
您应该做的是实现您自己的可绘制或可视化组件,以存储颜色、纹理和 UV 坐标。 Mabye 是这样的:
struct DrawableComponent {
sf::Color color;
sf::Texture *texture;
sf::IntRect uv;
}
当然可以有更多选项或不同组件的其他方法(例如 vector 图形与纹理四边形)。
然后,在绘制时,遍历所有具有相同纹理的实体,这些实体可以被批处理,并将它们的顶点放入 std::vector
或 sf::VertexArray
并使用它们进行快速、批量渲染。
关于c++ - sf::Sprites 拥有自己的位置和旋转背后的原因是什么?它混淆了我的组件/实体/系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41481760/