(Những gì tôi mô tả dựa trên thiết kế này: Khung hệ thống thực thể là gì ? , Cuộn xuống và bạn sẽ tìm thấy nó)
Tôi đang gặp một số vấn đề khi tạo một hệ thống thành phần thực thể trong C ++. Tôi có lớp Thành phần của mình:
class Component { /* ... */ };
Đó thực sự là một giao diện, cho các thành phần khác được tạo ra. Vì vậy, để tạo một thành phần tùy chỉnh, tôi chỉ cần thực hiện giao diện và thêm dữ liệu sẽ được sử dụng trong trò chơi:
class SampleComponent : public Component { int foo, float bar ... };
Các thành phần này được lưu trữ bên trong một lớp Thực thể, cung cấp cho mỗi phiên bản của Thực thể một ID duy nhất:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
Các thành phần được thêm vào thực thể bằng cách băm tên của thành phần (đây có thể không phải là một ý tưởng tuyệt vời). Khi tôi thêm một thành phần tùy chỉnh, nó được lưu trữ dưới dạng một loại Thành phần (lớp cơ sở).
Bây giờ, mặt khác, tôi có giao diện Hệ thống, sử dụng giao diện Node bên trong. Lớp Node được sử dụng để lưu trữ một số thành phần của một thực thể (vì Hệ thống không quan tâm đến việc sử dụng tất cả các thành phần của thực thể). Khi Hệ thống phải update()
, nó chỉ cần lặp qua các Nút mà nó được lưu trữ được tạo từ các thực thể khác nhau. Vì thế:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
Bây giờ là vấn đề: giả sử tôi xây dựng SampleNodes bằng cách chuyển một thực thể đến SampleSystem. Sau đó, SampleNode sẽ "kiểm tra" nếu thực thể có các thành phần bắt buộc được sử dụng bởi SampleSystem. Vấn đề xuất hiện khi tôi cần truy cập vào thành phần mong muốn bên trong Thực thể: thành phần được lưu trữ trong Component
bộ sưu tập (lớp cơ sở), vì vậy tôi không thể truy cập thành phần đó và sao chép nó sang nút mới. Tôi đã tạm thời giải quyết vấn đề bằng cách chuyển Component
xuống loại có nguồn gốc, nhưng tôi muốn biết liệu có cách nào tốt hơn để làm việc này không. Tôi hiểu nếu điều này có nghĩa là thiết kế lại những gì tôi đã có. Cảm ơn.