1

我正在编写一个乒乓球游戏,我有一个球类,它具有速度 x、y、位置以及通过调用@ball.update 更新每一帧的所有内容,这会将球向前移动 x_vel 和 Y_vel 等。我的问题是我的碰撞代码应该在循环中还是在球类的更新方法中?还是应该全部在循环中并且球不应该对其位置进行任何控制?

4

3 回答 3

3

碰撞检测不应该在你的球类中进行,因为它需要你游戏中所有其他对象的知识。

想象一个有很多物体的射手,想想如果每个物体都试图自己计算碰撞会发生什么。

应该有一个专门的类来关心碰撞检测。如果它的任何受监督对象改变了它的位置,这个类就会被通知。然后它检查碰撞并通知所有有碰撞的对象(不仅是 2 :)。

玩得开心... :)

于 2010-10-31T19:05:51.050 回答
2

像您描述的 Ball 类确实是一个好主意。这样,如果您想在某些“突围”游戏中生成两个或更多球,或者如果您想在另一个游戏中重用该代码,您就可以复制它。您还可以拥有一个具有相似 X、Y 坐标的 Paddle 类(或者如果 Ball 和 Paddle 最终共享许多类似的成员,则从“ScreenObject”类派生它们)。Paddle 可以读取由接收用户输入的线程/事件更新的共享变量。

可以在 Ball 类中根据屏幕尺寸范围等全局可访问的值进行简单的碰撞,例如撞墙。当特定的墙壁被击中时,您的更新例程可以简单地反转一个速度分量。您可以在 Ball 类中定义和设置委托/回调,以在球反弹时播放声音。同样,Paddle 的更新可以检查屏幕大小,因此您不能将 paddle 移出屏幕。

像 TottiW 推荐的那样,对象之间的碰撞最好在拥有所有对象或有权访问其 X、Y 成员或边界框的父“管理器”类中完成。这是一个很好的面向对象设计。Ball 和 Paddle 不应该访问彼此的 X、Y 位置!...但经理确实如此。它还可以消除多余的碰撞检查。如果对象 A 检查是否与对象 B 发生碰撞,则 B 不必随后检查与 A 的碰撞。因此,您的管理器类实际上需要做的就是,对于每个 Paddle,检查每个 Ball 的位置。这可以进一步简化,因为桨可能只在一个方向上移动,比如水平,在一个固定的 Y 位置。因此,您的第一次检查可以立即消除任何 Ball.Y < Paddle.Y,例如(取决于 Y 的方向)。

对于具有大量对象的游戏,您不想对每一个对象进行碰撞检测,而只是对最近的对象进行检测。在这种情况下,“管理器”更像是一个“场景管理器”,它在 X 和 Y 方向上保存对象的链接列表。当对象经过其他对象时,它们会在列表中交换指针,因此列表始终保持排序。这样,对于任何给定的对象,我们立即知道左侧/右侧/上方/下方的对象,因此我们只需要对这些对象进行碰撞检查......节省大量时间并使您的游戏以最高速度运行。不过,也许你还没到这一步!

祝你好运,就像其他人说的,玩得开心!

于 2010-11-01T17:42:55.857 回答
1

对于 pong 来说,简单的矩阵运算就足够了。如果只有一个球类并且您仅将其用于保存元组,则不需要球类。

于 2010-10-31T19:29:59.507 回答