如何在我的简单Javascript游戏中改进碰撞检测
我已经完成了一个关于如何用Javascript创建一个简单的破砖游戏的教程,现在想对其进行扩展。我遇到了如何区分侧面/侧面碰撞和顶部/底部碰撞的问题 现在,我使用的碰撞检测功能只检查是否发生了碰撞。然后在一个单独的类中,如果碰撞函数返回true,它将否定轨迹的y坐标,而不是x坐标。因此,当球与砖的顶部或底部碰撞时,它将改变y方向,但如果球与砖的侧面碰撞,它将保持在相同的x方向上移动 下面是碰撞函数:如何在我的简单Javascript游戏中改进碰撞检测,javascript,collision-detection,Javascript,Collision Detection,我已经完成了一个关于如何用Javascript创建一个简单的破砖游戏的教程,现在想对其进行扩展。我遇到了如何区分侧面/侧面碰撞和顶部/底部碰撞的问题 现在,我使用的碰撞检测功能只检查是否发生了碰撞。然后在一个单独的类中,如果碰撞函数返回true,它将否定轨迹的y坐标,而不是x坐标。因此,当球与砖的顶部或底部碰撞时,它将改变y方向,但如果球与砖的侧面碰撞,它将保持在相同的x方向上移动 下面是碰撞函数: export function objectCollision(ball, gameObject
export function objectCollision(ball, gameObject){
//Position of Ball
let topOfBall = ball.position.y;
let bottomOfBall = ball.position.y + ball.height;
let leftSideOfBall = ball.position.x;
let rightSideOfBall = ball.position.x + ball.width;
//Position of Object
let topOfObject = gameObject.position.y;
let bottomofObject = gameObject.position.y + gameObject.height;
let leftSideOfObject = gameObject.position.x;
let rightSideOfObject = gameObject.position.x + gameObject.width;
//Split up the top/bottom and left/right hit detection (causes abnormal behavior)
//Need to negate the x trajectory
//Set ball.speed.x = -ball.speed.x if left/right hit detection
if(bottomOfBall >= topOfObject && topOfBall <= bottomofObject && leftSideOfBall >= leftSideOfObject && rightSideOfBall <= rightSideOfObject){
//ball.speed.x = -ball.speed.x;
return true;
}
else
return false;
}
我的问题是,如果我检查y坐标碰撞与x坐标碰撞分开,当球的x坐标与砖的x坐标相同时,它将检测到碰撞,即使球低于/高于砖。我尝试先检查y,然后在嵌套的if()中检查x,但结果相同
大致如下:
if(bottomOfBall >= topOfObject && topOfBall <= bottomofObject && leftSideOfBall){
if(leftSideOfBall >= leftSideOfObject && rightSideOfBall <= rightSideOfObject){
ball.speed.x = -ball.speed.x;
return true;
}
}
if(bottomOfBall>=topOfObject&&topOfBall=leftSideOfObject&&rightSideOfBall只是在这里大声思考,但是你能计算出砖块的哪一边离球最近,然后看看从球的中心到那一边的距离是否小于或等于球的半径吗?我能假设球是圆的,它的宽度和高度都是圆的吗t等于?球(几乎所有东西)是一个有id的图像,所以从技术上讲它是一个正方形。它没有半径,只有宽度和高度。把它想象成一个电子游戏中的精灵,起始位置在图像的左上角。所以“ball.position.x”和“ball.position.y”应该是左上角,“ball.position.x+ball.width”将是右上角,“ball.position.y+ball.height”将是左下角。但是的,宽度和高度是相等的。我担心计算最近的边可能太昂贵。这还需要大量重构,我希望避免这种情况。
if(bottomOfBall >= topOfObject && topOfBall <= bottomofObject && leftSideOfBall){
if(leftSideOfBall >= leftSideOfObject && rightSideOfBall <= rightSideOfObject){
ball.speed.x = -ball.speed.x;
return true;
}
}