Các vật phẩm trong một game nhập vai nên được mã hóa cứng hoặc được tải theo một cách khác?


7

Các vũ khí tĩnh (ví dụ .. Thanh kiếm sắt, Rìu thần thoại) có phải là các lớp (tĩnh) của riêng chúng bắt nguồn từ thứ gì đó giống như ItemWeapon, bản thân nó có nguồn gốc từ một Itemlớp tiêu chuẩn với các phương thức (kế thừa) của riêng chúng không?

Hoặc có thể chỉ nên có một Itemlớp tiêu chuẩn , một ItemWeaponlớp, và sau đó mọi vũ khí chỉ là một ItemWeaponthể hiện được nạp vào lúc bắt đầu trò chơi?

Nếu tôi định làm theo cách đó, tôi sẽ tải tất cả vật phẩm và vũ khí vào trò chơi ở đâu? trong đó?

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, 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 ' t làm gì

Câu trả lời:


11

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 LoadItemschứ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 LoadItemstừ 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",
        ...
    }
]

nói về điện trở / điểm yếu nên thực sự là một mảng nổi với chỉ số là các điện trở cụ thể như 0 là lửa, 1 là băng, 2 là sét, v.v.
baiomu

@ Bạch Dương Một mảng sẽ là lý tưởng, vâng. Nếu sau đó bạn sử dụng #define FIRE 0hoặc public const int FIRE = 0;vv cho các yếu tố / điện trở khác nhau, bạn có thể dễ dàng giới thiệu chúng từ mảng trong mã như vậy : if (resistances[FIRE]) > 20.0f) {...}.
Kỹ sư

1

Đối với hầu hết các phần, nó thực sự sẽ tùy thuộc vào sở thích cá nhân và cách bạn xem nó. Cá nhân, tôi sẽ xem nó là Vật phẩm là lớp cơ sở hàng đầu và Vũ khí mở rộng nó. Có thể với Thiết bị ở giữa, đại loại như:

Item <- Equipment <- Armor
Item <- Equipment <- Weapon
Item <- Food
Item <- Medicine

Sau đó, tôi sẽ có các tệp cấu hình chỉ định tất cả các vũ khí và các bộ phận phổ biến của chúng như sát thương, tốc độ tấn công, có thể là độ bền.

Nếu bạn có thứ gì đó thực sự độc đáo, bạn có thể xem xét một lớp kế thừa từ vũ khí hoặc bạn có thể có nó trong một trường trong tệp cấu hình là đúng / sai cho dù mỗi vũ khí có khả năng đó hay không.

Tôi sẽ tránh xa mọi vũ khí có lớp học riêng. Nếu bạn đã làm điều đó, sẽ có một tấn mã trùng lặp hoặc một tấn các lớp kế thừa mọi thứ và không có mã thực sự trong đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.