Để có được các thành phần để có thể cập nhật mọi khung hình (và loại bỏ chức năng này khỏi các thành phần không cần thiết), tôi đã có ý tưởng tạo ra một thành phần UpdateComponent. Các thành phần khác như MovableComponent
(giữ vận tốc) sẽ kế thừa từ IUpdatable
lớp trừu tượng. Điều này buộc MovableComponent
phải thực hiện một Update(gametime dt)
phương thức và một phương thức khác RegisterWithUpdater()
đưa ra UpdateComponent
một con trỏ tới MovableComponent
. Nhiều thành phần có thể làm điều này và sau đó UpdateComponent
có thể gọi tất cả các Update(gametime dt)
phương thức của chúng mà không cần phải quan tâm đến chúng hoặc chúng là gì.
Câu hỏi của tôi là:
- Điều này có vẻ như bất cứ điều gì là bình thường hoặc được sử dụng bởi bất cứ ai? Tôi không thể tìm thấy bất cứ điều gì về chủ đề này.
- Làm thế nào tôi có thể duy trì một trật tự cho các thành phần như vật lý sau đó thay đổi vị trí? Điều này thậm chí còn cần thiết?
- Các cách khác để đảm bảo rằng các thành phần nên xử lý mọi khung hình trên thực tế được xử lý là gì?
EDIT
Tôi nghĩ rằng tôi sẽ xem xét làm thế nào để cung cấp cho người quản lý thực thể một danh sách các loại có thể cập nhật. Sau đó TẤT CẢ các thành phần của loại đó có thể cập nhật thay vì quản lý nó trên mỗi thực thể (dù sao chỉ là các chỉ mục trong hệ thống của tôi).
Vẫn. Câu hỏi của tôi vẫn còn hiệu lực với tôi. Tôi không biết điều này có hợp lý / bình thường không, hay những gì người khác có xu hướng làm.
Ngoài ra, những người ở Insomniac thật tuyệt vời! /BIÊN TẬP
Mã sôi cho ví dụ trước:
class IUpdatable
{
public:
virtual void Update(float dt) = 0;
protected:
virtual void RegisterAsUpdatable() = 0;
};
class Component
{
...
};
class MovableComponent: public Component, public IUpdatable
{
public:
...
virtual void Update(float dt);
private:
...
virtual void RegisterWithUpdater();
};
class UpdateComponent: public Component
{
public:
...
void UpdateAll();
void RegisterUpdatable(Component* component);
void RemoveUpdatable(Component* component);
private:
...
std::set<Component*> updatables_;
};