双方的碰撞检测不起作用

时间:2018-07-23 10:16:04

标签: javascript collision-detection game-physics

我最近一直在研究2D平台游戏,该平台具有多个可以在其中切换的字符。我想实现碰撞检测,该检测循环遍历每个角色,并根据他们触摸的一侧阻止其移动。基本上来说,角色可以彼此跳起来并且彼此不能穿越。我使用了AABB相交碰撞检测系统,然后使用以下代码来确定我击中了角色的哪一侧:

for (var a = 0; a < this.characters.length; a++) {
  for (var b = 0; b < this.characters.length; b++) {
    if (a !== b) {
      if (this.characters[a].collision(this.characters[b])) {
        var ab = this.characters[a].y + this.characters[a].height,
          ar = this.characters[a].x + this.characters[a].width,
          bb = this.characters[b].y + this.characters[b].height,
          br = this.characters[b].x + this.characters[b].width;

        var tc = ab - this.characters[b].y,

          bc = bb - this.characters[a].y,

          lc = ar - this.characters[b].x,

          rc = br - this.characters[a].x;

        // Bottom is touching something
        if (tc < bc && tc < lc && tc < rc) {
          this.characters[a].isJumping = false;
          this.characters[a].vel.y = 0;
          this.characters[a].y = this.characters[b].y - this.characters[a].height;
        }

        // Top is touching something
        if (bc < tc && bc < lc && bc < rc) {
          this.characters[a].isJumping = false;
          this.characters[a].y = this.characters[b].y + this.characters[b].height;
        }

        // Right side is touching something
        if (lc < rc && lc < tc && lc < bc) {
          this.characters[a].x = this.characters[b].x - this.characters[a].width;
        }

        // Left side is touching something
        if (rc < lc && rc < tc && rc < bc) {
          this.characters[a].x = this.characters[b].x + this.characters[b].width;
        }
      }
    }
  }
}

它对于第一个字符似乎很有效(块;我没有提到,但是所有字符都是正方形),但是如果我尝试使用第二个字符(这些字符位于数组)并在第一个字符上测试碰撞。诸如跳到不起作用的顶部以及向角色的左行走等导致第一个角色向左移动的事情(我知道为什么会发生这种情况,但是我不确定如何解决)。第三个角色不适用于前两个角色,而到第四个角色则完全混乱。有人有建议吗?

1 个答案:

答案 0 :(得分:0)

一次碰撞将在循环中造成两次碰撞,首先是a = 0和碰撞的对象b = 1(例如),然后是a = 1b = 0,相同的碰撞将再次被检测到。

我认为最好将一组无效字符与一个有效字符进行对照。

您可以在玩家切换角色时创建这些变量。这样,您只需要一个循环,就不需要if a != b检查

这段代码说明了这个想法:

function characterChange(){
   activeCharacter = objA;
   inActiveCharacters = [objB, objC, objD];
}

function checkCollisions(){
   for(let i = 0; i<inActiveCharacters.length; i++){
      checkHit(activeCharacter, inActiveCharacters[i]);
   }
}

function checkHit(a,b) {
    // your a b check here
}