2012-04-11 162 views
15

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

比方说,我有一个SpaceShip类和一个Meteor类。当陨石与太空船发生碰撞时,太空船将被摧毁。

问题: 我应该用哪种方法来检查流星和太空船之间是否存在碰撞以及碰撞解决方法(摧毁太空船)?它是在太空船班还是流星班?或者,也许我应该把另一个班级,即。 GameArea或GameController类?

注意:为了简单起见,假设流星和太空船采用图像资源的形式。我习惯使用Java语言,但其他语言也可以。

+0

我会投票给在'GameController'执行碰撞检测(或任何类是管理您的游戏区),以'collidedWithObject(游戏对象该对象)方法在Meteor和SpaceShip(以及可能与事物碰撞的任何其他对象)上被调用以通知碰撞对象。 – aroth 2012-04-11 04:46:53

+0

Thx为您的投票。你是否知道一个关于面向对象游戏设计的好教程或书籍? – null 2012-04-11 07:12:21

回答

1

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

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); 
}; 
+0

Thx。你会在哪里把“if(my_obj.collides(your_obj)){...};”码? GameController? – null 2012-04-11 06:32:58

+1

@你可以在任何需要检测碰撞的地方使用。主循环,GameController,瓦片渲染器等。 – ApprenticeHacker 2012-04-11 07:45:40

2

碰撞检测,在我看来,不是一个对象的一部分...它应该被定义为别的东西 - 一些物理管理器等等。这样你的对象将独立于碰撞算法。另一件事是在游戏中,通常对象由几个图层(组件)组成:图形层,物理层,逻辑层。 这种方式物理管理器只管理给定对象的物理组件。

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

那么你的意思是碰撞逻辑应该驻留在PhysicsComponent类中? – null 2012-04-11 08:27:04

+1

是...碰撞组件(例如某个边界框)可以在物理组件内。 – fen 2012-04-11 08:56:39

10

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

你可以在一个单独的类上,如CollisionDetector,它可以跟踪游戏空间中所有对象的坐标并检测碰撞。在我看来,预防碰撞似乎也是一个单独的责任,应该在不同的课堂上。你可以有一个单独的类CollisionResolver为此。根据要求,CollisionDetector可以与CollisionResolver交谈。

CollisionResolver可能需要能够与Spaceships交谈,以便建议他们改变方向,或命令发射导弹朝向Meteor。

CollisionDetectorCollisionResolver可以在游戏空间/* GameController内坐下*。等等..

这将促进Single Responsibility Principle因此,每个组件将只做一个专注的任务。

0

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

这是一个游戏的简化描述:

  • 在游戏中,通常有一个游戏环。游戏循环就像是一个,而(true)循环连续运行(有点像应用程序的主UI线程),并且在每一步都检查对象发生了什么变化,应该更新什么以及应该发生什么事件称为(和更多...)。

  • 对于响应速度,此循环应循环多次,每秒一次。

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

这是一个想法,而不是最终的解决办法...