问题:
我知道这个问题已经被问过很多次了,但我没有找到任何好的答案。
所以我已经为我的游戏准备了一些实体,现在检查碰撞的最佳方法是什么?
Links:
游戏(已完结)
代码解释:
我有一个世界级的实体列表:
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
这是当前的 intersects 方法:
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
目前 intersects 方法始终返回 true。但为什么?
执行此操作的经典方法是让每个实体关联一个形状边界框,然后在形状上使用 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());
}
然后,您需要为要检查碰撞的每个实体设置一个边界框。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)