C# 向实体/组件系统添加功能

C# 向实体/组件系统添加功能,c#,xna,C#,Xna,我正试图用C#从头开始编写自己的实体/组件系统,我一直在思考在哪里/如何实现一些功能 编辑:我知道了如何添加Move()和Jump()等函数 我可以将它们添加到集合中,如下所示: KeyboardController kbController = entityManager.GetComponent<KeyboardController(1); kbController.KeyBindings.Add(Keys.Right, new Dictionary<KeyStateES, Ac

我正试图用C#从头开始编写自己的实体/组件系统,我一直在思考在哪里/如何实现一些功能

编辑:我知道了如何添加Move()和Jump()等函数

我可以将它们添加到集合中,如下所示:

KeyboardController kbController = entityManager.GetComponent<KeyboardController(1);
kbController.KeyBindings.Add(Keys.Right, new Dictionary<KeyStateES, Action<EntityManager, int>());
kbController.KeyBindings[Keys.Right].Add(KeyStateES.Held, Actions.MoveUp);

KeyboardController kbController=entityManager.GetComponent使用特定组件更改
X
Y
实体的坐标后,只需重新绘制场景,
Entity
将显示在新位置。问题究竟出在哪里


您有一个
实体
,该实体可以通过(例如)
位置组件
旋转组件
缩放组件
纹理组件
等任何可能的方式进行转换,但具有简单的
重绘()
方法,该方法将场景中的所有
实体在每个实体的当前状态下呈现为可见的平锥体

关于这些高级行为的类型树怎么样?:例如,给定一个对象,一个跳转类将知道如何使其跳转。如果有足够的通用性,则可以从Move中派生出Jump等。更复杂的行为将由更简单的行为组成。

这就是我目前所拥有的,因为呈现组件非常简单。所有您需要的是纹理和位置组件和实体将自动绘制。更改X或Y将反映在下一次绘制调用中。问题是在何处实现Move()调用。@Kittoes:如果需要单个
Move()
调用,请在负责渲染的类中定义它。因此,move将接受通用的
实体
类和
移动组件
,使用它们将对
实体
应用转换并重新渲染场景。当move()与实际渲染没有任何关系时,为什么要在渲染系统中定义move()方法?我在想,我可以像一个“动作系统”或“动作系统”,但我不确定这是一个理想的举动,它只解决了一个问题。另一个问题是,我不知道如何将Move()命令绑定到OP中描述的Up键。@Kittoes:好的,如果您设计的动作库可以应用于单个或
实体的集合
,则可以在一些(比如)转换
类中完成,其中
Move()
已定义。向键盘绑定添加
操作
。在这种特定情况下,它将是
Move
function,在其他情况下,它将是
Transform
type中的一些其他函数。好的,我已经设置了一些测试方法,如果它们没有参数,我可以让它们启动。问题是,我需要各种可能有多个参数的方法,我希望所有这些方法都在同一个集合中。我可以这样做吗?问题不是Move()或Jump()的具体实现,而是在代码中放置此功能的位置。创建一个移动类,甚至是一个移动组件都不会真正起作用。创建一个处理任何动作/移动的系统是有意义的,但这仍然只能解决功能在何处实现的问题。例如,如何将它绑定到一个键的问题仍然存在。也许我不明白——为什么移动类不起作用?逻辑可能在Move类中实现,该类将在处理任何业务规则后调整它正在移动的实体的位置。我一直在做这类事情,通过将抽象的操作逻辑与它们所作用的抽象对象隔离开来,它工作得很好。听起来你也有同样的问题,不是吗?因为在这种体系结构中,使用Move类没有任何意义,因为你只需要Move方法。您正在处理的数据已经存在于Position组件类中,您希望直接处理该组件的数据。体系结构的重点是由各种组件组成的实体,这些组件与系统一起作用。移动属于哪个系统?答案可能根本不是一个系统。我想我可以创建一个静态的动作类,其中包含MoveUp、MoveLeft等的逻辑。是的,在我看来,您的顶级分类法可能不够丰富。实体和系统过于粗糙,不允许对不同元素进行足够健壮的分类。(我只能在这里猜测,因为我不完全理解您要做的事情——但是将动作建模为不同于它们所作用的项目的东西是一种非常常见的习惯用法,我认为如果您不尝试强制将所有内容都整合到实体和系统之间预先存在的分离中,它可以解决您的问题。我还应该提到我不是在说“弄乱组件的数据”。当然,组件可以用合理的规则保护其位置,同时允许动作组件移动,是吗?想象一个视频游戏:通常有一些动作类知道如何使某物反弹。你可以让它们反弹一个球,或故事中的一个角色,或是反弹有意义的其他元素。They不关心它们反弹的对象类型,对象必须允许这个外部类调整其位置。否则,所有东西都必须有自己的反弹逻辑。
KeyboardController kbController = entityManager.GetComponent<KeyboardController(1);
kbController.KeyBindings.Add(Keys.Right, new Dictionary<KeyStateES, Action<EntityManager, int>());
kbController.KeyBindings[Keys.Right].Add(KeyStateES.Held, Actions.MoveUp);