2017-06-24 56 views
0

我有一個奇怪的問題。我已經開始在C++/SFML中實現簡單的遊戲引擎。 我實現了一個消息和消息隊列系統,以便將模塊解耦並避免任何令人困惑的依賴關係。我還實現了一個類Entity,它代表遊戲中的一個對象(包含它的位置,精靈,等等)。成員函數的不同實現C++

每個實體都有一個叫做「on_message」的函數,當指定的實體接收到消息時,它被消息隊列調用。 (例如:如果實體P1是來自P2的消息的目的地,則msg_queue將調用p1.on_message傳遞msg_type「say damage」給它做某事

我的問題,所有實體(來自類實體的對象)現在有相同的函數on_message的實現,但是這個函數應該不同於實體(因此當按下「say」空間時玩家的行爲與敵人不同)

我得到的一個想法是使用繼承,但是我認爲這是不正確的,如果遊戲有100個實體,我應該讓100類!

有什麼有效的想法可以解決這個問題嗎? Th預先安排

+1

「我應該做100班!」?有什麼奇怪的呢?它不像編譯器變得很累......類可以模擬不同類型的「東西」,所以如果你有100個實體類型,將它們建模爲類是不荒謬的。 –

+0

我認爲還有另一種方式可以這樣做,如果隨着遊戲組件的增長,類的數量會不斷增加? –

+0

玩家與其他玩家有着明顯的區別,但其他玩家會如何區別?你可以用數據來模擬這些差異,而不是功能。 – Sopel

回答

0

我得到的一個想法是使用繼承,但我認爲它不是正確的,就好像遊戲有100個實體我應該讓100級!

這實際上完全是可能的,它甚至可以是那些定義明確的實體擁有自己的類的「正確的事物」。如果除了消息接收行爲之外,您還需要數據成員或其他自定義函數將所有內容封裝在一個類中,這是一個好主意。另一方面,如果你有很多非常相似的實體,當接收到一些消息時只有一些行爲上的差異,你可能有一個公共的超類,它提供了一個定製點,例如,一個可轉讓的std::function。事情是這樣的:

struct Entity { 
    ... 
    virtual ret on_message(msg_type msg) = 0; 
}; 

... 

struct LightweightCustomEntity : public Entity { 
    std::function<ret(msg_type)> custom_on_message; 

    virtual ret on_message(msg_type msg) override { 
     if(!custom_on_message) return ret(); 
     return custom_on_message(msg); 
    } 
}; 

// ... 

// in reality this would be a smart pointer or whatever 
Entity *e = new LightweightCustomEntity; 
e->custom_on_message = [](msg_type msg) { 
    if(msg.type == SAY_DAMAGE) { 
     return ret(42); 
    } 
    return ret(); 
}; 

這讓一些更靈活的運行時,卻發現你不是真的獲益良多在緊湊 - 尤其是因爲C++ 11,我們可以繼承構造函數,定義一個新的類從Entity繼承並且重寫on_message或多或少地使用相同的代碼。

+0

對不起,但我只有繼承和重寫,你能詳細解釋你在這個代碼中做什麼? –

+0

什麼不清楚? lambda函數? '的std :: function'?看看http://www.cprogramming。COM/C++ 11/C++ 11-λ-closures.html –