Java中的球碰撞

时间:2014-07-14 16:09:15

标签: java collision

我正在制作一个球进入并收集其他球的游戏。 我写了一个碰撞探测器,但我发现它有点偏差。 如果受控球在要收集的球的右侧大约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;
    }
}

2 个答案:

答案 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;就像他们实际上没有碰撞一样,只是在视觉上。