Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在我的简单Javascript游戏中改进碰撞检测_Javascript_Collision Detection - Fatal编程技术网

如何在我的简单Javascript游戏中改进碰撞检测

如何在我的简单Javascript游戏中改进碰撞检测,javascript,collision-detection,Javascript,Collision Detection,我已经完成了一个关于如何用Javascript创建一个简单的破砖游戏的教程,现在想对其进行扩展。我遇到了如何区分侧面/侧面碰撞和顶部/底部碰撞的问题 现在,我使用的碰撞检测功能只检查是否发生了碰撞。然后在一个单独的类中,如果碰撞函数返回true,它将否定轨迹的y坐标,而不是x坐标。因此,当球与砖的顶部或底部碰撞时,它将改变y方向,但如果球与砖的侧面碰撞,它将保持在相同的x方向上移动 下面是碰撞函数: export function objectCollision(ball, gameObject

我已经完成了一个关于如何用Javascript创建一个简单的破砖游戏的教程,现在想对其进行扩展。我遇到了如何区分侧面/侧面碰撞和顶部/底部碰撞的问题

现在,我使用的碰撞检测功能只检查是否发生了碰撞。然后在一个单独的类中,如果碰撞函数返回true,它将否定轨迹的y坐标,而不是x坐标。因此,当球与砖的顶部或底部碰撞时,它将改变y方向,但如果球与砖的侧面碰撞,它将保持在相同的x方向上移动

下面是碰撞函数:

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;
  }
}