Vũ khí là dữ liệu. Bạn thực sự không nên giữ dữ liệu được mã hóa cứng. Cấu trúc / lớp của bạn phải chứa tất cả các tham số cần thiết để xây dựng dữ liệu của vũ khí từ đầu, ví dụ:
struct Weapon
{
string name;
int damageMin;
int damageMax;
bool entangle;
bool canHitNoncorporeal;
float resistFire;
float resistElec;
float attackSpeed;
//etc. ad nauseam
}
Và sau đó nói bằng văn bản / .CSV:
Mithril Sword,15,30,false,true,0,10,4.5
Leather Whip,2,6,true,false,0,0,11
Và vâng, bạn thường sẽ tải thông qua một LoadItems
chức năng được gọi trong Init
, nhưng hãy nhớ tách nó ra vì bạn cũng có thể phải gọi LoadItems
từ nơi khác, chẳng hạn như LoadGame
.
Nếu một số vũ khí có các thuộc tính đặc biệt như thực hiện nhiều đòn tấn công hoặc hiệu ứng khác nhau thì sẽ có ích khi biến chúng thành các lớp riêng biệt để làm điều đó trên cơ sở thay vì có mọi Vũ khí trong trò chơi có chức năng đó trừ khi nó không có làm bất cứ gì?
Không. Bạn nên làm điều đó như là một lớp duy nhất, như cuối cùng nó là một tập hợp hữu hạn các tùy chọn trên tất cả các vũ khí trong một trò chơi nào đó, và làm nó theo cách này giúp bạn nhập nhanh các mặt hàng dễ dàng (ngoại lệ có thể là đoàn nhiều sau, vì bây giờ, làm điều đó như một lớp , yếu tố ra sau theo SRP ). Lý do khác là việc xử lý kết hợp các lớp tĩnh nhanh chóng trở nên khó khăn vì những lý do tôi sẽ không đi vào đây. Thực sự không có gì sai khi lưu trữ một chút dữ liệu bổ sung cho vũ khí, đó là những gì bộ đệm CPU dành cho. Và tệ nhất, bạn luôn có thể thu gọn dữ liệu của mình, từng chút một, sau này.
Nếu bạn thường xuyên thay đổi tùy chọn (thành viên), bạn sẽ cần sử dụng định dạng được đặt tên như JSON / XML / YAML, nếu không, bạn sẽ phải lo lắng về việc thay đổi thứ tự như trong CSV ở trên, không đề cập đến Mỗi mục nhập là gì, nhưng chỉ cung cấp chúng theo thứ tự (điều này an toàn hơn):
[
{
"name": "Mithril Sword",
"damageMin": 15,
"damageMax": 30,
"entangle": false,
...
},
{
"name": "Leather Whip",
...
}
]