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是的,这看起来至少很相似,可能会帮助我找出碰撞系统。但这是否意味着我当前的实现+我心目中的实现都是不好/不正确的实现方式?