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

あなたの問題は、実装で過度に一般的であろうとしているようです。これにより、2 つの障害ポイントが発生する可能性があります。Body ではない Body の BaseObject をロードする可能性がある "in" 側と、gameObject がそうでないオブジェクトを返す可能性がある "out" 側です。 Body (現在の実装が明らかに型安全であるという事実は、与えられたものではありません)。

基本的に本当にジェネリックなゲッターを呼び出すときはいつでも、特定のタイプのオブジェクトを返す必要があることを知っています (メソッドを呼び出すため)。明示的なゲッターとセッターが必要ですか?

または、まったくばかげて、次のように 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 に答える