我正在为我的Pong克隆编写一些困难,我正在编写以熟悉SFML和Xcode。对于最难的困难,我想创建一个AI级别,计算机可以立即知道球的位置。所以,如果我有xVelocity和yVelocity,我可以有效地获得斜率。问题是,每次球击中顶部或底部时,yVelocity都会反转。所以基本上,我有一个代数斜率问题,每当墙被击中时都会出现相反的情况。
现在,我的屏幕高度为600像素,顶部和底部的点击检测为5像素,空间为590像素。
我的问题:是否存在包含所有这些因素的公式。比如说,球在x = 30和y = 240时被击中,斜率为1.45,我想得到当x = 770时它将达到的y值。
如果我可以简化这一点,请告诉我。再一次,我知道如果通过计算4次,如果球反弹4次,我怎么能算出来,但我想知道是否有办法在边界处进行y速度切换。
谢谢!
答案 0 :(得分:7)
编辑:只是读取你的屏幕实际上是590像素高,这改变了数学而不是公式
计算球击中忽略碰撞的位置。如果(0,0)是你竞技场的左上角,取y = mx + b,其中b是你的y偏移(球在y = 240时被击中),m是你的斜率(1.45)
现在我们想知道当x 770-30
进一步放置时y将相等,所以算一算:
y = (1.45)(740) + (240) = 1313
这显然超出了你的范围。它会反映
y/height = floor(1313/590) = 2 times
意味着斜率仍在向上移动,并且会在
处达到y mod height = 1313 mod 590 or 133
如果它反映了奇数次(floor(y/2) %2 == 1)
,那么您将不得不使用以下内容来计算它
MAX_HEIGHT - (y mod height) = 590 - (1903 mod 590) = 590 - 133 = 457
您可以通过将多个590高度字段堆叠在一起来显示这一点,其中一个是您开始的位置:
--------------------------------------------------------------------
|
|
|
| ball ends up here (*)
| *
| *
| *
------------------------(reflection two)------------*---------------
| *
| *
| *
| *
| *
| *
| *
---------------------*---------(reflection 1)------------------------------
| *
| *
| *
| *
|*ball hit here
|
|
-----------------------------------------------------------------------
同样的想法应该适用于下行。计算位置,计算出反射次数,使用mod或590 - mod来确定它应该在哪里。
答案 1 :(得分:1)
我没有尝试过这个但是如果你知道它在“y轴”上的位置和斜率,你就会得到一个斜率截距公式。插入到另一侧的距离,您可以判断它是在屏幕的上方,下方还是内部。如果它将高于或低于,则计算当y到达顶部或底部时x将是什么,从总x减去并重复。
答案 2 :(得分:0)
如果数学来到你这里是一个程序性不那么优雅 (而且速度较慢,而不是大多数pong实现中的那个问题)解决方案:
tempX = ball.x;
tempY = ball.y;
tempXVel = ball.hspeed;
tempYVel = ball.vspeed;
while(tempX < x) //Assumes ball is traveling at you and you are right paddle
{ //in a X = 0 = left hand side scenario
tempX += tempXVel;
tempY += tempYVel;
if (tempY > 480 or tempY < 0)
tempYVel *= -1; //Y Velocity Switch at boundaries
}
target_Y = tempY;
基本上只是在循环中对球进行相同的逻辑,然后将其设置为目标。