我正在尝试设计一种基于组件的实体系统,以供学习(以及以后在某些游戏中使用),并且在更新实体状态时遇到了一些麻烦。
我不想在组件内部使用update()方法来防止组件之间的依赖关系。
我目前要记住的是,组件保存数据,而系统更新组件。
因此,如果我有一个简单的2D游戏,其中包含一些具有“变形”,“运动”,“状态”,“动画”和“渲染”组件的实体(例如玩家,敌人1,敌人2),我认为我应该拥有:
- 一个MovementSystem,用于移动所有Movement组件并更新State组件
- 还有一个RenderSystem,用于为每个状态更新Animation组件(animation组件应具有一个动画(即一组帧/纹理),并对其进行更新意味着选择与当前状态相对应的动画(例如,jumping,moving_left等),以及更新框架索引)。然后,RenderSystem使用与每个实体的Animation的当前帧相对应的纹理更新Render组件,并将所有内容呈现在屏幕上。
我已经看到了一些像Artemis框架的实现,但是我不知道如何解决这种情况:
假设我的游戏包含以下实体。每个实体都有一组状态和每个状态一个动画:
- 播放器:“ idle”,“ moving_right”,“ jumping”
- 敌人1:“上移”,“下移”
- 敌人2:“向左移动”,“向右移动”
为了更新每个实体的当前状态,最常用的方法是什么?我唯一能想到的就是为每个实体组分别具有单独的系统以及单独的State和Animation组件,因此我将拥有PlayerState,PlayerAnimation,Enemy1State,Enemy1Animation ... PlayerMovementSystem,PlayerRenderingSystem ...但我认为这很不好解决方案并打破了拥有基于组件的系统的目的。
如您所见,我在这里很迷路,因此非常感谢您的帮助。
编辑:我认为使这项工作如我所愿的解决方案是:
使statecomponent和animationcomponent具有足够的通用性,可用于所有实体。它们包含的数据将成为修改诸如播放动画或可用状态之类的修改器。–字节56
现在,我试图弄清楚如何设计这两个通用组件,以便我可以重用它们。可以为每个状态(例如,步行,跑步...)设置UID并将动画存储在地图中并由该标识符作为键的AnimationComponent中吗?
statecomponent
并animationcomponent
足以用于所有实体。它们包含的数据将成为修改诸如播放动画或可用状态之类的修改器。