อะไรคือแนวทางที่ถูกต้องในการออกแบบคลาสในการพัฒนาเกม?


31

ฉันกำลังอยู่ระหว่างการพัฒนาเกม 2D sprite สำหรับ Windows 7 Phone โดยใช้ XNA การฝึกอบรมและแบบฝึกหัดที่มีให้นั้นค่อนข้างมีประโยชน์ แต่ปัญหาที่ฉันเผชิญคือแต่ละคนเข้าใกล้การออกแบบชั้นเรียนของพวกเขาแตกต่างกันและรหัสไม่ได้รับการพิจารณาเป็นพิเศษ ผลที่ตามมามันเป็นเรื่องยากสำหรับฉันที่จะได้รับความเข้าใจที่ดีเกี่ยวกับความรับผิดชอบที่ฉันควรให้กับชั้นเรียนเฉพาะ

ตัวอย่างเช่นฉันอาจมีคลาสสไปรต์พื้นฐานBaseSpriteที่รู้วิธีวาดตัวเองตรวจสอบการชน ฯลฯ จากนั้นฉันสามารถมีAnimatedSpriteคลาสที่รู้วิธีนำทางแผ่นสไปรต์ของExplodingSpriteคลาสและอื่น ๆ เทคนิคนี้จะแสดงให้เห็นในตัวอย่าง Space Invaders ใน Windows 7 โทรศัพท์ Jumpstart ช่วงที่ 2วัสดุ

อีกทางหนึ่งฉันสามารถวางการแสดงจำนวนมากและเรียกใช้ความรับผิดชอบของเกมในGameScreenชั้นเรียน คลาสนั้นและคลาสที่ได้รับนั้นมีลักษณะคล้ายกับฟอร์มหรือเว็บเพจมากขึ้นในแง่ของความรับผิดชอบ สไปรต์คลาสเป็นคอนเทนเนอร์แบบธรรมดาที่มีตรรกะน้อยกว่ามาก

นี่เป็นเทคนิคที่ใช้ในเกม Alien Sprite ของWindows 7 Phone Training Kitและตัวอย่างผู้จัดการเกมอื่น ๆ

อะไรคือแนวทางที่ถูกต้องในการออกแบบคลาสในการพัฒนาเกม?

คำตอบ:


26

ฉันใช้วิธีการที่เน้นส่วนประกอบมากกว่าซึ่งคุณจะมีคลาส Sprite ซึ่งมีส่วนประกอบเช่น Visual, Collision, Animation, Input และอื่น ๆ ด้วยวิธีนี้ฉันไม่ได้มีลำดับชั้นลึก (ซึ่งดี) .

สำหรับข้อมูลบางอย่างเกี่ยวกับตัวแทนการออกแบบเชิงดูที่นี่


2
+1 บทความที่คุณเชื่อมโยงไปนั้นยอดเยี่ยม ฉันให้ความสำคัญกับการออกแบบ OO อย่างแท้จริงฉันจึงมองข้ามรูปแบบองค์ประกอบ / มัณฑนากรอย่างสมบูรณ์
Josh E

1
รูปแบบองค์ประกอบไม่ได้จริงๆ "บริสุทธิ์น้อย" OO :)
Srekel

2
จริง OO มักถูกบรรจุด้วยมรดก แต่การสืบทอดเป็นเพียงเครื่องมือเดียวที่ OO นำเสนอการจัดวางเป็นอีกสิ่ง
haffax

เพียงแค่นั้น ฉันควรจะแม่นยำมากขึ้นในถ้อยคำของฉัน; สิ่งที่ฉันหมายถึงคือฉันมุ่งเน้นไปที่ด้านมรดกของ OO แทนการคิดรูปแบบการออกแบบ OO / ด้าน OO อื่น ๆ ที่สามารถช่วยให้ฉันบรรลุสิ่งที่ฉันต้องการ
Josh E

