在使用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);
};
答案 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.
显然可以在碰撞加位置代码中进行优化,但那里完全有效。