我正在研究一个简单的平台游戏,我已经经历了几个碰撞系统,最终找到了迄今为止我所希望的稳定解决方案。这是直到玩家与其在y轴上的中心位置等于0的块发生碰撞。虽然我怀疑它只在y轴上,因为我先检查x移动/碰撞,但它非常奇怪。我不知道。
我做一个简单的AABB类型碰撞检查/响应,其中我先应用x速度然后重叠,重新定位播放器,使右边的玩家绑定=左边的块绑定使它们不重叠。然后,我用y轴进行相同的操作,让玩家垂直方向判断玩家是否击中了挡块的底边或顶边。唯一的控制是跳跃,因为玩家的加速力为正x,因此玩家将永远不会向左移动。
问题是玩家离开蓝色虚线块但是当它击中红色虚线时,在Y轴上检测到碰撞,因此玩家从重叠向上移动但是当下一帧执行玩家的速度时像往常一样添加x,但是碰撞被记录,然后将玩家定位在红色块的左侧。下一帧检测到与蓝色块的碰撞,因此它将玩家置于其顶部,如下所示。
下面的设置使玩家将此序列循环到
的信息:
player.centerPosition =(2,2)
player.width = 0.5f
player.height = 0.8f
blueBlock.centerPosition =(1,1)
redBlock.centerPosition =(4,0)
block.width = 3
block.height = 1
private void checkBlockCollision(float deltaTime) {
List<GameObject> colliders = grid.getPotentialColliders(player);
int len = colliders.size();
for (int axis=0;axis<2;axis++) { // 0 = X-axis, 1 = Y-axis
if (axis == 0) {
player.position.add(player.velocity.x*deltaTime, 0);
player.updateBounds();
} else {
player.position.add(0, player.velocity.y*deltaTime);
player.updateBounds();
}
for (int i=0;i<len;i++) { // Cycle through all blocks found in broad phase
GameObject collider = colliders.get(i);
if (OverlapTester.overlapRectangles(player.bounds, collider.bounds)) {
if (axis == 0) {
player.position.x = collider.position.x - (Player.PLAYER_WIDTH + collider.bounds.width)/2;
player.velocity.x = 0f;
Log.d("TAG", "Move player LEFT");
} else {
if (player.velocity.y > 0) {
player.position.y = collider.position.y - (Player.PLAYER_HEIGHT + collider.bounds.height)/2;
player.velocity.y = -player.velocity.y*0.333f;
Log.d("TAG", "Move player DOWN");
} else {
player.position.y = collider.position.y + (Player.PLAYER_HEIGHT + collider.bounds.height)/2;
player.velocity.y = 0;
player.state = Player.PLAYER_STATE_GROUNDED;
Log.d("TAG", "Move player UP");
}
}
}
} // end for loop colliders
} // end for loop axis
} // END METHOD
如果有人能够了解卡车在这里发生的事情,那将是惊人的。 感谢阅读,我可以向任何感兴趣的人提供任何进一步的信息或来源。
Marios Kalogerou
解决方案:
我找到了一个快速而又脏的修复我的问题。我只是简单地将玩家移动了0.001个单位,这实际上将对象分开了。很奇怪,因为其他块工作正常。再次感谢您阅读,我希望我的解决方案可以帮助任何有类似问题的人。