2012-04-11 163 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事件。

這是一個想法,而不是最終的解決辦法...