面向游戏开发中碰撞检测的优秀面向对象类设计

时间:2012-04-11 04:40:28

标签: oop collision-detection

我想学习如何为游戏开发中两个对象之间的碰撞创建良好的面向对象(OO)设计实践。

假设我有一个SpaceShip类和一个Meteor类。当Meteor与SpaceShip发生碰撞时,SpaceShip将被摧毁。

问题: 我应该用什么课程来检查流星和宇宙飞船之间是否存在碰撞以及碰撞解决方法(摧毁宇宙飞船)?是在SpaceShip类还是Meteor类?或者也许我应该放在另一个班级,即。 GameArea或GameController类?

注意:为简单起见,假设Meteor和SpaceShip是图像资源的形式。我习惯使用Java语言,但其他语言也可以。

4 个答案:

答案 0 :(得分:12)

更自然地认为碰撞检测是一种不属于宇宙飞船或流星类的责任。特别是当它在不同方向上具有多个碰撞可能性时变得复杂。如果将这个逻辑放在这两个类中,则需要引用其周围的许多其他对象,这些对象是不合适的。

你可以在一个单独的类上使用它,例如 CollisionDetector ,它可以跟踪游戏空间中所有对象的坐标并检测碰撞。在我看来,防止碰撞似乎也是一个单独的责任,应该属于不同的类别。你可以有一个单独的类 CollisionResolver 。根据要求, CollisionDetector 可以与 CollisionResolver 对话。

CollisionResolver 可能需要能够与太空飞船交谈,目的是建议他们改变方向,或命令向流星发射导弹。

CollisionDetector CollisionResolver 可以位于 GameSpace / * GameController *中。等。

这会促进 Single Responsibility Principle ,因此每个组件只会执行一项重点任务。

答案 1 :(得分:2)

在我看来,碰撞检测不是对象的一部分......它应该被定义为其他东西 - 一些物理管理器等。这样你的对象将独立于碰撞算法。

另一件事是在游戏中通常对象由几个层(组件)组成:图形层,物理层,逻辑层。 这样物理管理器只管理给定对象的物理组件。

class GameObject 
{
    RenderComponent  m_renderComponent;
    LogicComponent   m_aiComponent;
    PhysicsComponent m_physicsComponent;
};

答案 2 :(得分:1)

好吧,我通常创建一个(有时是通用的)GameObject类或具有碰撞方法的接口。例如:

template< typename T = int > class GameObject
{
public:
    bool collides(const GameObject& obj);
};

// usage
GameObject<int> my_obj, your_obj;
if(my_obj.collides(your_obj)) { ... };

我有时(但很少)做的另一件事是创建一个单独的GamePhysics类:

template< typename T > class GamePhysics
{
public:
    /* you may make this static or the class a singleton */
    void detect_collision(const T& obj, const T& obj2);
};

答案 3 :(得分:0)

在Java(或任何其他OO语言)中,我会在游戏中所有移动对象的共同祖先类中放置 CollisionDetected回调/事件

这是对游戏的简化描述:

  • 在游戏中,通常会有游戏循环。游戏循环就像一个而(true)循环,它连续运行(有点像应用程序的主UI线程),并且每一步都检查对象的变化,应该更新的内容应该调用哪些事件(以及更多......)。

  • 对于响应性,此循环应该每秒循环多次。

  • 在此循环中, Physics Engine 对象应该不断更新其状态。这将是一个独立类的实例对象。这个引擎应检测对象之间的碰撞,并在所有碰撞的对象上调用CollisionDetected事件。

这是一个想法,而不是最终解决方案......