Tôi đang cố gắng thực hiện một hệ thống thực thể dựa trên thành phần nhưng hơi bối rối về cách tôi nên xử lý tin nhắn. Có hai vấn đề tôi muốn giải quyết để tôi có thể kiểm tra hệ thống. Dưới đây là mã tôi có cho đến nay,
Lớp thực thể:
class Entity{
public:
Entity(unsigned int id):
id_(id)
{};
void handleMessage(BaseMessage &message){
for(auto element: components_){
element.second->handleMessage(message);
}
}
template<class T>
void attachComponent(T *component){
//Consider making safer in case someone tries to attach same component type twice
components_[typeid(T).hash_code()] = component;
}
template<class T>
void detachComponent(void){
components_.erase(typeid(T).hash_code());
}
template<class T>
T* getComponent(void)const{
return *components_.find(typeid(T).hash_code());
}
unsigned int getInstanceID(void)const{
return id_;
}
private:
unsigned int id_;
std::map<size_t, BaseComponent*> components_;
};
Các lớp Thành phần và Thông báo Cơ sở:
class BaseComponent{
public:
virtual void handleMessage(BaseMessage &message){};
};
class BaseMessage{
public:
virtual int getType(void) = 0;
};
1. Xử lý loại tin nhắn
Câu hỏi đầu tiên của tôi là làm thế nào tôi nên xử lý các loại thông báo khác nhau (xuất phát từ BaseMessage).
Tôi đã nghĩ ra hai cách để xử lý các loại tin nhắn của các loại tin nhắn dẫn xuất. Một là tạo ra một hàm băm (tức là sử dụng FNV) từ một chuỗi đặt tên loại thông báo và sử dụng hàm băm đó để xác định loại thông báo. Vì vậy, handleMessage(BaseMessage &message)
hàm, trước tiên sẽ trích xuất hàm băm này từ tin nhắn và sau đó thực hiện static_cast thành loại thích hợp.
Phương thức thứ hai là sử dụng một khuôn mẫu như sau (tương tự như các attachComponent
phương thức của lớp thực thể),
template<class T>
handleMessage(T& message){};
và thực hiện các chuyên môn cho từng loại thông báo mà thành phần cụ thể sẽ thực hiện.
Có bất kỳ nhược điểm nào khi sử dụng phương pháp thứ hai không? Còn về hiệu suất, tại sao tôi không thấy loại sử dụng này thường xuyên hơn?
2. Xử lý đầu vào
Câu hỏi thứ hai của tôi là cách tối ưu (về độ trễ và dễ sử dụng) để xử lý đầu vào là gì?
Suy nghĩ của tôi là tạo ra một InputHandlerComponent
thanh ghi với lớp bàn phím để nghe các phím bấm cụ thể được xác định có thể có trong một số tệp. Ví dụ
keyboard.register( player.getComponent<InputHandler>() , 'W')
Tôi ước có một hướng dẫn ngắn gọn hơn cho các hệ thống dựa trên thành phần nhưng tôi đoán có nhiều cách khác nhau để làm những việc tương tự. Tôi có nhiều câu hỏi hơn nhưng tôi nghĩ sẽ khôn ngoan hơn khi lần đầu tiên thử thực hiện những gì tôi có thể.