2

我正在为我正在编写的 Pong 克隆编写一些困难,以使自己熟悉 SFML 和 Xcode。对于最难的难度,我想创建一个人工智能关卡,让计算机立即知道球的去向。所以,如果我有我的 xVelocity 和我的 yVelocity,我可以有效地拥有坡度。问题是,每次球击中顶部或底部时,yVelocity 都会反转。所以基本上,我有一个代数斜率问题,每次撞墙时都会发生相反的情况。

现在,我的屏幕高度为 600 像素,命中检测为顶部和底部 5 像素,使空间为 590 像素。

我的问题:是否有某种公式可以包含所有这些因素。例如,球在 x = 30 和 y = 240 处以 1.45 的斜率被击中,我想获得当 x = 770 时它将击中的 y 值。

让我知道我是否可以简化这一点。同样,我知道如何通过计算 4 次来计算它,如果球反弹 4 次,但我想知道是否有办法计算出它在边界处的 y 速度开关。

谢谢!

4

3 回答 3

7

编辑:只需阅读您的屏幕实际上是 590 像素高,这会改变数学但不会改变公式

计算忽略碰撞的球会击中的位置。如果 (0,0) 是竞技场的左上角,则取 y = mx + b,其中 b 是您的 y 偏移量(球在 y = 240 处击球),m 是您的坡度 (1.45)

现在我们想知道当 x770-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 来确定它应该在哪里。

于 2012-07-12T22:10:21.453 回答
1

我还没有尝试过,但如果你知道它在“y 轴”上的哪个位置和斜率,你就会有一个斜率截距公式。插入对面的距离,您可以判断它是在屏幕上方、下方还是内部。如果它会高于或低于,计算当 y 达到顶部或底部时的 x 值,从总 x 中减去并重复。

于 2012-07-12T21:59:40.410 回答
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;

基本上只需在循环中执行与球相同的逻辑,然后将其设置为目标。

于 2014-08-09T05:17:00.960 回答