sf::Sprites 拥有他们的位置和轮换的原因是什么?弄乱了我的 Component/Entity/System

What is the reasoning behind sf::Sprites owning their position and rotation? It's muddling up my Component/Entity/System

我正在使用 C++ 中的 SFML 对 Asteroids 进行基本实现,以练习使用组件实体系统框架。

从概念上讲,玩家飞船、漂浮的小行星等对象共享公共 'components'(例如图形组件、速度组件和 orientation/positional 组件)是有意义的。这使关注点分开并具有一系列好处。

然而,在 SFML 中,精灵被渲染到只有他们知道的固定位置!这立即意味着我的图形组件和 orientation/positional 组件必须组合或必须相互了解,这与组件-实体-系统方法的整体思想背道而驰。另一方面,在 SDL 中,您可以轻松地将纹理渲染到从任何地方构建的单独矩形。

我的问题是:为什么 SFML 中的 Sprites 会保留它们自己的位置信息,背后一定有一些具体的原因 - 这个原因是什么?也许如果我更好地理解这一点,我可以形成一个很好的解决方案。

SFML 遵循面向对象的设计。 sf::Sprite 模拟一个可见的东西,它有一个纹理和一个转换。因此,与 OOD 一样,它同时拥有这两个属性。

这直接与 ECS 设计不一致,ECS 设计力图通过不让实体持有任何东西来将其从内到外翻转过来。您将无法真正将 sf::Sprite class 集成到您的设计中——它根本上是不兼容的。您能做的最好的事情就是在显示时创建一个临时 sf::Sprite,当您收集了所有需要的数据时。

至于 SDL...好吧,与 SFML 不同,它只是一个低级图形 API(以及其他)。它不会尝试建模任何东西:获取纹理,将其拍打在帧缓冲区上,仅此而已。两种截然不同的工具,实现截然不同的目标。

sf::Sprite class 基本上是一种以易于使用的方式快速绘制精灵的方法。

对于更高级的用例,它们不一定是最好的,主要是因为它们相当慢(因为它们是非批处理的)。

sf::Sprite 主要面向那些希望在屏幕上轻松获得 sprite 而无需过多担心实现细节的人(其他 sf::Drawable 派生的 classes)。

您应该做的是实现您自己的存储颜色、纹理和 UV 坐标的可绘制或可视组件。像这样的东西:

struct DrawableComponent {
    sf::Color color;
    sf::Texture *texture;
    sf::IntRect uv;
}

当然可以有更多选项或不同组件的其他方法(例如矢量图形与纹理四边形)。

然后,在绘制时,遍历所有具有相同纹理且可以批处理的实体,并将它们的顶点放入 std::vectorsf::VertexArray 中,并使用它们进行快速、批处理渲染。