目前我正在设计一个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。然而,这使得非常线性的运动并且物体不能沿对角线移动。
有什么建议吗?
答案 0 :(得分:0)
您遇到的问题是因为您绑定了输入和碰撞系统。输入系统应该只按按键移动播放器。碰撞检测/处理系统应该只处理碰撞。一旦你将它们分离,事情就会变得更加清洁。
// Main loop
while(1) {
handleInput();
...
handleCollisions();
...
}
如果游戏中有太多对象,则可以使用spacial partitioning来减少必须执行的碰撞检查次数。否则你不必担心它。