Kế thừa vs Thành phần


16

Tôi kiếm tiền bằng C # Nói chung bằng ngôn ngữ đó, tôi muốn tách mọi thứ lên các tầng trời bằng giao diện. Điều này đã phục vụ tốt cho tôi trong mã doanh nghiệp nhưng khi viết trò chơi bằng C #, tôi thấy mình có xu hướng kế thừa do có thể xác định một số hành vi mặc định cho các lớp cơ sở. Mặc dù vậy, tôi cảm thấy bẩn khi làm điều này, giống như tôi không vâng lời một vị thần kiến ​​trúc nào đó đã từng nói "ủng hộ sáng tác hơn thừa kế". Tôi biết nó không phải là màu đen và trắng nhưng tôi cũng cảm thấy như tôi có thể sử dụng các giao diện với công việc nhiều hơn một chút và đạt được điều tương tự.

Người khác làm gì? Kế thừa là cách tiếp cận phù hợp cho các trò chơi hay tôi nên cấu trúc lại trong một số giao diện?


1
Các giao diện cũng không phải là thành phần, vì vậy không rõ bạn đang hỏi gì.

Tôi chỉ muốn đề cập rằng vì bạn đang làm việc với C # nên bạn sẽ gặp khó khăn nếu bạn chọn sử dụng quyền thừa kế vì C # không hỗ trợ nhiều kế thừa thực sự. Sử dụng phương thức nhiều giao diện là ổn cho đến khi bạn vào phạm vi giao diện 4-5 và phải cắt / dán hơn 25 dòng mã giữa mỗi lớp có chung triển khai. Có một số vòng làm việc nhưng chúng cũng xấu như vậy vì ngôn ngữ không cung cấp hỗ trợ trực tiếp.
NtscCobalt

Câu trả lời:


23

Kế thừa trong các trò chơi thực sự là một trong những điều tồi tệ nhất bạn có thể làm - đặc biệt là liên quan đến các thực thể. Đọc này để biết tại sao. Sáng tác trên sự kế thừa sẽ đưa bạn đi một chặng đường dài với các trò chơi. Đối với các khu vực khác trong động cơ của bạn, nó không thực sự quan trọng. Ví dụ: bạn đang thực hiện cuộc gọi đến một loại dịch vụ mạng bên ngoài, sau đó bạn có thể kế thừa một loại Dịch vụ chung chung, vd. HTTPService và SocketService - rất nhiều như trong các ứng dụng doanh nghiệp bạn đã quen.

Trừ khi trò chơi của bạn thực sự đơn giản, bạn sẽ muốn sử dụng kiến ​​trúc thực thể dựa trên thành phần (CBE). Ý tưởng chung là với các thực thể, lý do chúng thường được sáng tác thay vì được kế thừa là vì bạn không thể biết cho đến khi thực hiện các khả năng mà một thực thể nhất định sẽ có. Ví dụ, đưa tàu của người chơi vào một game bắn súng không gian. Bạn không biết cho đến một lúc nào đó trong quá trình chơi trò chơi, vũ khí, áo giáp, hệ thống (tức là linh kiện) mà người chơi sẽ nhặt, mua, bán, mất, đã phá hủy, v.v ... Vì vậy, cách duy nhất để mô hình hóa điều này là thông qua thành phần đối tượng. Điểm cộng trong kịch bản này là bạn cũng có thể có những kẻ thù hoàn toàn có thể tùy chỉnh, được xây dựng theo cùng một cách, thay vì những kẻ thù luôn giống hệt nhau mỗi khi bạn nhìn thấy loại kẻ thù đó. Vì vậy, với CBE, bạn có thể thấy một Người vận chuyển Sao Hỏa và nghĩ, "Ah nó chỉ có những tia laser nhỏ, tôi sẽ gỡ nó xuống", và điều đó thường đúng nhưng khi bạn ở trong phạm vi đột nhiên bạn nhận ra nó có một cái mông lớn súng giun. Bất ngờ bất ngờ!

Thành phần hóa là loại bỏ khớp nối ngầm của logic, và đó là TỐT.


