代码之家  ›  专栏  ›  技术社区  ›  Tesserex

基于组件的系统中的有效通信

  •  2
  • Tesserex  · 技术社区  · 14 年前

    是的,这是关于我的游戏引擎的另一个问题,它是 coming along very nicely 非常感谢你们。

    所以,如果你看了视频(或者没有),游戏中的对象是由各种各样的组件组成的,比如位置、精灵、移动、碰撞、声音、健康等等。我为实体和组件之间的“告诉”类型的通信定义了几种消息类型,但这只到目前为止。有很多时候我只需要问一些事情,比如一个实体的位置。

    我的代码中有几十行看起来像这样:

    SomeComponent comp = (SomeComponent)entity.GetComponent(typeof(SomeComponent));
    if (comp != null) comp.GetSomething();
    

    我知道这很难看,而且我知道铸件有一股不合适的OO设计的味道。但尽管事情很复杂,但似乎没有更好的方法。我当然可以“硬编码”我的组件类型

    SomeComponent comp = entity.GetSomeComponent();
    

    但这似乎是一种逃避,一种糟糕的逃避。

    我在写这篇文章的时候,在用这种方法编写了几个月没有解决方案的代码之后,我真的意识到一个泛型将帮助我。

    SomeComponent comp = entity.GetComponent<SomeComponent>();
    

    真是太神奇了。无论如何,这仍然只是语义上的改进。我的问题还在。

    1. 这真的有那么糟糕吗?
    2. 什么是更好的选择?
    3 回复  |  直到 14 年前
        1
  •  0
  •   Dave Swersky    14 年前

    在不了解游戏总体设计的情况下,很难单独知道该模式是好是坏。如果它运行良好,那么唯一可能反对它的论点就是体系结构——它会扩展吗?

        2
  •  0
  •   liquorice    14 年前

    我一直在研究一个游戏,我使用通用类型参数以相同的方式查找不同的组件。我是从 http://t-machine.org/index.php/2010/05/09/entity-system-1-javaandroid/ . 我不确定这是最好的方法,感觉像是对仿制药系统的滥用。不过,这是可行的。

        3
  •  0
  •   Adam    14 年前

    你为什么认为这很糟糕?

    这就是仿制药的用途。