Hệ thống thành phần thực thể cho HUD và GUI


7

Đây là một bản phác thảo rất sơ bộ về cách tôi hiện đang có những thứ được thiết kế. Ít nhất, nó nên đưa ra ý tưởng về cách ECS của tôi hiện được thiết kế.

kiến trúc hiện tại

Nếu bạn chú ý trong sơ đồ đó, về cơ bản tôi đã tách HUD ra khỏi ECS. Họ có tập hợp các thứ riêng (HudLayer, HudComponent, v.v.) và được xử lý khác nhau. Đây là nơi tôi đang vật lộn, mặc dù.

Có nhiều trường hợp khác nhau trong đó HUD sẽ cần biết về các thực thể. Không chỉ thay đổi dữ liệu (tôi có một bộ điều phối sự kiện cho điều đó), nhưng thực thể thực tế và tất cả những gì nó bao gồm. Cũng có những tình huống mà các thực thể sẽ cần có thể truy vấn HUD để lấy dữ liệu. Hãy lấy một vài ví dụ:

  • Đầu tiên, màn hình thiết bị của tôi. Ở đây tôi có thể thay đổi thiết bị trên một nhân vật (Thực thể). Để điều này xảy ra, tôi cần biết về thực thể. Ít nhất tôi nghĩ tôi sẽ làm được? Làm thế nào tôi có thể xử lý này?

  • Kịch bản thứ hai liên quan đến Hệ thống của tôi cần truy vấn HudComponent để lấy dữ liệu. Một ví dụ cụ thể sẽ là hệ thống chiến đấu của tôi. Mỗi "đội" được cung cấp một lưới 3x3 mà họ có thể di chuyển xung quanh. Xem tại đây:

Các kỹ năng nhắm mục tiêu vào các ô này chứ không phải người chơi, vì vậy tôi sẽ cần một cách để các hệ thống của tôi xác định ô nào bị chiếm và ô nào không. Về cơ bản tôi cần một cách để liên lạc hai chiều giữa Hệ thống và HUD của tôi. Tôi biết rằng dù sao đi nữa (bởi một số người, dù sao đi nữa) hãy đưa HUD của bạn ra khỏi ECS. Điều đó có phù hợp trong trường hợp của tôi không?


3
Hiện tại, tiêu đề có thể có nghĩa là hầu hết mọi thứ. Nếu bạn phải tóm tắt câu hỏi của bạn trong một câu, nó sẽ là gì?
Anko

2
@Anko, tôi đã suy ra những gì có thể được. :) Jason, cứ tự nhiên nghe lời khuyên của Anko và xem xét lại nếu tôi không hiểu đúng.
Seth Battin

@SethBattin Đó là một tiêu đề tốt hơn nhiều. Tôi thật kinh khủng khi tóm tắt mọi thứ :)
Jason L.

5
Tôi sẽ không cố gắng đưa HUD của bạn vào ECS. Nó không thực sự là một thực thể thế giới trò chơi.
Vaughan Hilts

1
Bạn chỉ nên sử dụng khoảng trắng cho việc này: gamedevelopment.tutsplus.com/tutorials/
Kẻ

Câu trả lời:


1

Dường như với tôi rằng bạn đang trộn lẫn biểu diễn trực quan với biểu diễn logic của những gì bạn đang cố gắng tạo. Hãy thảo luận về hai kịch bản của bạn.

Màn hình thiết bị

Trong tình huống này, tôi chỉ cần có UI Thiết bị có khả năng truy vấn hệ thống kiểm kê cho trình phát hiện tại. Điều này cho phép hệ thống kiểm kê và quản lý vẫn ở trong khung ECS ​​của bạn và bạn chỉ đơn giản là cho phép hệ thống UI sử dụng phương tiện để hỏi hệ thống kiểm kê nội dung của nó là gì và thể hiện trực quan dữ liệu cho người dùng. Khi người dùng di chuyển các vật phẩm xung quanh trong túi của mình, các túi chỉ cần gọi các phương thức trên hệ thống kiểm kê thao tác các thành phần tương ứng. Bằng cách này, màn hình UI Thiết bị thực sự không biết gì về ECS. Nó chỉ đơn giản là có một tham chiếu đến một lớp thực hiện giao diện Hệ thống hàng tồn kho và thông qua trường hợp đó, nó có thể có được thông tin cần thiết để tự vẽ.

