我正在制作一个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度),我已经可以正确地处理方向的翻转但是桨怎么样?我不知道如何在连接后最好地处理球的角度和速度。
它取决于它击中桨的位置?桨是否在移动是否重要?等
我不知道在这里处理数学的合理方法。
答案 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