2012-03-11 78 views
0

在我的遊戲中,所有遊戲對象都擴展了一個實體類。所有敵方物體都有自己的類別,可以擴展敵人。敵人擴展實體。 換句話說, 實體 - >敵人 - > SharkEnemy。在列表中查找擴展某個類的對象

現在,我想有一個函數讓我測試碰撞特定的類。也就是說,如果例如我有一個子彈類,我希望它只測試與擴展敵人的實體的衝突。

我周圍的一派,這是我所:

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。

回答

2

不是檢查類的平等,使用Class.isAssignableFrom()

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; 
} 
+0

謝謝!這工作完美。 – 2012-03-12 01:00:49

0

在(T desiredType)傳球而不是一類和使用:

if (b instanceof desiredType) 
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; 
    } 
}