Các vấn đề đặt tên API hệ thống thực thể dựa trên thành phần


7

Công cụ của tôi sử dụng một hệ thống thực thể dựa trên thành phần bên trong và tôi muốn liên kết nó với Lua để viết kịch bản.

Bây giờ, tôi muốn lưu những người viết kịch bản cho nó gõ công việc. Trong C ++, để đặt vị trí của một thực thể, bạn sẽ làm như sau:

pEntity->GetComponent< CPoint >()->SetPos( Vector( X, Y ) );

Điều đó có nghĩa là, nếu tôi liên kết nó với Lua 1: 1, bạn cũng phải:

ent:GetComponent( CP_POINT ):SetPos( 123, 456 )

Nhưng hãy trung thực, bạn có muốn gõ thật nhiều chỉ để đặt vị trí của một thực thể không?

Tôi không nghĩ vậy, đó là lý do tại sao tôi "giấu" hệ thống thành phần từ Lua:

Ngay bây giờ, những gì bạn làm là

ent:SetPos( 123, 456 )

Các công cụ thành phần được xử lý nội bộ. Bạn vẫn có thể tự thêm và xóa các thành phần khỏi Lua bằng ent: AddComponent và ent: RemoveComponent, v.v.

Bây giờ, điều này cũng không hoàn hảo:

  • Các thực thể có thể thay đổi được lộn xộn vì nó phải đảm nhận tất cả các chức năng của tất cả các thành phần

  • Vấn đề đặt tên: ent:SetJointMotorEnabled()một lần nữa có vẻ xấu

Bạn có biết làm thế nào tôi có thể tìm thấy một sơ đồ đặt tên tốt hơn cho các chức năng thành phần, mà không mạo hiểm sự thoải mái của kịch bản không?


Tôi không nghĩ bạn có một lựa chọn. Bạn có thể làm điều đó một cách rõ ràng (cách đầu tiên của bạn) hoặc ngầm (cách thứ hai), nhưng tôi nghi ngờ bạn sẽ tìm thấy một điểm giữa. Trừ khi bạn có một số loại ent:"Point":SetPos(...).. gần như là phương pháp đầu tiên một lần nữa. Có thể sử dụng phương pháp thứ hai cho các thành phần phổ biến?
Vịt Cộng sản

Tôi nghĩ bạn có thể tìm thấy việc sử dụng trên gamedev.stackexchange.com/questions/12529/ nam Tôi đã cố gắng tìm cách làm cho hệ thống của mình dễ sử dụng và gọn nhẹ nhất có thể về mặt đặt tên :)
Vịt Cộng sản

Câu trả lời:


11

Chúng tôi có một tình huống tương tự trong dự án của mình và chúng tôi đã giải quyết vấn đề bằng cách lưu các thành phần (không phải chức năng) vào các siêu dữ liệu LUA. Về cơ bản, khi chúng ta tạo một thực thể (hoặc đối tượng trò chơi như chúng ta gọi chúng) ở phía LUA, mã trông giống như:

function createShip()
    ...

    self.transform = registerToComponent("transform")
    self.sprite = registerToComponent("sprite")

    ...
end

Bây giờ, chúng ta có thể sử dụng đơn giản

entity.transform:setPosition(5.2, 4.8)
entity.sprite:setTexture("ship.png")

để đặt vị trí (và kết cấu). Và chúng tôi hoàn toàn hài lòng với điều này!

(Và thực sự tôi nghĩ rằng điều này tốt hơn là chỉ có thực thể: setPocation và entity: setTexture vì khi bạn có nhiều thành phần, API thực thể sẽ chỉ là một mớ hỗn độn lớn.)


4

Vấn đề cơ bản ở đây là bạn đã tiếp xúc với hệ thống thành phần với API. Bạn cần gói gọn những thứ đó đằng sau giao diện của bạn.


0

Tôi đã không làm việc với Lua trong một thời gian, nhưng bạn không thể để các thành phần của mình tự thay đổi giao diện thực thể thông qua trình bao bọc Lua (lần trước tôi sử dụng Lua trong một trò chơi là vào năm 2005, các trình bao bọc phải phát triển kể từ đó)?

Bằng cách đặt nó ở cấp độ thành phần, bạn có thể yêu cầu thành phần vị trí của mình đăng ký chức năng "SetPos" trên thực thể gọi trực tiếp thành phần đó và có thành phần JointMotor đăng ký một đối tượng trong thực thể với chức năng "SetEnables", theo cách này là "dữ liệu" thúc đẩy "và hỗ trợ cả ent: SetPos (123, 456) và ent: JointMotor: SetEnables ()?

Miễn là việc đăng ký các tiểu dự án và chức năng xác nhận rằng không có xung đột tên, bạn sẽ ổn.

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.