使用多个按键时,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中为碰撞实现单独的布尔值,但这并没有影响结果。

我找到的唯一修复方法是,如果在处理密钥时,我使用else if’s而不是if’s。然而,这会导致非常线性的移动,并且对象不能对角移动。

有什么建议吗?

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

// Main loop
while(1) {
   handleInput();
   ...
   handleCollisions();
   ...
}

如果你的游戏中有太多的对象,你可以使用空间分区来减少你必须进行的碰撞检查的次数。否则你就不必担心了。

相关内容

  • 没有找到相关文章

最新更新