ในขณะที่วิธีการตามองค์ประกอบเชิงพาณิชย์นั้นค่อนข้างชัดเจนและใช้บ่อย แต่ฉันยังไม่เห็นวิธีแก้ปัญหาในการทำให้องค์ประกอบการแสดงผลพกพาได้ คำแนะนำใด ๆ จะดีมาก
Andreas


6

หลักการ SOLIDใช้มากที่สุดเท่าที่จะออกแบบรหัสเกมเป็นไปอาชีพอื่น ๆ - อย่างน้อยจนกว่าคุณจะมาเพิ่มประสิทธิภาพดังนั้นฉันใช้ตัวอย่างแรกของคุณเป็นจุดเริ่มต้น

ฉันจะไปให้ไกลกว่านี้เพราะ BaseSprite ฟังดูเหมือนมีแนวโน้มที่จะกลายเป็น megaclass หลักการความรับผิดชอบเดี่ยวกำหนดว่าการชนการเรนเดอร์และการนำทางควรได้รับการจัดการโดยส่วนประกอบแทนที่จะเป็นแต่ละรายการในลำดับชั้นของคลาส ระดับการถือครองของส่วนประกอบเหล่านี้ทั้งหมดควรจัดการกับการผลักดันตำแหน่งโลกระหว่างพวกเขา


5

สำหรับโปรเจ็กต์สุดท้ายฉันได้โน้มตัวเข้าหาแนวทางสไตล์ MVC มากขึ้น

ตอนแรกเราไม่แน่ใจว่ามันจะใช้งานได้หรือเปล่า

แบบ

วัตถุข้อมูล เพียงแค่ข้อมูลที่บริสุทธิ์ ไม่มีพฤติกรรมไม่มีการเรนเดอร์

ผู้จัดการข้อมูล เพียงแค่จัดการ "รายการ" ของวัตถุข้อมูล (สามารถปรับปรุงเพื่อรองรับการรวมกำไรกัน)

ดู

เราเรียกพวกมันว่าเรนเดอร์ สำหรับวัตถุชนิดข้อมูลทุกชนิดจะมีโหมดแสดงภาพ เมื่อถูกเรียกพร้อมกับผู้จัดการมันจะแสดงวัตถุทั้งหมดในรายการนั้น

ตัวควบคุม

เหมือนกับ renderers แต่ควบคุมพฤติกรรม

ตัวอย่าง

ShipManager มีรายการของเรือ ShipController จะย้ายเรือตามสถานะของพวกเขา ShipRenderer จะทำการจัดส่งตามสถานะของพวกเขา

ทำไม

วิธีนี้จะแยกมุมมองและตรรกะอย่างเคร่งครัด ทำให้การย้ายไปยังแพลตฟอร์มใหม่นั้นง่ายมาก การปรับเค้าโครงข้อมูลให้เหมาะสมภายใน XxxManager นั้นง่ายมากเช่นกัน


2
ฉันลงคะแนนให้คุณเพราะฉันเบื่อที่จะเห็น "ใช้ MVC" เปลือยมากขึ้นหรือน้อยลงเป็นคำตอบที่ยอมรับได้ หากคุณกำลังพัฒนาบนแพลตฟอร์มที่ทันสมัยคุณกำลังใช้ MVC ในหลายระดับอยู่แล้ว ไม่ใช่คำตอบที่เฉพาะเจาะจงและไม่ใช่คำตอบที่ดีเพราะไม่ได้บอกวิธีการจัดโครงสร้างคลาสซึ่งเป็นภารกิจ / โดเมนเฉพาะเจาะจง คุณเพิ่งจบลงด้วยผู้คนมากมายที่เขียน "class Modal ... ; Class View ... ; Class Controller ... " MVC เป็นรูปแบบที่มีพลังในการอธิบายระดับสูงที่ดีเมื่อพูดถึงโค้ดที่มีอยู่ มันไม่ใช่รูปแบบที่มีพลังในการวางแผนที่ดี

4
@Joe I get your point, but find your choice of words unnecessary rude. I just explained how we do it. Since the higher level architecture choice makes the lower level design choice obsolete, I consider it a valid answer.
Andreas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.