乒乓反射器数学?

时间:2012-01-24 16:13:46

标签: pong

我正在制作一个Pong克隆,我正在以这种方式处理我的变量:

direction = a value from 0 to 2*pi 
distX = cos(direction)*speed of the ball
distY = sin(direction)*speed of the ball

on update:
ball's x position += distX
ball's y position += distY

当球击中墙壁时(我只能反射90度),我已经可以正确地处理方向的翻转但是桨怎么样?我不知道如何在连接后最好地处理球的角度和速度。

它取决于它击中桨的位置?桨是否在移动是否重要?等

我不知道在这里处理数学的合理方法。

2 个答案:

答案 0 :(得分:1)

没有“正确”的做法。你是那个编写代码的人,除非你有一些严格的规范,否则你可以按照你喜欢的方式处理它。

基本上,您可以像处理球墙碰撞一样处理球拍碰撞,即通过简单计算反射角度并将其指定给direction

如果您想要与桨速度成比例地增加反射角度,您只需将一些重量应用于新的direction

但这完全取决于你。

无论如何,如果您提供处理桨速的代码,有人可以给您进一步指示。

答案 1 :(得分:0)

我认为你的桨是矩形的吗?为简单起见,我们假设球只能击中桨的表面(即不是角落或侧面)。

问:这取决于它击中桨的位置吗? 答:如果球拍是一个轴对齐的矩形,并且球只能击中它的表面,那么没有。

问:桨是否在移动? 答:这是你的选择。游戏物理不是真正的物理,所以你可以自由地做任何使游戏发挥最好的东西。

首先,将球的方向旋转90度并不能准确地将球偏离墙壁。考虑一下球撞到墙上的极端情况。如果我将球旋转90度,那么球将在墙壁旁平行。

我相信你现在正在做的事情,并且只是有点混乱地说,如果球击中垂直墙,你会反转球的水平方向。当然,这不等于将球的方向旋转90度。

如果我想将速度从球拍传递到球上,我会将球的运动视为矢量,将球拍的运动视为矢量。然后我将这两个向量加在一起。为了控制球的速度,我会使用一个系数(让我们称之为k),如果球需要保持恒定的速度,我会将球的最终速度矢量标准化(但是因为你存储速度而不是x,y组件,这是不必要的。)

if (ball hits paddle):
  k = 0.5;
  // paddle only moves horizontally, which simplifies the math
  paddle_vx = paddle_speed * paddle_xdirection;
  ball_vx = cos(ball_direction) * speed + k*paddle_vx; 
  ball_vy = - sin(ball_direction) * speed // flips from the collision
  ball_direction = atan2(ball_vy, ball_vx);
  ball_speed = 100; // always constant