Câu trả lời của Gregory Weir là yêu thích của tôi về cách cấu trúc các thể hiện của vật phẩm để thực hiện nhiều vai trò.
Để tải từ tệp:
Đầu tiên, sử dụng YAML. YAML là một ngôn ngữ mô tả dữ liệu đặc trưng; nó có thể được phân tích cú pháp tương đối nhanh, được đọc và chỉnh sửa bởi con người, hỗ trợ dữ liệu nhị phân và thư viện tồn tại cho hầu hết các ngôn ngữ lập trình, bao gồm cả Java. Điều này giải quyết "làm thế nào để tôi lấy dữ liệu từ các tệp vào các đối tượng?"
Thứ hai, sử dụng mô hình cân nặng . Hầu hết dữ liệu bạn đọc từ các tệp đó là tĩnh. Nó sẽ không thay đổi theo từng trường hợp ("rìu gây sát thương cơ bản 1d10 và phá gỗ nhưng không phải đá" - điều đó đúng với cả năm trục mà người chơi có). Những gì bạn thực sự đọc được từ các tệp YAML là những định nghĩa rõ ràng này và các trường hợp vật phẩm riêng lẻ của bạn có các tham chiếu không được đặt tên (và không đổi) cho các dữ liệu này, cùng với dữ liệu theo trường hợp như "Có bao nhiêu thay đổi trước khi tôi phá vỡ?", "Người chơi có đưa ra không cho tôi một tên tùy chỉnh? ", và như vậy.
Bằng cách chia sẻ dữ liệu cá thể chéo trong một đối tượng, bạn bảo toàn nhiều bộ nhớ và giúp dễ dàng cập nhật các mục mà không cần trạng thái trò chơi bền vững (lưu trò chơi hoặc cơ sở dữ liệu người chơi).
Vì vậy, cấu trúc lớp của bạn trông giống như:
- Mục lớp - Một ví dụ cho mỗi mục
- Sở hữu một vũ khí
- Sở hữu một ví dụ về Công cụ
- Có tên tùy chỉnh, v.v.
- vũ khí lớp - (Tối đa) một ví dụ cho mỗi mục
- Is-a ItemComponent
- Tham chiếu đến WeaponDef
- Có - một mức bùa mê thưởng, v.v.
- lớp Tool - (Tối đa) một thể hiện cho mỗi mục
- Is-a ItemComponent
- Tham chiếu đến ToolDef
- Có độ bền, vv
- class WeaponDef - Một ví dụ cho mỗi loại vũ khí
- Đọc từ một tập tin, các trường nên không đổi.
- Có một lượng sát thương cơ bản, 1 hoặc 2 tay, v.v.
- class ToolDef - Một thể hiện cho mỗi loại công cụ
- Đọc từ một tập tin, các trường nên không đổi.
- Có độ bền cơ bản, vật liệu có thể phá vỡ, v.v.