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

时间:2012-02-22 21:07:41

标签: c# xna

我正试图在C#中从头开始编写自己的实体/组件系统,而且我仍然坚持在哪里/如何实现某些功能。

编辑:我想出了我将如何添加Move()和Jump()等功能。

public static class Actions
{
    public static void MoveUp(EntityManager entityManager, int EGUID) {}
    public static void MoveDown(EntityManager entityManage, int EGUID {}
}

我可以将它们添加到这样的集合中:

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);

现在我可以使用键绑定轻松移动实体。但是,它仍然不太理想,因为:

  • 我无法将多个方法绑定到密钥。
  • 我被迫在InputManager类中传递Method Arguments。

这是一个问题,因为有时我会想要一个键来执行多个不相关的任务,因为我的InputManager看起来真的很愚蠢,就是传递方法参数的人。 理想情况下,我希望触发KeyDown,KeyHeld或KeyReleased事件,只有具有特定键的控制器响应事件并执行其关联的方法。

2 个答案:

答案 0 :(得分:2)

之后,您使用特定组件更改了XY坐标Entity,您只需重新绘制场景,Entity将出现在新位置。实际上问题在哪里。 ?

您有Entity以任何可能的方式转换为(例如)PositionComponentRotationComponentScalComponentTextureComponent等等,但是有一个简单的Redraw()方法,可以在每个场景的当前状态下呈现场景中的所有Entites

答案 1 :(得分:0)

关于这些高级行为的类型树怎么样?:即给定一个对象,Jump类会知道如何使它跳转。如果存在足够的共性,则可以从Move派生跳转等。然后,更复杂的行为将由更简单的行为组成。