Đăng ký thành phần đối tượng trò chơi trong hệ thống con trò chơi? (Thiết kế đối tượng trò chơi dựa trên thành phần)


11

Tôi đang tạo một hệ thống đối tượng trò chơi dựa trên thành phần . Một số lời khuyên:

  1. GameObjectchỉ đơn giản là một danh sách Components.
  2. GameSubsystems. Ví dụ, kết xuất, vật lý, vv Mỗi cái đều GameSubsystemchứa con trỏ đến một số Components. GameSubsystemlà một sự trừu tượng rất mạnh mẽ và linh hoạt: nó đại diện cho bất kỳ lát cắt (hoặc khía cạnh) nào của thế giới trò chơi.

Có một nhu cầu trong một cơ chế đăng ký Componentstrong GameSubsystems(khi GameObjectđược tạo ra và sáng tác). Có 4 cách tiếp cận :


  • 1: Chuỗi mô hình trách nhiệm . Mỗi Componentđược cung cấp cho mọi GameSubsystem. GameSubsystemđưa ra quyết định Componentsđăng ký (và cách tổ chức chúng). Ví dụ: GameSubystemRender có thể đăng ký Thành phần kết xuất.

chuyên nghiệp Componentskhông biết gì về cách chúng được sử dụng. Khớp nối thấp. A. Chúng ta có thể thêm mới GameSubsystem. Ví dụ: hãy thêm GameSubystemTitle đăng ký tất cả Thành phần và đảm bảo rằng mọi tiêu đề là duy nhất và cung cấp giao diện để truy vấn các đối tượng theo tiêu đề. Tất nhiên, ElementTitle không nên được viết lại hoặc kế thừa trong trường hợp này. B. Chúng ta có thể tổ chức lại hiện có GameSubsystems. Ví dụ: GameSubystemAudio, GameSubystemRender, GameSubystemParticleEmmiter có thể được hợp nhất vào GameSubystemSpatial (để đặt tất cả âm thanh, trình giả lập, hiển thị Componentstrong cùng phân cấp và sử dụng các biến đổi tương đối cha mẹ).

con. Kiểm tra mọi thứ. Rất không hiệu quả.

con. Subsystemsbiết về Components.


  • 2: Mỗi Subsystemtìm kiếm cho Componentscác loại cụ thể.

chuyên nghiệp Hiệu suất tốt hơn trong Approach 1.

con. Subsystemsvẫn biết về Components.


  • 3: Componentđăng ký chính nó trong GameSubsystem(s). Chúng tôi biết tại thời điểm biên dịch rằng có GameSubystemRenderer, vì vậy, hãy để ElementImageRender sẽ gọi một cái gì đó giống như GameSubystemRenderer :: register (ElementRenderBase *).

chuyên nghiệp Hiệu suất. Không kiểm tra không cần thiết như trong Approach 1.

con. Componentsđược kết hợp xấu với GameSubsystems.


  • 4: Mẫu người hòa giải . GameState(có chứa GameSubsystems) có thể thực hiện registerComponent (Thành phần *).

chuyên nghiệp ComponentsGameSubystemskhông biết gì về nhau.

con. Trong C ++, nó trông giống như kiểu chuyển đổi xấu xí và chậm chạp.


Câu hỏi: Cách tiếp cận nào tốt hơn và chủ yếu được sử dụng trong thiết kế dựa trên thành phần? Thực hành nói gì? Bất kỳ đề xuất về việc thực hiện Approach 4?

Cảm ơn bạn.


Tôi ngửi thấy quá kỹ thuật. Các thành phần tự đăng ký với GameObject. Nếu GameSubystem là những gì tôi nghĩ, thì đó chỉ là một danh sách các thành phần có thể được thêm vào GameObject cùng một lúc. Làm thế nào bạn mô tả nó nghe có vẻ như có một loại "ma thuật" làm thế nào GameObjects và Thành phần kết hợp với nhau (họ tìm kiếm lẫn nhau? Tại sao?). Tôi cũng có cảm giác rằng bạn đang cố gắng sử dụng các thành phần cho tất cả mọi thứ trong động cơ của bạn, điều mà tôi cũng sẽ xem xét lại. Đối với những gì nó có giá trị, tôi sẽ chỉ xem xét các tùy chọn 3 hoặc 4.
LearnCocos2D

@GamingHorror, Đăng ký Componentstại GameObjectsnằm ngoài phạm vi câu hỏi của tôi. Đọc các bài viết về cách tiếp cận dựa trên thành phần hoặc đặt câu hỏi của riêng bạn trên trang web này nếu bạn quan tâm đến nó. Những gì bạn nghĩ GameSubsystemlà hoàn toàn sai.
topright

Tôi thiên về phát triển các thành phần cho logic trò chơi, không phải các thành phần động cơ và mô tả của bạn dường như chỉ theo hướng đó. Tôi hiểu rất rõ các hệ thống thành phần, tôi nghĩ rằng tôi đã bị loại bỏ vì tôi không quen với thuật ngữ bạn đã sử dụng, cụ thể là GameSubystem. Từ những gì tôi đọc được, có vẻ như bạn đang cố gắng xây dựng mọi thứ (ví dụ như toàn bộ động cơ) chỉ từ các thành phần.
LearnCocos2D

Có, "Đối tượng trò chơi dựa trên thành phần" và "Lập trình hướng thành phần" là các thuật ngữ khác nhau, nó có thể gây nhầm lẫn. Đừng thiên vị, tốt hơn là "song phương": scottbilas.com/files/2002/gdc_san_jose/game_objects_slides.ppt
topright

Câu trả lời:


3

Cửa số 3 ... Thành phần tự đăng ký trong (các) GameSubystem

Thành phần này được sử dụng để giữ cho khớp nối được trừu tượng hóa từ chính GameObject. Bằng cách nào đó, một nơi nào đó trong thực tế cần phải tương tác với các hệ thống con và đây là thành phần và mục đích của nó.

Khớp nối không thực sự là một điều xấu trong trường hợp này.

Hiệu suất về cơ bản là bắt buộc trong trường hợp này nếu bạn muốn có bất kỳ sự phức tạp nào trong hệ thống của mình, bạn không thể đủ khả năng tiếp cận kiểu tìm kiếm của các tùy chọn khác.

Cuối cùng, nếu một hệ thống con cần phản ứng với một hệ thống khác (trình kết xuất, vật lý, âm thanh, tất cả đều cần thực hiện khi có sự cố), các thành phần có thể tạo điều kiện thuận lợi cho nhau thông qua đối tượng trò chơi và giữ cho loại khớp nối chéo đặc biệt này có thể quản lý được thông qua các thành phần.


1
Điều đó thật tốt. Nhưng làm thế nào các thành phần biết về GameSubystems? Có phải tất cả các hệ thống con singletons? Điều đó không xấu phải không? ... Tôi đang nghĩ về một giải pháp khác như tiêm phụ thuộc ... nhưng khi nào và ai truyền thể hiện hệ thống con cho từng thành phần?
Dani

@Dani Các thành phần không cần truy cập trực tiếp vào thể hiện của hệ thống con, chúng chỉ cần gửi một thông báo yêu cầu đăng ký được thực hiện, chúng không cần biết Hệ thống con là gì (nhưng rất có thể chúng sẽ) họ sẽ là người độc thân? Đó không phải là một yêu cầu, ngay cả trong hầu hết các trường hợp, bạn sẽ chỉ cần một phiên bản hệ thống con duy nhất cho mỗi hệ thống con.
Pablo Ariel

@Pablo - đồng ý.
Rick
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.