2012-03-11 13 views
0

私のゲームでは、すべてのゲームオブジェクトがEntityクラスを継承します。すべての敵オブジェクトには敵を拡張する独自のクラスがあります。敵はエンティティを拡張します。 つまり、 エンティティ - >敵 - >シャークエネミー。特定のクラスを拡張するリスト内のオブジェクトを見つける

ここで、特定のクラスとの衝突をテストする機能が必要です。 例えば、弾丸クラスを持っている場合、Enemyを拡張するエンティティとの衝突をテストするだけです。

私の周りGoogleで検索してきた、これは私が持っているものです。

public <T> Entity collide(Entity a, Class<T> desiredClass) 
{ 

    for (Entity b : entities) 
     if (b.getClass() == desiredClass && collide(a, b)) 
      return b; 
    return null; 
} 

私が欲しいものの一種であることが、私はそれがdesiredClassを拡張するかどうかを知る必要があり、クラスがdesiredClassは等しいない場合。代わりに、クラスの平等をチェックする

if (b instanceof desiredType) 

答えて

0

(T desiredType)を渡すのではなく、クラスと使用

public <T> Entity collide(Entity a, Class<T> desiredClass) 
{ 

    for (Entity b : entities) 
     if (desiredClass.isAssignableFrom(b.getClass()) && collide(a, b)) 
      return b; 
    return null; 
} 
1

あなたは、クラスオブジェクトを渡しているので、

for (Entity b: entities) 
{ 
    if (SharkEnemy.class.isInstance(b)...) 
0

多分、私はあなたの正確な問題を得ることはできませんが、インターフェイスと多型?私は、例えば、RTTI

のいずれかを使用せずに、より良い設計上の選択のようになります。

abstract class Entity 
{ 
    abstract boolean isCollidingWithBullet(Bullet bullet); 
    .. concrete methods .. 
} 

class Enemy extends Entity 
{ 
    boolean isCollidingWithBullet(Bullet bullet) 
    { 
    .. specific implementation 
    } 
} 

class NotEnemy extends Entity 
{ 
    boolean isCollidingWithBullet(Bullet bullet) 
    { 
    return false; 
    } 
} 
関連する問題