我目前正在將遊戲引擎作爲大學模塊的一部分,其中一部分是消息處理系統。我希望改進講師的實施,所以對我的可能改變提出任何建議或批評是非常受歡迎的。關於消息處理系統的建議
當前消息結構
struct Message
{
Entity* entity;
std::string message;
void* data;
Message(Entity* entity, std::string message, void* data):
entity(entity), message(message), data(data) {}
};
最初的實現不僅具有消息發送到實體,但我打算使用的「接口」,以允許遊戲引擎的任何部件,以便能夠接收消息。
class IMessageReceiver
{
public:
virtual void handleMessage(const Message& message) {}
};
struct Message
{
IMessageReceiver* receiver;
std::string message;
void* data;
};
//examples
class Entity : public IMessageReceiver { };
class Game : public IMessageReceiver { };
我對當前系統的一個問題是數據的void *(我只是不喜歡使用void *)。然後將它轉換爲它需要在handleMessage函數內部的類型,因爲我知道它應該接收哪些數據(取決於消息字符串) - 通常,它一直是3D矢量或實體,直到此時爲止,但如果我把它發送給實體以外的東西,那麼這可能會改變。
我想改變它以使用模板,而不是;然而,我不確定我會如何去做這件事。
template <typename T>
struct Message
{
IMessageReceiver* receiver;
std::string message;
T* data;
};
我對基本層面的模板有點熟悉,但我可能缺乏對模板技巧的一些更深入的瞭解。我知道我可以在創建新消息時將它傳遞給數據類型。
//example
Entity* entity;
vec3 someVec;
Message<vec3> message(entity, "Fire", someVec);
MessageHandler::sendMessage(message);
但我怎麼會那麼寫起來IMessageReceiver中的handleMessage函數聲明,因爲不同的實現類將在發送給他們的消息不同的數據?
virtual void handleMessage(const Message<?>& message) {}
我有做IMessageReceiver模板類,以及思想,所以當一個類從它繼承他們設定數據,他們收到的信息將是類型。
template <typename T>
class IMessageReceiver
{
public:
virtual void handleMessage(const Message<T>& message) {}
};
class Entity : IMessageReceiver<vec3> {};
然而,這意味着,一個消息接收機只能接收一種類型的信息,但也可能有一種情況,其中我有可能的不同類型的數據發送到同一個接收機 - 例如,一個派生類實體通常收到一個vec3作爲消息的數據部分,但是新的場景要求它接收另一個實體。 我發現的另一個問題是,只有抽象基類Entity從IMessageReceiver繼承(不是每個實體的派生類,它們都接收不同類型的不同信息 - 或者可能),這就意味着使Entity成爲模板類。這可以通過傳遞來設置。但是我仍然會有這種僵化的系統,一些東西只能接收一種數據類型的消息。
也許void *是'最好'的方法,也許使用接口類不是。我不知道。
請隨時提出你可以想到的任何建設性的批評。我並不是要求某人爲我寫信,我只是尋求建議來實現我正在嘗試做的事情。基本上,我希望能夠使引擎的任何組件都能夠接收消息;在消息中發送的數據不是預定義的;並且最好不使用void *。
感謝您花時間閱讀本文。如果您需要任何其他信息,請讓我知道。
加文
你不能只使用一個只有目標實體和消息的基類嗎?你可以從它得到你的特定消息?我可能會使用一個枚舉的消息ID,而不是一個字符串,但也許這只是我:) –
@MartinJames那麼,你是否建議有一個基本的消息類,有接收消息和消息本身的對象(無論是枚舉,字符串還是別的東西 - string被用作演講者的實現,但它可能是另一件事我會改變),然後如果我想發送一個帶'vec3'的消息作爲數據,我會派生一個'Vec3Message '班?然後,對於我將作爲消息的數據部分發送的每種可能類型執行此操作? – LoneJock
這就是我在想的,是的:) –