Slick2d | 实体碰撞检测(Slick2d | Entity collision dete

2019-08-31 07:16发布

问题:

我知道这已经被问了很多次,但我没有发现任何好的答案。
所以我有一些实体为我的比赛,现在的检查冲突的最佳方式?

链接:

游戏(完)

代码解释:
我有我的世界一流的实体列表:

List<Entity> entities = new ArrayList<Entity>();
// The list in the World class

我使用此代码(仅在视野范围内)更新它们:

public void update(GameContainer gc, int delta) {
    for (int i = 0; i < entities.size(); i++) {
        entities.get(i).update(gc, delta);
    }
}
// Update entities

所以,现在我想请检查实体更新方法内部冲突。

我想这是我的更新方法:

@Override
public void update(GameContainer gc, int delta) {
    for (Entity entity : world.entities) {
        if (intersects(entity)) {
           // world.remove(this);
        }
    }
}
// The update method of an entitiy

这是当前instersects方法:

public boolean intersects(Entity entity) {
    if (entity instanceof Player) {
        // Do nothing
    } else {
        if (shape != null) {
            return this.getShape().intersects(entity.getShape());
        }
    }

    return false;
}
// The intersects method of the abstract Entity class

目前相交方法总是返回true。 但为什么?

Answer 1:

经典的方式做,这是与每个实体相关联的形状boundingBox的,然后使用Slick2d的“相交”方法上的形状:

http://www.slick2d.org/javadoc/org/newdawn/slick/geom/Shape.html#intersects(org.newdawn.slick.geom.Shape)

我相信有办法做到的精灵每个像素的检查,但如果你不需要像素级精度的边框方法更有效。

一些代码:

在实体抽象类中添加:

private Shape boundingBox;

public Shape getBoundingBox() {
  return this.boundingBox;
}

然后你相​​交的方法是:

public boolean intersects(Entity entity) {
    if (this.getBoundingBox() == null) {
        return false;
    }
    return this.getBoundingBox().intersects(entity.getBoundingBox());
}

然后,你需要设置一个边界盒要进行碰撞的每个实体。



文章来源: Slick2d | Entity collision detection
标签: java slick2d