2012-03-11 77 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; 
    } 
}