Android 基于平铺的碰撞效果非常好,但对位置为.y==0的块除外

Android 基于平铺的碰撞效果非常好,但对位置为.y==0的块除外,android,collision-detection,Android,Collision Detection,我正在开发一个简单的平台,在最终找到解决方案之前,我已经经历了几个碰撞系统,到目前为止,这个解决方案已经达到了我所希望的稳定状态。直到玩家与y轴中心位置等于0的块碰撞。虽然我怀疑它只在y轴上,但它非常奇怪,因为我首先检查了x移动/碰撞。我不知道 我做一个简单的AABB类型碰撞检查/响应,首先应用x速度,然后如果重叠,重新定位玩家,使右玩家边界=左方块边界,使他们脱离重叠。然后,我用y轴沿球员的垂直方向通过相同的计算,以确定球员是击中了方块的底部还是顶部。唯一的控制是跳跃,因为玩家有一个正x方向的

我正在开发一个简单的平台,在最终找到解决方案之前,我已经经历了几个碰撞系统,到目前为止,这个解决方案已经达到了我所希望的稳定状态。直到玩家与y轴中心位置等于0的块碰撞。虽然我怀疑它只在y轴上,但它非常奇怪,因为我首先检查了x移动/碰撞。我不知道

我做一个简单的AABB类型碰撞检查/响应,首先应用x速度,然后如果重叠,重新定位玩家,使右玩家边界=左方块边界,使他们脱离重叠。然后,我用y轴沿球员的垂直方向通过相同的计算,以确定球员是击中了方块的底部还是顶部。唯一的控制是跳跃,因为玩家有一个正x方向的加速力,因此玩家永远不会向左移动

问题是,玩家移动离开蓝色虚线块,但当它碰到红色虚线块时,在Y轴上检测到碰撞,因此玩家从重叠中向上移动,但当下一帧执行时,玩家在x轴上的速度像往常一样被添加,但碰撞被注册,然后将玩家定位到x轴的左侧红色方块。下一帧检测到与蓝色块的碰撞,因此它将播放器放置在其顶部,如下所示

下面的设置使玩家循环这个序列

信息:

player.centerPosition=(2,2)

播放器宽度=0.5f

播放器高度=0.8f

blueBlock.centerPosition=(1,1)

redBlock.centerPosition=(4,0)

块宽度=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
private void checkBlockCollision(float deltaTime){
List colliders=grid.getPotentialColliders(播放器);
int len=colliders.size();

对于(int axis=0;axisIsolate到一个小测试用例(例如“提出一个真正的问题”)和/或尝试代码审查堆栈。所以不是一个代码审查站点。天哪。我甚至没有意识到我没有提出这样的问题。很抱歉。我会把它取下来,放在代码审查一上。