我正在用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;
}发布于 2012-05-24 06:18:46
你现在有什么关于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-24 08:40:22
看起来你的问题是你试图在你的实现中过于通用。这引入了两个可能的失败点:在“入”端,您可能会为Body加载一个不是Body的BaseObject;在"out“端,您的gameObject可能会返回一个不是Body的对象(当前实现显然是类型安全的这一事实并不是已知的)。
您知道,当您调用本质上是真正泛型的getter时,您需要它返回特定类型的对象(因为您将在它上面调用方法),所以为什么不只需要显式的getter和setter来简化您的工作呢?
或者你可以让变得完全可笑,并将你的BaseObject泛化为:
gameObject.has(Body).callMethod('setVelocity').to(5);发布于 2012-05-24 13:51:47
我们在我们的项目中也在做同样的事情。但我们有另一种方法。我们的ObjectUtility中有一个实用程序类。该方法返回特定根对象下的所有对象。
public function collectObjectsByType(object:Object, type:Class, results:Array):void
{
}我可以只展示方法结构。
https://stackoverflow.com/questions/10728421
复制相似问题