检测对象与多个对象碰撞/消除多个对象的项目

时间:2016-09-19 12:07:11

标签: javascript collision-detection cocos2d-js

在使用Cocos2d-JS创建一个小突破克隆时,我通过否定(或乘以-1)X或Y值来设法让球在碰到一个块时反弹。

这是有效的,至少直到球(它实际上是一个带有精灵的小矩形)设法同时击中两个块,此时X或Y值被否定两次。

然后球继续前进而没有弹跳,导致一个非常短暂且非常奇怪的突围游戏。

有没有办法检测有多少物品与球相撞,并忽视一个?

还是有其他方法可以做到这一点吗?

感谢。

这是我的碰撞代码:

if (Tools.rectsIntersect(this, g_Ball)) {
      if (g_Ball.y < this.y || g_Ball.y > this.y) {
          g_Ball.yDirection = g_Ball.yDirection * -1;
      }
      else if (g_Ball.x < this.x || g_Ball.x > this.x) {
          g_Ball.xDirection = g_Ball.xDirection * -1;
      }
      this.destroyBlock();
}


Tools.rectsIntersect = function (obj1, obj2) {box
    var aRect = obj1.collideRect();
    var bRect = obj2.collideRect();
    return cc.rectIntersectsRect(aRect, bRect);
};

1 个答案:

答案 0 :(得分:1)

在不知道你是如何启动碰撞检查的情况下(我假设您或引擎盖下的引擎正在使用requestAnimationFrame或setInterval,然后您只是迭代每一块砖并对着球进行测试),很难给你一个完美的解决方案。但假设你正在做的事情,还有一个设计问题。球是否应该能够同时击中2个盖?

// if YES:
var allTheBlocks = someListOfAllTheBlocks;
var reflectInX = false;
var reflectInY = false;

for (var i = 0; i < allTheBlocks.length; i++) {
    var thisBlock = allTheBlocks[i];
    if (Tools.rectsIntersect(thisBlock, g_Ball)) {
        if (g_Ball.y < thisBlock.y || g_Ball.y > thisBlock.y) {
            reflectInY = true;
        } else if (g_Ball.x < thisBlock.x || g_Ball.x > thisBlock.x) {
            reflectInX = true;
        }
        thisBlock.destroyBlock();
    }
}

if (reflectInY) {
    g_Ball.yDirection *= -1;
}

if (reflectInX) {
    g_Ball.xDirection *= -1;
}

//=====================
// OR, if NO:
var allTheBlocks = someListOfAllTheBlocks;

for (var i = 0; i < allTheBlocks.length; i++) {
    var thisBlock = allTheBlocks[i];
    if (Tools.rectsIntersect(thisBlock, g_Ball)) {
        if (g_Ball.y < thisBlock.y || g_Ball.y > thisBlock.y) {
            g_Ball.yDirection *= -1;
        } else if (g_Ball.x < thisBlock.x || g_Ball.x > thisBlock.x) {
            g_Ball.xDirection *= -1;
        }
        thisBlock.destroyBlock();
        break;
    }
}
// And then if the ball has traversed too far in that frame, due to lag, or loose math,
// make sure to manually set it's position to be outside of the block it hit. Or if you are
// playing that your ball has some 'flex' to it, then just leave it be.

显然可以在碰撞加位置代码中进行优化,但那里完全有效。