C++ 如何实现一个良好的碰撞系统,这也将是成本效益?

C++ 如何实现一个良好的碰撞系统,这也将是成本效益?,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我正在做一个简单的乒乓球游戏,我想为我的球和球拍实现一个简单的碰撞系统。我所做的是检查球的pos(x,y)并比较当前post(x,y)两个球拍是否处于相同的pos(pos位置) 直到我提高了球的速度,这似乎才奏效。然后有时候球会穿过球拍(我相信这是因为球的速度大于球拍的宽度)。请参阅@MarkCF的相关答案: 解决这个问题的一种方法是限制球的速度,使其永远不会超过球拍的宽度。但我相信拥有任何速度都会很有趣,这就是为什么我在寻找另一个实现。我的想法是用ballPosX=ballPosX+speed

我正在做一个简单的乒乓球游戏,我想为我的球和球拍实现一个简单的碰撞系统。我所做的是检查球的
pos(x,y)
并比较当前
post(x,y)
两个球拍是否处于相同的
pos
pos
位置)

直到我提高了球的速度,这似乎才奏效。然后有时候球会穿过球拍(我相信这是因为球的速度大于球拍的宽度)。请参阅@MarkCF的相关答案:

解决这个问题的一种方法是限制球的速度,使其永远不会超过球拍的宽度。但我相信拥有任何速度都会很有趣,这就是为什么我在寻找另一个实现。我的想法是用
ballPosX=ballPosX+speed
更新球的位置,而不是在
for循环中更新球的
speed
次数

我的问题是:这种检查冲突的方法是不是一个糟糕的实现,因为我将调用方法
ball->update()
速度
我认为不划算的次数?作为旁注,如果我的游戏更新球的位置
速度
次数,我是否会放弃面向对象编程的概念,因为我的游戏现在在更新球的位置方面起到了作用

我的当前代码:

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
    }
}
bool检查碰撞(球与球、机架与p1、机架与p2){
如果(ball.getBall()->x+p1.getRack()->w
&& 
(ball.getBall()->y>=p1.getRack()->y&&ball.getBall()->y+p1.getRack()->h)){
ball.changeDir();
返回true;
}如果(ball.getBall()->x>=p2.getRack()->x
&& 
(ball.getBall()->y>=p2.getRack()->y&&ball.getBall()->y+p2.getRack()->h)){
ball.changeDir();
返回true;
}
返回false;
}
int main(){
机架*player1=新机架(10,0,10200);
机架*player2=新机架(1260,0,10200);
Ball*Ball=新球(3.0,“绿色”);//3.0是此场景中的球速
ball->update();//以ballSpeed的速度移动球
如果(选中碰撞(*球,*player1,*player2)){
//做点什么
}
}
我自己对碰撞的看法:

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
        }
    }
}
intmain(){
机架*player1=新机架(10,0,10200);
机架*player2=新机架(1260,0,10200);
Ball*Ball=新球(3.0,“绿色”);//3.0是此场景中的球速
对于(inti=0;igetSpeed();i++){
ball->move1px();
如果(选中碰撞(*球,*player1,*player2)){
//做点什么
}
}
}

我也在研究这个碰撞问题,但我不确定这是否是乒乓球游戏的一个好方法:

你知道球移动前后的位置和大小。你知道球拍的位置和速度。可以计算这样做是否会导致球拍和球在球路径上的任意点相交。这里有一些关于这个主题的好阅读材料:。这不完全是你的问题,但是足够接近你。你有没有预测下一次球会在球拍后面吗?如果是,通过找到球的轨迹和球棒的交叉点来计算拦截位置。@JesperJuhl是的,这看起来至少很相似,可能会帮助我找出碰撞系统。但这是否意味着我当前的实现+我心目中的实现都是不好/不正确的实现方式?你知道球移动前后的位置和大小。你知道球拍的位置和速度。可以计算这样做是否会导致球拍和球在球路径上的任意点相交。这里有一些关于这个主题的好阅读材料:。这不完全是你的问题,但是足够接近你。你有没有预测下一次球会在球拍后面吗?如果是,通过找到球的轨迹和球棒的交叉点来计算拦截位置。@JesperJuhl是的,这看起来至少很相似,可能会帮助我找出碰撞系统。但这是否意味着我当前的实现+我心目中的实现都是不好/不正确的实现方式?