0

我正在开发一个简单的平台游戏,并且在最终找到迄今为止尽可能稳定的解决方案之前,我已经经历了几个碰撞系统。直到玩家与一个在 y 轴上的 CENTER 位置等于 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)

块宽度 = 3

块高度 = 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

如果有人能对卡车在这里发生的事情有所了解,那就太棒了。感谢您的阅读,我可以向任何感兴趣的人提供任何进一步的信息或来源。

马里奥斯·卡洛格鲁

解决方案:

我找到了一个快速而肮脏的解决方法来解决我的问题。我只是简单地将播放器向上移动了 0.001 个单位,这实际上分离了对象。奇怪的是,因为其他块工作正常。再次感谢您通读,我希望我的解决方案可以帮助任何有类似问题的人。

4

0 回答 0