我正在研究一个简单的乒乓球游戏,我想为我的球和球拍实现一个简单的碰撞系统。我要做的是检查球有哪个pos(x,y)
并比较当前的post(x,y)
两个球拍,看看它们是否与pos
(pos
position
)。
这似乎行之有效,直到我提高了球的速度。然后有时球会穿过球拍(我相信这是因为球的速度大于球拍的宽度)。请参阅@MarkCF的相关答案:Object going through wall during collision。
解决该问题的一种实现方式是限制球的速度,以使其永远不会大于球拍的宽度。但是我相信有任何速度都将很有趣,这就是为什么我正在寻找另一种实现方式的原因。我有一个想法,而不是通过ballPosX = ballPosX + speed
在SPEED
中更新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
是否能很好地实现这一目标