碰撞检测代码应该在哪里?

时间:2010-10-31 18:38:51

标签: ruby collision-detection hittest

我正在写一个乒乓球游戏,我有一个球类,它有速度x,y,位置以及通过调用@ ball.update来更新每一帧的所有东西,这会将球向前移动x_vel和Y_vel我的问题是我的碰撞代码应该在循环中还是在球类的更新方法中?或者它应该都在循环中并且球不应该控制它的位置?

3 个答案:

答案 0 :(得分:3)

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

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

应该有一个关心碰撞检测的专用课程。如果任何受监督对象改变其位置,则通知该类。然后它检查碰撞并通知所有具有collsion的abjects(不仅仅是2 :)。

玩得开心...... :)

答案 1 :(得分:2)

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

简单的碰撞,例如墙壁,可以在Ball类中根据全局可访问的值(如屏幕尺寸范围)完成。您的更新例程可以在特定墙被击中时简单地反转一个速度组件。您可以在Ball类中定义和设置委托/回调,以在球反弹时播放声音。同样,Paddle的更新可以检查屏幕尺寸,因此您无法将屏幕移动到屏幕外。

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

对于包含大量物体的游戏,您不希望碰撞检测每一个物体,只检测最近的物体。在这种情况下,“管理者”变得更像是一个“场景管理器”,它在X和Y方向上保持对象的链接列表。当对象移过其他对象时,它们会在列表中交换指针,因此列表始终保持排序状态。这样,对于任何给定的对象,我们立即知道左/右/上/下的对象,因此我们只需对这些对象进行碰撞检查......节省大量时间并使游戏以最快的速度运行。也许你不是这一点!

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

答案 2 :(得分:1)

对于乒乓,简单矩阵运算应该足够了。如果只有一个球类,则不需要球类,只用于保持元组。