c++ - sf::Sprites 拥有自己的位置和旋转背后的原因是什么?它混淆了我的组件/实体/系统

标签 c++ sdl sfml

我正在使用 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::vectorsf::VertexArray并使用它们进行快速、批量渲染。

关于c++ - sf::Sprites 拥有自己的位置和旋转背后的原因是什么?它混淆了我的组件/实体/系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41481760/

相关文章:

c++ - Doxygen:防止由于前向声明和模板造成重复

C++ 和 C++11 类静态成员,double 应该使用 "constexpr"而 int 可以是 "const",为什么?

c++ - Go 可以在页面级别使用内存吗?

c++ - glReadPixels 从错误的位置读取

c++ - SDL 和绑定(bind)缓冲区

c++ - SDL_事件e;传递给函数

c++ - 不支持的编译器

c++ - 调用移动构造函数时

c++ - 错误 : "expected a type specifier"

c++ - 在 SFML 中,时钟有限制吗?