我的游戏基本上是3D地下城探索游戏。玩家是一个长方体,它可以碰撞的一切是一个在网格中对齐的立方体。
目前,玩家可以在这个地牢中移动并且一切正常:他们可以移动,但他们也可以穿过墙壁!
每当玩家移动时(即当他们向前,向后,向左或向右按压时)都会进行碰撞处理。这是他们向前推进时的代码。
if (Gdx.input.isKeyPressed(forwardKey)) {
float totalMove = -moveVelocity; // Total directional movement amount
/* Therefore ... */ float eachMove = (totalMove / moveParts);
System.out.println(eachMove);
for (int i = 0; i < moveParts; i++) {
BoundingBox newBounds = new BoundingBox(bounds);
newBounds.set(
newBounds.min.add(0, 0, -eachMove),
newBounds.max.add(0, 0, -eachMove));
boolean done = false, willCollide = false;
for (Wall w : Main.currentLevel.getFlattenedWallsArrayList()) {
if (tryCheckCollision(newBounds, w.getBounds())) {
// Iff it will collide
willCollide = true;
done = true;
}
if (done) break;
}
if (!willCollide) {
newVelocity.z += eachMove;
}
}
}
所以这种作品,但一点也不好:你可以前进,当你遇到一堵墙时,你会停下来。然而,当你试图从墙上移回时,你不能 - 这让我相信玩家走得太远了,但是我看不出这是怎么可能的。
我碰撞时需要做的另一件事是,当有人碰到一堵墙时,他们不只是停止,如果他们看起来像那样,他们应该继续独自移动墙壁方向。
我确信这可以通过子弹物理学来实现,但我不想使用它,因为它似乎比它的价值更多的努力,因为我的世界由对齐的立方体组成。
TL; DR:我需要一些方法来编程播放器的碰撞,而不使用子弹物理。
编辑:以下是tryCheckCollision方法:
private boolean tryCheckCollision(BoundingBox checkBounds, BoundingBox collisionBounds) {
Vector3 center = Vector3.Zero.cpy();
collisionBounds.getCenter(center);
if (distanceTo(center) <= maxCollisionCheckDistance) {
return checkBounds.intersects(collisionBounds);
}
return false;
}
编辑:此外,bounds
是玩家的边界框。我使用这个来更新每一帧:
instance.calculateBoundingBox(bounds);
bounds.mul(instance.transform);