Làm cách nào tôi có thể định nghĩa các mục trong trò chơi RPG của mình như trò chơi Java?


21

Tôi tình cờ làm việc với một trò chơi kiểu RPG trong Java nhưng tôi gặp khó khăn khi tìm hiểu làm thế nào tôi có thể có các vật phẩm có thể làm nhiều việc khác nhau mà không tạo ra một lớp khác nhau cho mỗi vật phẩm.

Ví dụ, làm thế nào tôi có thể tạo ra một Rìu có thể chặt cây và tấn công quái vật?

Nếu tôi mở rộng lớp băm hoặc lớp vũ khí thì tôi không thể mở rộng lớp khác.

Nếu tôi có chặt và vũ khí là một giao diện thì tôi sẽ có rất nhiều mã trùng lặp khi một con dao găm cũng có thể tấn công quái vật và một cây rìu khác có thể chặt cây.

Tôi hy vọng có một cách để có một lớp Item duy nhất và tải các mục và khả năng tương ứng của chúng từ một tệp. Nếu đó là có thể làm thế nào nó có thể được thực hiện? Nếu không thì cách tốt nhất để có vật phẩm trong trò chơi là gì?

Câu trả lời:


15

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.

18

Mẫu thiết kế Thành phần (không phải Tổng hợp) rất phù hợp cho mục đích này: http://gameprogrammingpotypes.com/component.html

Về cơ bản, Axe sẽ là một thể hiện của lớp Item có chứa WeaponComponent và ToolComponent (có thể). Để kiểm tra xem thứ gì đó có thể được sử dụng làm vũ khí hay không, hãy kiểm tra xem nó có gắn WeaponComponent hay không, sau đó nói chuyện với cá thể WeaponComponent đó để lấy thông tin vũ khí của vật phẩm.

Tải từ một tập tin là một bài tập riêng biệt, tất nhiên.


Và tất nhiên, một khi bạn có các thành phần, bạn có thể sử dụng tốt các giao diện một lần nữa. Loại Axe của bạn có thể triển khai IChopper và IWeapon nhưng sau đó có thể hiển thị hành vi của thành phần cho nó, cho phép bạn sử dụng lại cả loại và triển khai khi cần và cắt bỏ kiểm tra cho các thành phần. Nếu tất cả các trục có cùng khả năng nhưng chỉ số khác nhau, thì bạn là vàng. Nếu bạn cần các vật phẩm để có các khả năng độc đáo, bạn có thể cần triển khai bộ sưu tập thành phần trò chơi và có thói quen cập nhật của bạn truy vấn các đối tượng để biết chúng có thể làm gì thông qua các thành phần nào có mặt.
CodexArcanum

6
@CodexArcanum: "Loại Axe của bạn có thể triển khai IChopper và IWeapon nhưng sau đó có thể phơi bày hành vi của thành phần cho nó" - Điểm của vấn đề này là gì? Nó chỉ làm hỏng hệ thống phân cấp lớp của bạn. Điểm quan trọng của mẫu thành phần là bạn không cần lớp Axe hoặc giao diện IChopper hoặc giao diện IWeapon, chỉ các thành phần Chopper và Weapon cụ thể và Vật phẩm cấp cao nhất.

Tôi hiện đang làm việc trên một hệ thống thành phần cho các mục trò chơi của mình và thực sự chỉ có một khiếu nại lớn về cách sử dụng mô hình. Với các thành phần của Vũ khí, Trang phục và Vật phẩm, một vật phẩm có thể bị "hỏng" về mặt lý thuyết về các mặt hàng không thể là Vũ khí và Trang phục, hoặc Trang phục cũng có thể sử dụng được. Về mặt logic, một mục chỉ có thể là một "Thành phần chính", nhưng bằng cách hạn chế các thành phần bạn đang phá vỡ nhu cầu về một hệ thống thành phần cùng nhau. Do đó, một trong những sai sót cơ bản với một hệ thống tuyệt vời khác
Krythic
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.