มรดกเทียบกับองค์ประกอบ


16

ฉันทำเงินของฉันเป็นภาษา C # โดยทั่วไปแล้วในภาษานั้นฉันชอบที่จะแยกทุกสิ่งออกสู่สวรรค์ชั้นสูงโดยใช้อินเทอร์เฟซ สิ่งนี้ให้บริการฉันเป็นอย่างดีในรหัสองค์กร แต่ในการเขียนเกมใน C # ฉันพบว่าตัวเองพุ่งเข้าหาการสืบทอดเนื่องจากความสามารถในการกำหนดพฤติกรรมเริ่มต้นบางอย่างสำหรับคลาสพื้นฐาน ฉันรู้สึกสกปรกที่ทำสิ่งนี้แม้ว่าฉันจะไม่เชื่อฟังพระเจ้าสถาปัตยกรรมผู้ซึ่งเคยกล่าวไว้ว่า ฉันรู้ว่ามันไม่ใช่ขาวดำ แต่ฉันก็รู้สึกเหมือนว่าฉันสามารถใช้อินเทอร์เฟซที่มีงานมากขึ้นและบรรลุสิ่งเดียวกัน

คนอื่นทำอะไร การสืบทอดเป็นวิธีการที่เหมาะสมสำหรับเกมหรือฉันควรปรับโครงสร้างในส่วนต่อประสานบางส่วนหรือไม่


1
อินเทอร์เฟซไม่ได้เป็นองค์ประกอบอย่างใดอย่างหนึ่งดังนั้นจึงไม่ชัดเจนในสิ่งที่คุณถาม

ฉันแค่อยากพูดถึงว่าตั้งแต่คุณทำงานกับ C # คุณจะมีช่วงเวลาที่ยากลำบากหากคุณเลือกที่จะใช้การสืบทอดเนื่องจาก C # ไม่รองรับการสืบทอดหลายรายการที่แท้จริง การใช้วิธีการเชื่อมต่อหลายวิธีนั้นใช้งานได้ดีจนกว่าคุณจะเข้าสู่ช่วงอินเตอร์เฟส 4-5 และต้องตัด / วางรหัส 25+ บรรทัดระหว่างทุกชั้นที่มีการใช้งานร่วมกัน มีรอบการทำงานบางส่วน แต่พวกเขาก็น่าเกลียดเนื่องจากภาษาไม่ได้ให้การสนับสนุนโดยตรง
NtscCobalt

คำตอบ:


23

การสืบทอดในเกมเป็นหนึ่งในสิ่งที่เลวร้ายที่สุดที่คุณสามารถทำได้โดยเฉพาะอย่างยิ่งในแง่ของเอนทิตี อ่านสิ่งนี้ด้วยเหตุผล การจัดองค์ประกอบเหนือการสืบทอดนำคุณไปสู่เกมที่ยาวนาน สำหรับส่วนอื่น ๆ ของเครื่องยนต์ของคุณมันไม่สำคัญเลย พูดเช่นคุณกำลังโทรไปยังบริการเครือข่ายภายนอกบางประเภทจากนั้นคุณสามารถรับบริการประเภททั่วไปหนึ่งประเภทเช่น HTTPService และ SocketService - เป็นอย่างมากในแอพขององค์กรที่คุณคุ้นเคย

ยกเว้นว่าเกมของคุณเป็นเกมที่ง่ายจริงๆคุณจะต้องใช้สถาปัตยกรรมเอนทิตีแบบอิงองค์ประกอบ (CBE) ความคิดทั่วไปคือด้วยเอนทิตี้ของเหตุผลที่พวกเขามักจะประกอบมากกว่าสืบทอดคือเพราะคุณไม่สามารถรู้ได้จนกว่ารันไทม์สิ่งที่ความสามารถของนิติบุคคลที่จะได้รับ. ตัวอย่างเช่นนำเรือของผู้เล่นไปสู่ยานอวกาศ คุณไม่รู้จนกว่าจะถึงจุดหนึ่งในระหว่างการเล่นเกมอาวุธชุดเกราะระบบ (เช่นส่วนประกอบ) ที่ผู้เล่นจะหยิบซื้อขายแพ้ถูกทำลาย ฯลฯ ดังนั้นวิธีที่เหมือนจริงเพียงแบบนี้ ผ่านองค์ประกอบของวัตถุ ด้านบวกในสถานการณ์นี้คือคุณสามารถมีศัตรูที่ปรับแต่งได้อย่างเต็มที่สร้างขึ้นในแบบเดียวกันแทนที่จะเป็นศัตรูที่เหมือนกันทุกครั้งที่เห็นประเภทศัตรู ดังนั้นด้วย CBE คุณอาจเห็น Martian Freighter และคิดว่า "Ah มีแค่เลเซอร์เล็ก ๆ เท่านั้นฉันจะเอามันลง" และโดยปกติแล้วจะเป็นเรื่องจริง แต่เมื่อคุณอยู่ในระยะการจู่ ๆ คุณก็รู้ว่ามันมีตูดใหญ่ ปืนหนอน เซอร์ไพรส์!

Componentisation กำลังลบการเชื่อมโยงทางตรรกะโดยปริยายและนั่นคือ GOOD


