Tạo thực thể từ mẫu trong công cụ dựa trên thành phần


7

Đối với dự án của tôi, tôi muốn sử dụng một thực thể dựa trên thành phần trong C ++. Việc triển khai hiện tại của tôi được chia thành các phần sau:

  • Hệ thống - Chứa bản đồ của các thành phần của lớp nhất định và hoạt động trên các hệ thống này. Ví dụ: ChemistrySystem có một vectơ Vật lý.
  • Thành phần - Một thành phần chứa một số biến công khai và có thể là hàm tạo để khởi tạo chúng.
  • Các thực thể - Một thực thể đối với tôi chỉ là một Id. Tuy nhiên, nó không được lưu trữ ở bất cứ đâu, thay vào đó chỉ có các thành phần của nó được lưu trữ trong các hệ thống trong bản đồ (trong đó khóa là entityId và giá trị là con trỏ tới thành phần).

Vấn đề của tôi là tạo ra các thể hiện của các đối tượng khác nhau trong trò chơi của tôi. Tôi muốn định nghĩa các đối tượng trong XML (có thể là bất kỳ định dạng tệp văn bản nào). Vì lý do hiệu suất, tệp này chỉ được phân tích cú pháp một lần khi chương trình được chạy.

Điều đó có nghĩa là tôi nên tạo một số mẫu từ nó trong ObjectFactory của mình và liên kết nó với một tên. Sau đó, tôi chỉ cần gọi factory.CreateObject("Player")để thêm thực thể mới vào trò chơi.

Tôi không thực sự chắc chắn làm thế nào để thực hiện điều này mà không cần quá nhiều mã. Một mối quan tâm khác là, tôi không muốn nhà máy của mình biết về chính các hệ thống. Nhưng vì các thành phần của tôi được lưu trữ trong các hệ thống chứ không phải đối tượng Thực thể, tôi sẽ cần sử dụng một số hệ thống nhắn tin để chuyển các thành phần mới vào hệ thống phù hợp của chúng.

Câu hỏi của tôi là , làm thế nào tôi có thể thực hiện đối tượng sinh sản với khuôn mẫu cho từng loại đối tượng? Và làm thế nào để một số công cụ mô tả các đối tượng của họ với các tập tin cấu hình?


2
Có vẻ như sự cần thiết của mẫu thiết kế nguyên mẫu ...
The Light Spark

Câu trả lời:


2

Cung cấp cho ObjectFactorylớp của bạn một make_copyhàm, có một thực thể và có thể tạo một bản sao hoàn toàn riêng biệt của thực thể đó, tạo ra các thành phần mới giống hệt với các thành phần của thực thể ban đầu và thêm các thành phần mới này vào thực thể mới. Bạn có thể tải thực thể "gốc" này từ tệp một lần và lưu trữ nó trong một số bản đồ hoặc một cái gì đó có tên là khóa (như "Trình phát"). Thực thể này bây giờ sẽ hoạt động như một mẫu.

Sau này khi bạn muốn tạo ngay một mẫu đó, bạn có thể gọi factory.CreateObject("Player");, nó sẽ tìm bản đồ "Player"và sau đó tạo một bản sao của thực thể mẫu và trả lại cho bạn và tada!

BIÊN TẬP:

Để giải quyết vấn đề "Truyền thành phần cho hệ thống", hãy có một Systemlớp cơ sở sẽ có một AddComponenthàm ảo thuần sẽ chấp nhận một con trỏ tới thành phần. Làm cho tất cả các hệ thống của bạn xuất phát từ Systemlớp cơ sở này . Sau đó, hãy ObjectFactorylưu trữ một danh sách các con trỏ tới các Hệ thống này và bất cứ khi nào nó tạo ra một Thành phần mới, nó sẽ chuyển nó đến hệ thống tương ứng.


Cảm ơn câu trả lời, điều này đặt tôi đi đúng hướng. Tuy nhiên, một vấn đề với điều này là, trong quá trình thực hiện của tôi, các thành phần được lưu trữ trong các hệ thống. Khi tôi tạo một bản sao của từng thành phần mà một số thực thể cần phải có, tôi cần phải bằng cách nào đó chuyển chúng cho hệ thống thích hợp của chúng.
davidv

@ user2715488, thêm vào câu trả lời.
The Spark Spark

@ user2715488 Tôi sẽ quan tâm đến cách bạn giải quyết vấn đề. Tôi cũng có hai gợi ý cho bạn.
danijar

1

Làm thế nào để bạn hiện đang giao tiếp giữa các hệ thống? Nếu bạn có một số loại tin nhắn hoặc trình quản lý sự kiện, bạn có thể có một create_entitytin nhắn được gửi đến tất cả các hệ thống cùng với cây XML được phân tích cú pháp. Các hệ thống tìm kiếm các thẻ mô tả các thành phần của chúng và tạo chúng nếu được tìm thấy.

Bạn cũng có thể chia sẻ các mảng thành phần giữa các hệ thống. Ví dụ, bạn có thể tạo một ComponentCollectionslớp và chuyển tham chiếu đến các hàm tạo của hệ thống của bạn. Nó có thể liên quan và không cần biết về các loại thành phần của bạn. Bằng cách này, một hệ thống có thể tạo ra các thực thể hoàn chỉnh. Bạn có thể muốn một hệ thống chuyên dụng tải và tạo các thực thể để các hệ thống khác phụ thuộc vào càng ít thành phần càng tốt.

Điều này cũng hữu ích nếu RenderSystemmuốn truy cập vị trí thế giới của các đối tượng được cập nhật bởi PhysicsSystem.

Nhân tiện, nếu bạn muốn bộ nhớ cache cục bộ, các thành phần phải được lưu trữ liên tiếp trong bộ nhớ, tức là trong một mảng hoặc vectơ chứ không phải là bản đồ. Tuy nhiên, bạn có thể có một bản đồ từ id thực thể đến chỉ số vector để truy cập ngẫu nhiê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.