2010-05-03 34 views
26

Cách tốt nhất để tách mã hiển thị khỏi mã công cụ/logic trò chơi thực sự là gì? Và nó thậm chí là một ý tưởng tốt để tách những người?Tách logic trò chơi và hiển thị

Giả sử chúng tôi có đối tượng trò chơi có tên là Knight. The Knight phải được hiển thị trên màn hình để người dùng có thể nhìn thấy. Bây giờ chúng ta còn lại với hai lựa chọn. Hoặc chúng tôi cung cấp cho Knight một phương thức Render/Draw mà chúng tôi có thể gọi hoặc chúng tôi tạo lớp trình kết xuất sẽ xử lý tất cả các hiệp sĩ.

Trong trường hợp hai người được tách ra khỏi Hiệp sĩ thì Hiệp sĩ vẫn chứa tất cả thông tin cần thiết để hiển thị anh ta, hay điều này cũng nên được tách ra? Trong dự án cuối cùng chúng tôi tạo ra, chúng tôi quyết định cho phép tất cả thông tin cần thiết để hiển thị một đối tượng được lưu trữ bên trong đối tượng, nhưng chúng tôi đã có một thành phần riêng biệt để đọc thông tin đó và hiển thị các đối tượng. Quay lại đầu trang Đối tượng sẽ chứa thông tin như kích thước, xoay, tỷ lệ và hoạt ảnh nào hiện đang phát và dựa trên đối tượng trình kết xuất này sẽ tạo màn hình.

Các khung như XNA dường như nghĩ rằng việc tham gia đối tượng và hiển thị là một ý tưởng hay, nhưng chúng tôi sợ bị ràng buộc vào một khung hiển thị cụ thể, trong khi xây dựng một thành phần hiển thị riêng biệt cho chúng ta thêm tự do để thay đổi khuôn khổ bất cứ thời gian nào.

+3

Bỏ qua triển khai XNA của. Nhiều như tôi thích nó, cách "mặc định" bạn thấy các ví dụ trên web và trong sách là khủng khiếp. Mỗi đối tượng đều biết về lớp cơ sở Game và lần lượt, mọi thứ đều biết cách vẽ và cứ thế. Điều này là không tốt. Giải pháp của Thomas là lý tưởng, và những gì nhiều người làm. – Finglas

Trả lời

5

Tôi sẽ cố gắng làm cho các đối tượng của bạn trở nên phổ biến như khả thi và tránh mã hóa sự thật về gameplay vào mã của bạn càng nhiều càng tốt.

Ví dụ: bạn có một lớp Entity hoặc Object hoặc Actor, và lớp đó có một con trỏ để tạo ra quyết định (AI của nó) và một con trỏ tới biểu diễn đồ họa của nó.

Việc ra quyết định của nó nhất thiết phải được kết hợp với các sự kiện của trò chơi; thực sự nó một phần của sự kiện gameplay. Vì vậy, đây là một nơi nào đó mà bạn có thể đặt tên cho nhà sản xuất quyết định của bạn "KnightAi" hoặc một cái gì đó.

Mặt khác, biểu diễn đồ họa chỉ là một chút đồ họa. Nó sẽ được vẽ giống như mọi thực thể khác. Bạn có một mô hình hoặc một số bitmap và một số hình động hay không ... Điều này sẽ/chỉ có thể được gọi là một cái gì đó như "Mô hình" và sẽ tải thông tin mà nó nói để tải định nghĩa thực thể trông như thế nào đối với người chơi. Khi nói đến việc dựng hình hiệp sĩ của bạn so với con ngựa của bạn so với một lâu đài, bạn có thể thấy rằng tất cả chúng đều làm điều tương tự với các dữ liệu khác nhau. Các loại dữ liệu mà họ có thậm chí là giống nhau, nó chỉ là nội dung khác nhau.

Nói rằng các thực thể của bạn đều được thể hiện dưới dạng vòng kết nối. Bạn sẽ chỉ có họ trỏ đến một CircleRenderer mà đã kích thước mà họ nên được rút ra. Bạn sẽ không tạo một lớp trình kết xuất khác cho từng kích thước khác nhau (hoặc màu sắc, hoặc bất kỳ thứ gì) của vòng kết nối mà bạn muốn!

20

Tôi sẽ tạo một lớp riêng biệt KnightRenderer. Ưu điểm:

  • Tách sạch giữa logic trò chơi và hiển thị. Bản thân số Knight thậm chí có thể chạy trên máy chủ trò chơi và không biết gì về việc hiển thị.
  • Các lớp học nhỏ hơn, đơn giản hơn, liên quan đến một và chỉ một phần chức năng.

Mọi thứ cần KnightRenderer cần biết về Knight (vị trí, trạng thái) phải được đọc công khai trong Knight.

Thuộc tính cụ thể để hiển thị sẽ chuyển vào lớp KnightRenderer. Ví dụ, có thể bạn muốn làm cho đèn flash của hiệp sĩ khi bị trúng, vì vậy bạn cần lưu trữ một giá trị bộ đếm hoặc thời gian.

+0

Đây chính xác là cách tôi làm. – Finglas

+3

Tôi thích suy nghĩ của bạn. Câu hỏi: Bạn tạo Knight Knighter ở đâu? Bạn có tham khảo trực tiếp nó trong Knight, hay bạn tạo nó ở đâu đó và vượt qua nó? – lochok

+0

@Thomas KnightRenderer có chứa mã thực tế (gl */directx/whatever) không? Trong trường hợp nó có vẻ khó khăn để áp dụng một số tối ưu hóa và chuyển đổi triển khai. Giống như KnightRenderOpelGL, v.v. – GorillaApe

Các vấn đề liên quan