使用多个按键时,AABB碰撞检测会出现故障

时间:2015-04-03 23:30:35

标签: c++ collision-detection aabb

目前我正在设计一个2d平台游戏,我已经实现了碰撞检测,我的代码如下:

if (keys['W']){ checkCollision(vector of bounded boxes, direction; }
if (keys['A']){ checkCollision(vector of bounded boxes, direction; }

等...

checkCollision(vector, direction){
for(each boundary box){
    if (dir == 'UP'){
        if (AABB collision check){hit = true;}
        else{hit = false;}
        walk(velocity, direction);
    }
    else if (dir == 'RIGHT'){
        if (AABB collision check){hit = true;}
        else{hit = false;}
        walk(velocity, direction);
    }
}
}

等...

walk(velocity, direction){
    if (dir == 'UP'){
        if (hit){ y -= 2; }
        else{ y += velocity; }
    }
    else if (dir == 'RIGHT'){   
        if (hit){ x -= 2; }
        else{ x -= velocity; }
    }

等...

这一切看起来效果都不错但是当水平碰撞物体时,如果我一直按住右键并按向上键,则该功能识别物体仍在碰撞,然后施加相同的力,如果游戏中的物体在上方跳跃并相撞,因此即使没有上升力,游戏中的物体也会被压下。

我已尝试在X和Y中为碰撞实现单独的布尔值,但这并未影响结果。

我发现的唯一解决方案是,在处理密钥时,我使用if而不是if。然而,这使得非常线性的运动并且物体不能沿对角线移动。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您遇到的问题是因为您绑定了输入和碰撞系统。输入系统应该只按按键移动播放器。碰撞检测/处理系统应该只处理碰撞。一旦你将它们分离,事情就会变得更加清洁。

// Main loop
while(1) {

   handleInput();
   ...
   handleCollisions();
   ...
}

如果游戏中有太多对象,则可以使用spacial partitioning来减少必须执行的碰撞​​检查次数。否则你不必担心它。