AS3更智能的类型定义

时间:2012-05-23 21:52:49

标签: actionscript-3 game-engine

我正在研究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;
}

3 个答案:

答案 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。