我正在研究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;
}
答案 0 :(得分: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的情况下维护类型检查,你已经在示例代码中进行了这种操作。
答案 1 :(得分:0)
您的问题似乎是您在实施过程中尝试过于通用。这引入了两个可能的失败点:在“in”一侧,你可能在你的Body的BaseObject中加载不是Body的一个BaseObject,在“out”一侧,你的gameObject可以返回一个不是Body的对象一个Body(当前实现显然是类型安全的事实并非如此)。
你知道,无论你什么时候调用本质上是真正的泛型getter,你需要它返回一个特定类型的对象(因为你将调用它上面的方法),所以为什么不通过只需要明确的getter和setter来让生活变得更轻松?
或者你可以完全荒谬和泛化您的BaseObject,如:
gameObject.has(Body).callMethod('setVelocity').to(5);
答案 2 :(得分:0)
我们在项目中做了同样的事情。但我们有另一个approuch。我们的ObjectUtility中有一个实用程序类。该方法返回特定根对象下的所有对象。
public function collectObjectsByType(object:Object, type:Class, results:Array):void
{
}
我可以只显示方法struct。