【问题标题】:AABB collision detection glitches when using more than one key press使用多个按键时 AABB 碰撞检测故障
【发布时间】:2015-06-09 01:38:21
【问题描述】:

目前我正在设计一个 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 中为碰撞实现单独的布尔值,但这并没有影响结果。

我发现的唯一解决方法是,如果在处理密钥时,我使用 else if's 而不是 if's。然而,这会导致非常线性的移动,并且对象不能沿对角线移动。

有什么建议吗?

【问题讨论】:

  • OpenGL 标签与本题无关。

标签: c++ collision-detection aabb


【解决方案1】:

您面临的问题是因为您绑定了输入和碰撞系统。输入系统应该只根据按键移动播放器。碰撞检测/处理系统应该单独处理碰撞。一旦你将它们解耦,事情就会变得更加清晰。

// Main loop
while(1) {

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    相关资源
    最近更新 更多