如何实现良好的碰撞系统,同时又具有成本效益?

时间:2020-05-24 16:54:56

标签: c++ sdl sdl-2

我正在研究一个简单的乒乓球游戏,我想为我的球和球拍实现一个简单的碰撞系统。我要做的是检查球有哪个pos(x,y)并比较当前的post(x,y)两个球拍,看看它们是否与pospos position)。

这似乎行之有效,直到我提高了球的速度。然后有时球会穿过球拍(我相信这是因为球的速度大于球拍的宽度)。请参阅@MarkCF的相关答案:Object going through wall during collision

解决该问题的一种实现方式是限制球的速度,以使其永远不会大于球拍的宽度。但是我相信有任何速度都将很有趣,这就是为什么我正在寻找另一种实现方式的原因。我有一个想法,而不是通过ballPosX = ballPosX + speedSPEED中更新for-loop次数来更新球的位置。

我的问题是:这种检查冲突的方法是否不好,因为我将方法ball->update()speed调用的时间称为成本节约的次数?另外,如果我的游戏不断更新球的位置speed,我现在是否要放弃面向对象的编程概念,因为我的游戏现在可以更新球的位置了?

我当前的代码:

bool checkCollision(Ball &ball, Rack &p1, Rack &p2) {
    if (ball.getBall()->x <= p1.getRack()->x + p1.getRack()->w
        && 
        (ball.getBall()->y >= p1.getRack()->y && ball.getBall()->y <= p1.getRack()->y + p1.getRack()->h)) {
        ball.changeDir();
        return true;
    } else if (ball.getBall()->x >= p2.getRack()->x
        && 
        (ball.getBall()->y >= p2.getRack()->y && ball.getBall()->y <= p2.getRack()->y + p2.getRack()->h)) {
            ball.changeDir();
            return true;
        }
    return false;
}

int main() {
    Rack *player1 = new Rack(10, 0, 10, 200);
    Rack *player2 = new Rack(1260, 0, 10, 200);
    Ball *ball = new Ball(3.0, "green"); // 3.0 is the ballSpeed in this scenario

    ball->update(); // Moves the ball with the speed of ballSpeed
    if(checkCollision(*ball, *player1, *player2)) {
        // Do something
    }
}

我自己的碰撞想法:

int main() {
    Rack *player1 = new Rack(10, 0, 10, 200);
    Rack *player2 = new Rack(1260, 0, 10, 200);
    Ball *ball = new Ball(3.0, "green"); // 3.0 is the ballSpeed in this scenario

    for (int i = 0; i < ball->getSpeed(); i++) {
        ball->move1px();
        if(checkCollision(*ball, *player1, *player2)) {
            // Do something
        }
    }
}

我也一直在寻找这种碰撞的方法,但是我不确定对于乒乓球游戏https://gamedev.stackexchange.com/questions/39931/fast-accurate-2d-collision

是否能很好地实现这一目标

0 个答案:

没有答案