我为我的游戏(C++)编写了一个实体组件系统。然后我重构了我的渲染系统以使用 Entities / RenderComponents 而不是一些虚拟的可绘制界面。它们是一些类,我认为强迫它们成为一个组件没有太大意义。其中一类是地图。
我的地图类由平铺地形类和一些其他数据(不重要)组成。平铺地形类以(目前)TiledTerrainLayer
类的形式管理多个图层。在重构渲染系统之前,我只是继承自该类Drawable
,Transformable
并使该类能够被渲染系统绘制。现在它需要是一个至少有 aTransformComponent
和 some的实体RenderComponent
。
现在,TiledTerrainLayerRenderComponent
应该真的只拥有顶点和纹理的引用,也许还有一个标志是否已经创建。然后,TiledTerrainComponent
他们将拥有瓷砖 indecies 列表以及瓷砖和地图大小。
现在我的问题是,当我设置一个图块时(使用类似SetTile(size_t tileIndex, const Position & pos)
方法的东西,我还必须更新顶点数组的纹理坐标。
我通常对一个需要另一个组件的组件很好。例如,SpriteRenderComponent
需要一个TransformComponent
并且我也可以使用一个组件访问另一个组件的信息。例如,GetBoundingBox() 方法使用变换组件的位置。
我要避免的是两个组件相互“交叉引用”,就像TiledTerrainComponent
(TTC) 和TiledTerrainRenderComponent
. (TTRC)(TTRC 获取 TTC 的 tileIndexList 来创建自己,并且在调用其 SetTile() 方法时,TTC 调用 TTRC 的 UpdateVertices() 方法。
最后,我知道组件应该主要是数据。我只添加了直接获取或修改该数据的方法,例如 SetTile() 或 GetTexture()。在上述情况下,系统是否可行?如果可行,它会是什么样子?