与乒乓物理学有关的问题,我的方法是错误的?

我一直在做一个pong克隆,我过去做过游戏,但是他们都很傻。 这一次,我试图去使用面向对象或模式更好的方法。 到目前为止,这些游戏并没有提出太多的问题,然而我却在思考碰撞系统和球物理方面存在问题。 在我的主循环中,碰撞代码如下:

if (ball->Y < 0) { ball->direction = -ball->direction; if (ball->ballSpeed < 700) { ball->ballSpeed += 25; } } if ((ball->X + ball->width > player2->X) && (ball->X + ball->velocityX) + (ball->width) < player2->X + player2->width && (ball->Y + ball->velocityY) + (ball->height) > player2->Y && (ball->Y + ball->velocityY) + (ball->height) < player2->Y + player2->height) { ball->direction -= 70; if (ball->ballSpeed < 700) { ball->ballSpeed += 25; } } if ((ball->X + ball->width) > player1->X && (ball->X + ball->velocityX) + (ball->width) < player1->X + player1->width && (ball->Y + ball->velocityY) + (ball->height) > player1->Y && (ball->Y + ball->velocityY) + (ball->height) < player1->Y + player1->height) { ball->direction += 70; if (ball->ballSpeed < 700) { ball->ballSpeed += 25; } } 

程序检查对象矩形的点,看它们是否已经通过任何一个桨,然后将变化应用到球公共variables。 这里是球更新代码:

 if(move) { velocityX = int(cos((direction + 0.0) * M_PI / 180.0) * (ballSpeed *deltaTime)); velocityY = int(sin((direction + 0.0) * M_PI / 180.0) * (ballSpeed *deltaTime)); rect.x += velocityX; rect.y += velocityY; } X = rect.x; Y = rect.y; width = rect.w; height = rect.h; 

然而,这部分地工作,但是球有时在奇怪的方向进行,最重要的是,球实际上可以穿过桨的底部(似乎从桨的底部,球可以准确地穿过) 。 真的,球的物理学看起来很古怪,根本不stream畅。 我不擅长math,所以我真的不知道还有什么其他的办法可以解决这个问题。 帮助将不胜感激。

我认为你的代码有两个问题: 不正确的X坐标反弹隧道

首先X坐标反弹。 此代码:

 if (...) { ball->direction -= 70; ... } 

试图在相反的X方向(我认为)reflection球,但是所有要做的就是将速度旋转一个固定的角​​度。 你可以通过做适当的算术来解决这个问题,但是我鼓励你尝试使用vectormath而不是角度来重新实现。 这使轴alignment反弹更简单。

弹跳:

 if (ball->Y < 0) { // ball->direction = -ball->direction; ball->velocityY *= -1; } if (/* X-coordinate bounces*/) { // ball->direction += 70; ball->velocityX *= -1; } 

运动:

 if(move) { // velocityX = int(cos((direction + 0.0) * M_PI / 180.0) * (ballSpeed *deltaTime)); // velocityY = int(sin((direction + 0.0) * M_PI / 180.0) * (ballSpeed *deltaTime)); // rect.x += velocityX; // rect.y += velocityY; rect.x += velocityX * ballSpeed*deltaTime; rect.y += velocityY * ballSpeed*deltaTime; } 

至于隧道,我不会涉及太多,因为它可能是一个巨大的话题,解决scheme从小的窍门(如小增量,或放慢速度)到复杂稳健的algorithm(search扫掠体积)。 没有看到你的游戏在行动,很难说什么你可以摆脱。