0

我正在 AS3 中开发基于组件的引擎,并且我在游戏对象中有一个函数,它根据它的类型返回一个组件:

gameObject.Has(Body); //This will return a reference to the gameobjects body component

我遇到的问题是访问组件。为此,我必须执行以下操作:

Body(gameObject.Has(Body)).SetVelocity(5);

有没有人有更好的方法来做到这一点?

编辑:

public function Has(type:Class):BaseComponent
{
    for each(var component:BaseComponent in m_components)
        if (component is type)
            return component;

    return null;
}
4

3 回答 3

0

您的问题似乎是您试图在实现中过于通用。这引入了两个可能的失败点:在“in”一侧,您可能会为您的 Body 加载一个 BaseObject,它不是 Body;在“out”一侧,您的 gameObject 可能会返回一个不是 Body 的对象一个 Body(当前的实现显然是类型安全的这一事实不是给定的)。

您知道,任何时候您调用本质上是一个真正通用的 getter 时,您都需要它返回特定类型的对象(因为您将在其上调用方法),所以为什么不通过让自己的生活更轻松需要显式的 getter 和 setter?

或者您可能会变得非常荒谬并将您的 BaseObject 通用化,例如:

gameObject.has(Body).callMethod('setVelocity').to(5);
于 2012-05-24T00:40:21.587 回答
0

我们在我们的项目中做同样的事情。但我们还有另一种方法。我们的 ObjectUtility 中有一个实用程序类。该方法返回特定根对象下的所有对象。

        public function collectObjectsByType(object:Object, type:Class, results:Array):void
    {

    }

我可以只显示方法结构。

于 2012-05-24T05:51:47.137 回答
0

您目前对 Has() 的返回类型有什么看法?

如果您更喜欢绕过类型检查。你可以让你的 Has() 方法返回 Object 类型。

public function Has():Object{
  ...
  return anObject;
}

#then you can call any prop/method without throwing type errors.
gameObject.Has(Body).SetVelocity(5)

但是,在不强制转换 var 的情况下,没有一种很好的方法来维护类型检查,您已经在示例代码中这样做了。

于 2012-05-23T22:18:45.630 回答