Đối với dự án hiện tại của tôi, tôi đã triển khai một hệ thống dựa trên thành phần / thực thể , về cơ bản tuân theo hầu hết các thực tiễn tốt nhất có trong khu vực khá không xác định này .
Vì vậy, tôi đã (hơi mở rộng) Các đối tượng , đó là cơ bản một int
ID, một tên con người có thể đọc được, một std::map
trong các thành phần và một long
"loại chỉ số" được sử dụng để hiển thị những gì các thành phần có mặt (Tôi có một sức mạnh của hai enum
đối với tất cả các thành phần loại và bất cứ khi nào một thành phần được thêm vào Thực thể, tôi sẽ tự động thay đổi thời gian dài đó thông qua các thao tác bitwise, so sánh câu trả lời này ).
Sau đó, có các Thành phần , cũng khá đơn giản: int
ID, enum
như loại thành phần, con trỏ Thực thể mẹ và một std::map
trong tất cả các thuộc tính mà thành phần này giữ.
Cuối cùng, một số Hệ thống / Người quản lý xử lý việc xử lý logic thực tế. Trước tiên, họ kiểm tra xem Thực thể hiện đang xử lý có long
"chỉ báo loại" phù hợp = tất cả các thành phần cần thiết cho hệ thống đó hay không. Sau đó, nó truy cập một số thuộc tính nếu cần và trực tiếp gọi một số chức năng trong thành phần tương ứng hoặc gửi một số tin nhắn (thông qua một bộ điều phối tin nhắn).
Điểm mấu chốt: Cho đến đây, một hệ thống dựa trên thành phần / thực thể dựa trên sự kiện khá tiêu chuẩn kết hợp với cách tiếp cận dựa trên dữ liệu (so sánh, các thành phần không có các biến dữ liệu được mã hóa cứng, mà thay vào đó là một bản đồ chung, như (một số) thành phần / archetypes của các thành phần sau đó sẽ được đọc từ các tệp với tùy chọn thêm dữ liệu bổ sung, đó không phải là một phần của mã thành phần thực tế.
Bây giờ tôi cũng muốn giới thiệu Cây hành vi (dựa trên AiGameDev BTSK ) vào dự án đó, nhưng tôi không chắc liệu chúng có nên được liên kết với các thành phần đã có hay nói chung cách tích hợp các thiết kế đó không.
Một số ý tưởng / điểm / câu hỏi liên quan xuất hiện trong đầu:
BT của tôi sẽ được đọc từ các tập tin (một lần nữa). Tôi hiện đang có một thời gian khó khăn để xem làm thế nào tốt nhất tôi có thể tạo kết nối giữa một
BT Action
cây trong đó và mã hóa thực tế trong ứng dụng của tôi. Tôi có nên xây dựng một số loại bản đồ giữa các tên hành động được sử dụng trong các tệp BT và một con trỏ hàm để thực hiện logic thực tế không? Cách tiếp cận thông thường để giải quyết điều đó là gì?Tôi giả định rằng tôi sẽ phải tạo BT cho tất cả các
Entity
loại khác nhau của mình (vì vậy đối với mỗi tổ hợp thành phần có liên quan đến logic trò chơi / AI như được chỉ định bởi "chỉ báo loại" dài nhiều lần được đề cập của tôi). Kết quả là không có ý nghĩa gì khi đặt cácBT Action
triển khai trong các thành phần vì rất có thể nhiều thành phần sẽ được tham gia cho mỗi hành động, phải không?Vậy
BT Action
logic có nên nằm trong một / nhiều hệ thống riêng biệt (với phương thức mà bản đồ từ ý tưởng số 1 chỉ đến)? Sau đó, hệ thống sẽ kiểm tralong
"chỉ báo loại" của tôi xem liệuEntity
BT hiện đang được kiểm tra và được yêu cầu thực hiện một hành động nhất định (phương thức = trong hệ thống) có thực sự được phép làm như vậy (= có các thành phần cần thiết) hay không. Nhưng sau đó, nếu không (vì ví dụ, người tạo BT đã bỏ qua một tình huống cụ thể, trong đó một thành phần cần thiết có thể không được gắn vào Thực thể khi chạy nữa), sẽ không có gì xảy ra.
Câu hỏi:
- Có những khái niệm đã được chứng minh cho loại tích hợp đó?
- Bạn lấy gì ở 3 điểm trên của tôi?
- Bất kỳ điều gì khác xuất hiện trong tâm trí, cũng liên quan đến thiết kế dựa trên thành phần / thực thể của tôi nói chung?