Gần đây tôi đã quyết định cải tổ kiến trúc trò chơi của mình để thoát khỏi hệ thống phân cấp lớp sâu và thay thế chúng bằng các thành phần có thể định cấu hình. Hệ thống phân cấp đầu tiên tôi thay thế là hệ thống phân cấp Mục và tôi muốn một số lời khuyên để biết liệu tôi có đang đi đúng hướng hay không.
Trước đây, tôi có một hệ thống phân cấp giống như thế này:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Không cần phải nói rằng nó đã bắt đầu trở nên lộn xộn và đây không phải là giải pháp dễ dàng cho các vật phẩm cần có nhiều loại (tức là một số thiết bị được sử dụng trong tổng hợp vật phẩm, một số thiết bị có thể ném được, v.v.)
Sau đó tôi đã cố gắng cấu trúc lại và đặt chức năng vào lớp mục cơ sở. Nhưng sau đó tôi đã lưu ý rằng Mục có rất nhiều dữ liệu không được sử dụng / không cần thiết. Bây giờ tôi đang cố gắng thực hiện một thành phần như kiến trúc, ít nhất là cho các mục của tôi trước khi thử làm điều đó với các lớp trò chơi khác của tôi.
Đây là những gì tôi hiện đang nghĩ cho việc thiết lập thành phần:
Tôi có một lớp vật phẩm cơ sở có các khe cho các thành phần khác nhau (ví dụ: khe thành phần thiết bị, khe thành phần chữa bệnh, v.v. cũng như bản đồ cho các thành phần tùy ý) nên đại loại như thế này:
class Item
{
//Basic item properties (name, ID, etc.) excluded
EquipmentComponent* equipmentComponent;
HealingComponent* healingComponent;
SynthesisComponent* synthesisComponent;
ThrowComponent* throwComponent;
boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents;
}
Tất cả các thành phần vật phẩm sẽ kế thừa từ một lớp ItemComponent cơ sở và mỗi loại Thành phần chịu trách nhiệm cho động cơ biết cách thực hiện chức năng đó. tức là HealingComponent cho các thợ máy chiến đấu biết cách tiêu thụ vật phẩm này như một vật phẩm hồi máu, trong khi throwComponent nói với cỗ máy chiến đấu cách coi vật phẩm đó là một vật phẩm có thể ném được.
Bản đồ được sử dụng để lưu trữ các thành phần tùy ý không phải là thành phần mục chính. Tôi đang ghép nối nó với một bool để cho biết liệu Container Container có nên quản lý ItemComponent hay không nếu nó được quản lý bởi một nguồn bên ngoài.
Ý tưởng của tôi ở đây là tôi xác định các thành phần cốt lõi được sử dụng bởi công cụ trò chơi của mình và nhà máy sản xuất vật phẩm của tôi sẽ chỉ định các thành phần mà vật phẩm thực sự có, nếu không chúng là null. Bản đồ sẽ chứa các thành phần tùy ý thường được thêm / tiêu thụ bởi các tập lệnh.
Câu hỏi của tôi là, đây có phải là một thiết kế tốt? Nếu không, làm thế nào nó có thể được cải thiện? Tôi đã xem xét việc nhóm tất cả các thành phần vào bản đồ, nhưng sử dụng lập chỉ mục chuỗi dường như không cần thiết cho các thành phần mục cốt lõi