我正在制作一个球进入并收集其他球的游戏。 我写了一个碰撞探测器,但我发现它有点偏差。 如果受控球在要收集的球的右侧大约10个像素处,它仍将记录碰撞。
如果用户的球位于要收集的球的左侧,则碰撞效果很好。 有人可以解释为什么会发生这种情况和/或建议修复?谢谢!
这是我的碰撞探测器:
private void checkForCollision(UserBall b) {
int ballX = b.getX();
int ballY = b.getY();
int ballR = b.getRadius();
int a = x - ballX;
int bb = y - ballY;
int collide =radius + ballR;
if (a*a + bb*bb <=collide*collide){
performAction(b);
createNew= true;
}
}
答案 0 :(得分:0)
这是我在计算机上找到的最接近的js代码。它工作正常。
Ball.prototype.intersects = function (p) {
'use strict';
switch (p.id) {
case IDS.Ball:
var dist = this.radius + p.radius,
dx = this.x - p.x, //x - is center of Ball
dy = this.y - p.y;
return dist * dist >= (dx * dx + dy * dy);
default:
throw "Ball does not provide intersects for " + p.id;
}
};
我在计算机上找到了C ++代码。它也工作正常
bool Ball::intersects(Ball &b) {
if (this != &b) {
int dx = b.x - this->x; //x is center of Ball
int dy = b.y - this->y;
int sqrdist = dx*dx + dy*dy;
int sumrad = b.radius + this->radius;
return sumrad*sumrad >= sqrdist;
}
return false;
}
它也可以正常工作。所以我建议你在检查交叉点之前计算球的位置。 附:并请,区分检查交叉点的方法,返回bool。不要将事件检查与事件上的操作混合起来。
答案 1 :(得分:0)
我刚刚在我的一个游戏中将代码片段插入到类似的碰撞检测方法中,并按预期工作。
然而,我记得当我测试我的时候遇到了类似的问题,问题在于图像显示,而不是碰撞检测。如果您使用LWJGL或类似的东西进行渲染,请检查您的纹理/图像是否具有两种尺寸的力量。有时,他们只是添加填充到最接近的2的幂,它似乎&#34;就像他们实际上没有碰撞一样,只是在视觉上。