ขอบคุณสำหรับคำแนะนำเพื่อน :) ดีใจที่รู้ว่าฉันไม่ได้ยินเสียง!
Peter Short

1
+1 ขอบคุณสำหรับบทความฉันมีความหมายที่จะทำเช่นนี้ในเกมของฉันค่อนข้างบางครั้ง
John McDonald

3
ควรสังเกตว่าเนื่องจากการพึ่งพาระหว่างหน่วยงานเกมสูงซึ่งการสืบทอดมักจะทำให้สิ่งต่าง ๆ ยุ่งยากและทำให้การบำรุงรักษาและขยายงานที่ยุ่งยาก ระบบส่วนประกอบรับมือกับปัญหานี้ได้เป็นอย่างดีและผลประโยชน์เพิ่มเติมอื่น ๆ คือสิ่งที่อยู่ในคำตอบข้างต้น;)
James

ควรสังเกตว่า "แต่เมื่อคุณได้รับในช่วงทันใดนั้นคุณก็รู้ว่ามันมีปืนหนอนรูตูดตัวใหญ่เซอร์ไพรส์เซอร์ไพรส์!" การออกแบบเกมไม่ดี: D
Jonathan Connell

1
ความประหลาดใจคือความสนุก แต่ความประหลาดใจที่หมายความว่าคุณตายโดยไม่มีการเตือนเช่นเรือระดับต่ำที่ OHKO สามารถทำลายคุณได้) แน่นอนว่านี่อาจไม่ใช่สิ่งที่คุณต้องการในคำตอบของคุณ นอกจากนี้ยังมีอีกมากมายให้กับเกมมากกว่าแค่การออกแบบเกม
Jonathan Connell

3

สำหรับผู้ที่พูดภาษาเยอรมันได้มีหนังสือที่น่าสนใจ: http://www.amazon.com/Architektur-Kerns-einer-Game-Engine-Implementierung/dp/3639324471/ref=sr_1_1?ie=UTF8&qid=1314875533&sr=8-1

ดูอย่างละเอียดเกี่ยวกับเวลาและสาเหตุที่ใช้สถาปัตยกรรมใดที่สามารถพบได้ที่นี่: /programming/1901251/component-based-game-engine-design

สำหรับตัวฉันเองฉันตัดสินใจสถาปัตยกรรมของฉันขึ้นอยู่กับขนาดของโครงการและความเป็นไปได้ที่จะขยายหรือนำรหัสกลับมาใช้ใหม่ ทำไมลงทุนชั่วโมงและชั่วโมงในสถาปัตยกรรมของโครงการขนาดเล็กที่ไม่มีโอกาสที่คุณจะใช้รหัสอีกครั้ง? ในเวลาเดียวกันคุณสามารถทำโครงการให้เสร็จ

Composition vs Components เป็นสิ่งที่เจ๋งมาก แต่ในโครงงาน / สถาปัตยกรรมส่วนใหญ่จะทำสิ่งต่าง ๆ ด้วย มันขึ้นอยู่กับสิ่งที่ระบบส่วนประกอบของคุณสามารถจัดองค์ประกอบนั้นไม่ได้


ตัวอย่างเช่นนำเรือของผู้เล่นไปสู่ยานอวกาศ คุณไม่รู้จนกว่าจะถึงจุดหนึ่งในระหว่างการเล่นเกมอาวุธชุดเกราะระบบ (เช่นส่วนประกอบ) ที่ผู้เล่นจะหยิบซื้อขายแพ้ถูกทำลาย ฯลฯ ดังนั้นวิธีที่เหมือนจริงเพียงแบบนี้ ผ่านองค์ประกอบของวัตถุ

ทั้งหมดที่เป็นไปได้โดยไม่ต้องมีส่วนประกอบเป็นเวลานานเกินไป


-1 ส่วนประกอบเป็นรูปแบบขององค์ประกอบ

รูปแบบ แต่ไม่เหมือนกันเนื่องจากมีคุณสมบัติที่แตกต่างกัน (ดังนั้นฉันไม่เข้าใจความคิดเห็นของคุณและ -1)
idefix

1
เมื่อคุณพูดว่า "องค์ประกอบเทียบกับองค์ประกอบ" มันไม่ชัดเจนว่าคุณเปรียบเทียบอะไรเนื่องจากส่วนประกอบเป็นองค์ประกอบ คุณหมายถึงองค์ประกอบแบบไดนามิกกับส่วนประกอบแบบคงที่หรือไม่? เมื่อเทียบกับองค์ประกอบของประเภทที่ไม่เกี่ยวข้องกับครอบครัวหรือโครงสร้าง? "ค่าใช้จ่ายตามองค์ประกอบ" คืออะไร ในระบบส่วนประกอบคงที่ (และระบบไดนามิกจำนวนมาก) ค่าใช้จ่ายเกือบเป็นศูนย์

หืมจุดที่น่าสนใจ คุณสนใจการอภิปรายที่ละเอียดกว่านี้ไหม? ถ้าไม่ฉันต้องการส่งที่อยู่อีเมลของฉันไปยังแพลตฟอร์มอื่น
idefix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.