2010-10-31 39 views
1

我正在写pong游戏,我有一个球类,它有速度x,y,位置以及所有那些通过调用@ ball.update来更新每一帧的东西,这会通过它的x_vel和Y_vel等向前移动球。 。我的问题是我的碰撞代码应该在循环中还是在球类的更新方法中?还是应该全部进入循环,球应该不能控制其位置?碰撞检测代码在哪里?

回答

3

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

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

应该有一个关心碰撞检测的专用类。如果任何监督对象改变了立场,则通知该班。然后它检查碰撞并通知所有的abjects(不仅有2个:)有collsion。

有乐趣... :)

1

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

2

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

基于全局可访问的值(如屏幕尺寸范围),可以在Ball类中完成简单的碰撞,例如对墙壁的碰撞。您的更新例程可以简单地在该特定墙被击中时反转一个速度分量。您可以在Ball类中定义和设置代表/回调以在球弹跳时播放声音。同样,Paddle's Update可以检查屏幕大小,因此您无法将屏幕移出屏幕。

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

对于有很多对象的游戏,你不想碰撞检测每一个,只是最近的。在这种情况下,“经理”变得更像是一个“场景管理器”,它可以在X和Y方向上保持对象的链接列表。当对象移过其他对象时,它们交换列表中的指针,所以列表总是保持排序。这样,对于任何给定的对象,我们知道对象立即到左/右/上/下,所以我们只需要对这些对象进行碰撞检查......节省大量时间并使您的游戏以最快速度运行。虽然也许你不是这个意思!

祝你好运,并像其他人一样说,玩得开心!

+0

谢谢,这些评论非常有用! – Ell 2010-11-02 16:12:09