我試圖製作2D遊戲(我的第一個)。我不是在尋找算法來確定物體是否碰撞,而是如何組織一切。我很難確定哪些職業應該承擔什麼責任,以至於我開始覺得自己很愚蠢。 =))遊戲實體:處理衝突
我猜我的主要班級是Entity
(及其子女)和EntityManager
。例如,實體應該提供什麼接口?實體應該如何意識到它們與另一個實體衝突—如果管理者可能更新它們並將CollisionEvent
傳遞給每個實體的handleCollision
函數?任何建議都比歡迎。
我試圖製作2D遊戲(我的第一個)。我不是在尋找算法來確定物體是否碰撞,而是如何組織一切。我很難確定哪些職業應該承擔什麼責任,以至於我開始覺得自己很愚蠢。 =))遊戲實體:處理衝突
我猜我的主要班級是Entity
(及其子女)和EntityManager
。例如,實體應該提供什麼接口?實體應該如何意識到它們與另一個實體衝突—如果管理者可能更新它們並將CollisionEvent
傳遞給每個實體的handleCollision
函數?任何建議都比歡迎。
我假設EntityManager包含所有實體,所以經理是需要檢查所有實體之間的collisons的人。像這樣
for(int i = 0 ; i < totalEntities ; ++i)
for(int j = i+1 ; j < totalEntities ; ++j)
{
CollisionInfo info;
if(CheckCollision(entities[i], entities[j], info))
{
// Okay, what we should do? I suggest two solutions
// 1. simple one
entities[i].OnCollide(info);
entities[j].OnCollide(info);
// 2. event-or-message driven system
EventManager::Instance()->SendEvent(COLLISION_EVENT, info)
}
}
第一個可能是最簡單的一個。但是,如果還有其他物體對這次碰撞事件感興趣呢?像聲音,記錄或評分系統?即使是與碰撞無關的實體也可能想要「知道」這個事件,以便他們可以改變他們的行爲。 (想想老闆怪物在你的孩子被你殺死後會變得更加憤怒!)
所以,爲了使它更加靈活,#2已經到來。首先,你需要有自己的event-or-message system
(你可以認爲它是Windows消息系統),其中對象可以訂閱他們想要處理的特定消息。然後,EntityManager可以簡單地通過發送消息來傳播碰撞事件。實體可以訂閱這個衝突消息類型,他們應該知道他們是否需要通過檢查信息來處理這個特定的衝突。同樣,你的評分系統可以訂閱它並計算殺死的新分數。
如果遊戲很簡單,你可以去#1,但我強烈推薦#2,你會非常滿意。祝你好運! :)