Cảm ơn bạn đã tư vấn :) Rất vui được biết tôi đã không nghe thấy giọng nói!
Peter Short

1
+1 Cảm ơn bài viết, tôi đã có ý định làm điều này trong trò chơi của mình trong một thời gian khá lâu
John McDonald

3
Cần lưu ý rằng do sự phụ thuộc cao của các thực thể trò chơi, tính kế thừa thường làm phức tạp mọi thứ và làm cho khả năng duy trì và mở rộng trở thành một nhiệm vụ nặng nề. Các hệ thống thành phần giải quyết vấn đề này một cách độc đáo và các lợi ích bổ sung khác là những gì được liệt kê trong câu trả lời ở trên;)
James

Cũng nên lưu ý rằng "nhưng khi bạn vào trong phạm vi đột nhiên bạn nhận ra nó có một khẩu súng sâu đục lỗ lớn. Bất ngờ bất ngờ!" là thiết kế trò chơi tồi: D
Jonathan Connell

1
Bất ngờ là niềm vui, nhưng bất ngờ có nghĩa là bạn chết mà không báo trước, như một con tàu cấp thấp có thể OHKO bạn, chỉ là bực bội;) Tất nhiên đây có thể không phải là ý bạn trong câu trả lời của bạn. Ngoài ra, có rất nhiều thứ cho một trò chơi hơn là chỉ thiết kế trò chơi.
Jonathan Connell

3

Đối với những người nói tiếng Đức, một cuốn sách thú vị: http://www.amazon.com/Architektur-Kerns-einer-Game-Engine-Imcellenceierung/dp/3639324471/ref=sr_1_1?ie=UTF8&qid=1314875533&sr=8-1

Xem xét kỹ hơn về thời điểm và lý do sử dụng kiến ​​trúc nào có thể được tìm thấy ở đây: /programming/1901251/component-basing-game-engine-design

Đối với bản thân tôi, tôi quyết định kiến ​​trúc của mình tùy thuộc vào quy mô của dự án và khả năng mở rộng hoặc sử dụng lại mã. Tại sao đầu tư hàng giờ vào kiến ​​trúc của một dự án siêu nhỏ mà không có cơ hội bạn sử dụng lại mã? Đồng thời bạn có thể hoàn thành dự án.

Thành phần so với Thành phần Các thành phần là những thứ ưa thích thú vị nhưng trong hầu hết các dự án / kiến ​​trúc, thành phần cũng sẽ thực hiện công cụ (không có chi phí dựa trên thành phần). Nó phụ thuộc vào những gì hệ thống thành phần của bạn có thể cung cấp thành phần đó không thể.


Ví dụ: đưa tàu của người chơi vào một game bắn súng không gian. Bạn không biết cho đến một lúc nào đó trong quá trình chơi trò chơi, vũ khí, áo giáp, hệ thống (tức là linh kiện) mà người chơi sẽ nhặt, mua, bán, mất, đã phá hủy, v.v ... Vì vậy, cách duy nhất để mô hình hóa điều này là thông qua thành phần đối tượng.

tất cả những gì có thể mà không có các thành phần từ lâu


-1, thành phần là một dạng của thành phần.

tốt, một hình thức nhưng không giống nhau vì chúng cung cấp các tính năng khác nhau. (Vì vậy, tôi không hiểu bình luận của bạn và -1)
idefix

1
Khi bạn nói "thành phần so với thành phần" thì không rõ bạn đang so sánh vì thành phần nào là thành phần. Bạn có nghĩa là các thành phần động so với các thành phần tĩnh? Một trong những so với thành phần của các loại liên quan không gia đình hay cấu trúc? "Chi phí dựa trên thành phần" là gì? Trong các hệ thống thành phần tĩnh (và nhiều hệ thống động), tổng phí gần như bằng không.

Hừm, điểm thú vị. Bạn có phiền thảo luận chi tiết hơn một chút không? Nếu không tôi muốn gửi cho bạn địa chỉ thư của tôi trên nền tảng khác.
idefix
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.