我正在写pong游戏,我有一个球类,它有速度x,y,位置以及所有那些通过调用@ ball.update来更新每一帧的东西,这会通过它的x_vel和Y_vel等向前移动球。 。我的问题是我的碰撞代码应该在循环中还是在球类的更新方法中?还是应该全部进入循环,球应该不能控制其位置?碰撞检测代码在哪里?
回答
碰撞检测不应该在你的球类中完成,因为它需要知道你游戏中的所有其他物体。
想象一个拥有许多物体的射手,并想想如果每个物体都试图计算自己的碰撞,会发生什么。
应该有一个关心碰撞检测的专用类。如果任何监督对象改变了立场,则通知该班。然后它检查碰撞并通知所有的abjects(不仅有2个:)有collsion。
有乐趣... :)
对于乒乓简单的矩阵运算应该是足够的。如果只有一个球类,则不需要球类,只用于保存元组。
像你所描述的球类确实是一个好主意。如果你喜欢在某些“突破”游戏中产生两个或更多球,或者如果你想在其他游戏中重新使用该代码,那么你可以复制它。你也可以使用类似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方向上保持对象的链接列表。当对象移过其他对象时,它们交换列表中的指针,所以列表总是保持排序。这样,对于任何给定的对象,我们知道对象立即到左/右/上/下,所以我们只需要对这些对象进行碰撞检查......节省大量时间并使您的游戏以最快速度运行。虽然也许你不是这个意思!
祝你好运,并像其他人一样说,玩得开心!
- 1. 在哪里做碰撞检测
- 2. box2d碰撞检测,代码
- 3. 检测正方形的哪一侧与碰撞检测碰撞
- 4. 碰撞检测:碰到哪边? [Java,Slick2D]
- 5. 使用代码碰撞检测
- 6. 碰撞检测
- 7. 碰撞检测
- 8. 碰撞检测
- 9. 碰撞检测不检测
- 10. 碰撞检测和碰撞响应
- 11. Javascript碰撞检测
- 12. Java。碰撞检测
- 13. Pacman碰撞检测
- 14. Java碰撞检测
- 15. SDL碰撞检测
- 16. Pygame碰撞检测
- 17. XNA碰撞检测
- 18. XNA碰撞检测
- 19. Slick2D碰撞检测
- 20. 检测墙碰撞
- 21. 碰撞检测Swift
- 22. Cocos2D碰撞检测
- 23. 碰撞检测(CGRectIntersectRect)
- 24. 碰撞检测Javascript
- 25. Box2D碰撞检测?
- 26. 检测碰撞JavaScript
- 27. BabylonJS:碰撞检测
- 28. SpriteKit碰撞检测
- 29. gameQuery碰撞检测
- 30. GameQuery碰撞检测
谢谢,这些评论非常有用! – Ell 2010-11-02 16:12:09