Màn hình chiến đấu

Tôi tin rằng kịch bản này một lần nữa sau một tiền đề tương tự. Bạn có thể dễ dàng trừu tượng các thành phần, thực thể và logic của hệ thống chiến đấu thành một BattleSystemphần của ECS của bạn. Hệ thống này một lần nữa thực hiện một giao diện cụ thể xác định hợp đồng giữa UI và hệ thống. Bây giờ, khi người dùng thực hiện hành động UI, UI chỉ cần gọi phương thức thích hợp trongBattleSystem và bất kỳ tương tác nào phải xảy ra giữa nó, các thực thể và các thành phần xảy ra.

Một điều tôi sẽ cố gắng thực hiện trong một trong những trường hợp này, là bất kỳ thông tin nào cảm thấy như thể nó bị rò rỉ từ sự trừu tượng của hệ thống con đến UI nên được đẩy vào hệ thống. Giao diện người dùng phải được thiết kế sao cho có lẽ các giá trị này có thể được điều chỉnh trong hệ thống và giao diện người dùng thích ứng. Ví dụ:BattleSystem có thể có một phương thức cho bạn biết kích thước lưới là 3x3 nhưng trong lần phát hành sau, bạn quyết định nó phải là 4 x 4 hoặc 5x5. Bằng cách cho phép điều này được điều khiển dữ liệu, UI không còn quan tâm nhất thiết đến nó và chỉ thích nghi, thực sự cho phép UI được tách rời nhất có thể khỏi logic và triển khai của hệ thống.

Điểm mấu chốt là đừng ngần ngại thiết kế một hệ thống hoặc hệ thống ở một lớp và sau đó bọc (các) hệ thống đó thành một hệ thống lớn hơn ở cấp độ cao hơn cho đến khi bạn đạt đến mức độ trừu tượng và khái quát hóa mà bạn cần để giữ mọi thứ tách rời ở cấp độ tương ứng của chúng, nhưng đủ gắn kết qua các ranh giới lớp mà không làm suy yếu thiết kế.


0

Của bạn HudLayercó thể chứa một Hệ thống HUDSystemnơi các thực thể của bạn cuối cùng đăng ký các thành phần của chúng. Sau HUDSystemđó có thể theo dõi các thay đổi từ các thực thể đã đăng ký.


0

Bạn đang đi đúng hướng về việc giữ HUD ra khỏi ECS. HUD và màn hình trò chơi nói chung được hưởng lợi rất nhiều từ sự kế thừa, vì dòng chảy của trò chơi về cơ bản là một cây nơi bạn có thể phân nhánh theo các đường dẫn khác nhau hoặc quay lui theo cách có ý nghĩa với người chơi. Tôi sử dụng một biến thể của mẫu trạng thái, trong đó

Tuy nhiên, HudLayer và GameScene có thể được cô đọng (theo nghĩa lập trình) thành cùng loại đối tượng. Tôi cũng coi HUD là GameScenes, ở chỗ chúng có thể chứa các thực thể và một vòng lặp cập nhật-> hiển thị có thể chờ đợi đầu vào của người dùng. Các thực thể trong HUD là nền, biểu tượng và văn bản, theo cách tương tự như các nhân vật và hình nền trên màn hình chiến đấu là các thực thể bao gồm đồ họa và vị trí. Mặc dù điều này có nghĩa là HUD chứa các thành phần là một phần của ECS, nhưng màn hình HUD không nằm trong ECS.

Quay trở lại kế thừa, nếu màn hình chiến đấu được coi là GameScene chính đang hoạt động, tất cả các HUD và menu trên màn hình có thể là màn hình trẻ em của màn hình chiến đấu. Khi bạn mở màn hình kho đồ từ màn hình chiến đấu, màn hình chiến đấu sẽ ngừng nhập liệu và tạo màn hình kho đồ. Màn hình chiến đấu theo dõi nhân vật đang hoạt động và nó đang ở ô nào, và bất kỳ menu nào dành riêng cho nhân vật đều được tải thông tin này. Sau khi thực hiện lựa chọn và đóng menu, một giá trị dựa trên lựa chọn được trả về cho cha mẹ của nó, màn hình chiến đấu và ECS sẽ đảm nhiệm việc làm cho thực thể nhân vật phản ứng thích hợp.

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.