目前我正在设计一个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();
...
}
如果你的游戏中有太多的对象,你可以使用空间分区来减少你必须进行的碰撞检查的次数。否则你就不必担心了。