รูปแบบการออกแบบการเขียนโปรแกรมอะไรบ้างที่มีประโยชน์ในการพัฒนาเกม [ปิด]


129

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

ตัวอย่างเช่นฉันมีหนังสือชื่อว่า ActionScript 3 ที่มีรูปแบบการออกแบบที่มีรายละเอียดรูปแบบการออกแบบหลายอย่างเช่นตัวควบคุมมุมมองโมเดล, ซิงเกิล, โรงงาน, คำสั่ง ฯลฯ

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

หากคุณมีประสบการณ์ในการใช้รูปแบบการออกแบบบางอย่างในการพัฒนาเกมฉันชอบที่จะได้ยิน การให้เหตุผลว่าเหตุใดจึงใช้ตัวอย่างรหัสหรือแหล่งข้อมูลออนไลน์จะมีประโยชน์มากเช่นกันหากคุณมี ตอนนี้ฉันสนใจการใช้ ActionScript 3 และ C ++ มากที่สุด แต่อาจได้รับประโยชน์จากประสบการณ์และตัวอย่างจากภาษาใด ๆ

ขอบคุณ!


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

3
@ Kylotan ดูเหมือนว่าจากมุมมองที่ จำกัด ของฉันว่าเนื่องจากรูปแบบการออกแบบแต่ละแบบมีจุดมุ่งหมายเพื่อแก้ไขปัญหาเฉพาะอย่างในลักษณะที่มีประสิทธิภาพโดยธรรมชาติของพวกเขารูปแบบการออกแบบบางอย่างจะมีประโยชน์มากกว่าคนอื่น ๆ ที่ได้รับชุดปัญหาเฉพาะ ปัญหาเหล่านั้นทำให้เกิดการพัฒนาเกมที่ไม่เหมือนใคร มีแนวทางบางอย่างหรือตามประสบการณ์ของคุณรูปแบบการออกแบบเฉพาะที่คุณพบว่าคุณใช้บ่อยกว่าคนอื่นหรือไม่
jcurrie33

ก่อนที่ทุกคนออกไปและเรียนรู้ 1000 รูปแบบการออกแบบที่แตกต่างกันโปรดอ่านนี้และนี้
BlueRaja - แดนนี่ Pflughoeft

@ BlueRaja-DannyPflughoeft ลิงก์ Secon ไม่ถูกต้อง คุณช่วยส่งอีกครั้งได้ไหม
Emadpres

คำตอบ:


163

ตอนนี้เพื่อการตอบสนองที่ราบรื่นน้อยกว่าพร้อมคำแนะนำ อย่าใช้สิ่งเหล่านี้เป็นคำแนะนำในการใช้งานและเป็นตัวอย่างของการใช้ที่เป็นไปได้

  • ตัวสร้าง: ตั้งค่าเอนทิตีที่ยึดตามส่วนประกอบทีละองค์ประกอบตามข้อมูล
  • วิธีการจากโรงงาน: สร้าง NPC หรือวิดเจ็ต GUI ตามสตริงที่อ่านจากไฟล์
  • ต้นแบบ: เก็บอักขระ 'เอลฟ์' หนึ่งตัวพร้อมคุณสมบัติเริ่มต้นและสร้างอินสแตนซ์เอลฟ์โดยการโคลน
  • ซิงเกิล: พื้นที่นี้เว้นว่างโดยเจตนา
  • อะแดปเตอร์: รวมไลบรารีของบุคคลที่สามที่เป็นตัวเลือกโดยห่อไว้ในเลเยอร์ที่ดูเหมือนรหัสที่มีอยู่ของคุณ มีประโยชน์มากกับ DLLs
  • Composite: สร้างกราฟฉากของวัตถุที่แสดงผลได้หรือสร้าง GUI จากต้นไม้ของวิดเจ็ต
  • Facade: ลดความซับซ้อนของไลบรารี่ของบุคคลที่สามด้วยการจัดหาอินเทอร์เฟซที่เรียบง่ายเพื่อทำให้ชีวิตของคุณง่ายขึ้นในภายหลัง
  • Flyweight: จัดเก็บแง่มุมที่ใช้ร่วมกันของ NPC (เช่นแบบจำลองพื้นผิวภาพเคลื่อนไหว) แยกต่างหากจากแต่ละด้าน (เช่นตำแหน่งสุขภาพ) ในแบบโปร่งใสส่วนใหญ่
  • พร็อกซี: สร้างคลาสขนาดเล็กบนไคลเอนต์ที่แสดงคลาสที่ใหญ่ขึ้นซับซ้อนกว่าบนเซิร์ฟเวอร์และส่งต่อคำขอผ่านเครือข่าย
  • ห่วงโซ่ความรับผิดชอบ: จัดการอินพุตเป็นสายโซ่ของตัวจัดการเช่น ปุ่มสากล (เช่นสำหรับภาพหน้าจอ) จากนั้น GUI (เช่นในกรณีที่กล่องข้อความเน้นหรือเมนูขึ้น) จากนั้นเกม (เช่นสำหรับการย้ายตัวละคร)
  • Command: ห่อหุ้มฟังก์ชันการทำงานของเกมเป็นคำสั่งที่สามารถพิมพ์ลงในคอนโซลจัดเก็บและเล่นซ้ำหรือแม้แต่เขียนสคริปต์เพื่อช่วยทดสอบเกม
  • ผู้ไกล่เกลี่ย: ใช้เอนทิตีเกมเป็นคลาสคนกลางขนาดเล็กที่ทำงานกับส่วนประกอบต่าง ๆ (เช่นการอ่านจากองค์ประกอบด้านสุขภาพเพื่อส่งผ่านข้อมูลไปยังองค์ประกอบ AI)
  • ผู้สังเกตการณ์: มีการแสดงตัวของตัวละครที่ฟังเหตุการณ์จากการเป็นตัวแทนทางตรรกะเพื่อเปลี่ยนการนำเสนอภาพเมื่อมีความจำเป็นโดยไม่ต้องใช้ตรรกะของเกมจำเป็นต้องรู้อะไรเกี่ยวกับการสร้างรหัส
  • สถานะ: เก็บ NPC AI เป็นหนึ่งในหลาย ๆ รัฐเช่น โจมตีหลงทางหนี แต่ละคนสามารถมีวิธีการอัพเดต () ของตัวเองและข้อมูลอื่น ๆ ที่ต้องการ (เช่นการจัดเก็บอักขระที่มันถูกโจมตีหรือหนีออกจากพื้นที่ที่มันกำลังหลงทาง ฯลฯ )
  • กลยุทธ์: สลับไปมาระหว่างฮิวริสติกที่แตกต่างกันสำหรับการค้นหา A * ของคุณขึ้นอยู่กับภูมิประเทศที่คุณอยู่หรืออาจใช้เฟรมเวิร์ก A * เดียวกันเพื่อทำทั้งการค้นหาเส้นทางและการวางแผนทั่วไป
  • แม่แบบวิธีการ: ตั้งค่ารูทีนทั่วไป 'combat' พร้อมฟังก์ชั่น hook ที่หลากหลายเพื่อจัดการแต่ละขั้นตอนเช่น กระสุนที่ลดลง, คำนวณโอกาสในการโจมตี, แก้ไขการชนหรือพลาด, คำนวณความเสียหายและทักษะการโจมตีแต่ละประเภทจะใช้วิธีการในแบบของตนเอง

บางรูปแบบถูกทิ้งไว้เนื่องจากขาดแรงบันดาลใจ


การสนทนาที่กระจ่างแจ้งมากเกี่ยวกับซิงเกิลสามารถพบได้ที่นี่: misko.hevery.com/2008/08/25/root-cause-of-singletons
Andrew Wang

+1 สำหรับรูปแบบกลยุทธ์ ฉันใช้เพื่อจุดประสงค์ที่แน่นอนที่กล่าวไว้ข้างต้น (เสียบฮิวริสติก A * ที่แตกต่างกัน)
Mike Strobel

1
ขอบคุณสำหรับคำตอบนี้เสียงที่ออกมาเหมือนรูปแบบการออกแบบมากกว่าปกติ "ซิงเกิล" ฉันได้ยินมาทุกที่ ...
jokoon

รายการตัวอย่างที่ยอดเยี่ยม แม้จะมีการใช้รูปแบบซิงเกิลที่ไม่เหมาะสม (สถานะปลอมตัวทั่วโลก) แต่ก็มีการใช้งานที่ถูกต้องตามกฎหมาย: เมื่อมันแสดงถึงทรัพยากรที่คุณมี (หรือต้องการ) เพียงอย่างเดียว สิ่งนี้อาจเป็นสิ่งที่ต้องการห่อฮาร์ดแวร์ (เช่นแป้นพิมพ์ / เมาส์) หรือล้อมรอบไลบรารีที่ไม่ได้เป็น reentrant (เกิดขึ้นและไม่ใช่ทุกภาษาที่มีคีย์เวิร์ดการซิงโครไนซ์เวทมนต์)
charstar

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

59

ผมเขียนหนังสือเกี่ยวกับว่าที่หัวข้อ: รูปแบบการเขียนโปรแกรมเกม บทที่มีอาจเป็นประโยชน์สำหรับคุณ


2
+1 ฉันหวังว่าจะมีใครบางคนเชื่อมโยงกับสิ่งนั้นและฉันเห็นว่าผู้เขียนมี! คำอธิบายรูปแบบองค์ประกอบมีประโยชน์มากและฉันชอบให้คุณลองใช้ตัวอย่างโค้ดแบบเต็มเพื่อสาธิต
CodexArcanum

2
ใช่ - ฉันจำการอ่านลิงค์ของคุณไม่กี่ปีที่ผ่านมา คุณควรทำบทความให้จบ!
onedayit จะทำให้

2
ตอนนี้หนังสือเล่มนี้จะเสร็จสิ้น :)
Dusan

1
ทรัพยากรที่น่าทึ่งที่ช่วยฉันแปลความรู้การเขียนโปรแกรมที่มีอยู่ของฉันไปเป็นการเขียนโปรแกรมสำหรับเกม ขอบคุณที่เขียนมัน!

คำอธิบายเกี่ยวกับรูปแบบการเขียนโปรแกรมเกมช่วยให้ฉันเข้าใจรูปแบบการออกแบบในแบบที่ไม่มีรูปแบบการออกแบบซอฟต์แวร์ทำจริงๆ! นี่เป็นส่วนหนึ่งของพลังของการพัฒนาเกม (ตัวอย่างที่เป็นรูปธรรมในภาษาที่พูดกับฉันและทำให้ฉันพัฒนาพัฒนาการโดยรวมได้ดีขึ้น) แต่ส่วนใหญ่เพราะการเขียนนั้นยอดเยี่ยมมาก
Kzqai

19

สิ่งหนึ่งที่แบรนดอนไอชมีความรู้สึกที่ดีที่จะนำขึ้นมาใช้ในโคเดอร์สออฟเวิร์คคือรูปแบบการแฮ็กและการแก้ปัญหา: [รูปแบบ] แสดงข้อบกพร่องบางอย่างในภาษา รูปแบบเหล่านี้ไม่ฟรี ไม่มีอาหารกลางวันฟรี ดังนั้นเราควรมองหาวิวัฒนาการในภาษาที่เพิ่มบิตที่ถูกต้อง

ในฐานะโปรแกรมเมอร์เกมแทนที่จะเป็นผู้ออกแบบคอมไพเลอร์เราไม่ค่อยได้รับตัวเลือกในการพัฒนาภาษาที่เราใช้ แต่เราสามารถเรียนรู้ที่จะพัฒนาสไตล์ของเราเองเพื่อให้เหมาะกับภาษาและความต้องการของเรา รูปแบบเป็นของบางอย่าง แต่การไม่ใช้รูปแบบเป็นอีกส่วนหนึ่งโดยเฉพาะอย่างยิ่งเมื่อ Brandon กล่าวว่ารูปแบบนั้นไม่ค่อยมีเลยหากไม่มีประสิทธิภาพที่น่าทึ่งหรือหน่วยความจำหรือความว่องไวของโค้ด MVC นั้นไม่ใช่รูปแบบที่ยอดเยี่ยมสำหรับหลาย ๆ สิ่งในเกม Singleton เป็นวิธีแก้ปัญหาสำหรับกฎการเริ่มต้นแบบสแตติก C ++ แบบคงที่และคุณอาจไม่ควรทำสิ่งเหล่านี้อยู่ดี Factory ทำให้การสร้างวัตถุที่ซับซ้อนง่ายขึ้น - บางทีวัตถุของคุณควรเริ่มต้นได้ง่ายกว่า รูปแบบที่ได้รับความนิยมคือเครื่องมือที่ใช้ในยามที่เราต้องการ เพื่อจัดการสิ่งที่ซับซ้อนไม่ใช่เครื่องมือที่เราควรใช้ในการสร้างสิ่งที่ซับซ้อนในตอนเริ่มต้น

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


4
ใช่สิ่งหนึ่งที่ชัดเจนในหนังสือต้นฉบับ (แต่มักถูกมองข้าม) คือถ้ามันถูกเขียนขึ้นสำหรับ C แทนที่จะเป็น C ++ / Smalltalk พวกเขาอาจมีรูปแบบ "การสืบทอด" และโทเค็นเดียวกันบางภาษา อาจมีรูปแบบ GoF บางส่วนที่สร้างไว้แล้ว
Kylotan

13
สิ่งอื่น ๆ ที่มักจะมองข้ามในหนังสือเล่มเดิม (ต้นฉบับหนังสือต้นฉบับโดยอเล็กซานเดไม่ GoF) เป็นรูปแบบที่เป็นเครื่องมือในการสื่อสารไม่ได้ดำเนินการ พวกเขาปล่อยให้นักออกแบบสื่อสารเกี่ยวกับการใช้งานในระดับที่สูงขึ้นและมีการระบุเพราะพวกเขาเกิดขึ้นซ้ำไม่จำเป็นเพราะพวกเขาควรจะใช้เมื่อเป็นไปได้

1
อย่างไรก็ตามการมีคำศัพท์เพียงอย่างเดียวสามารถช่วยให้คุณมีเหตุผลเกี่ยวกับปัญหาและรับรู้เมื่อวิธีการดังกล่าวเป็นทางออกที่ดี รูปแบบที่ดีที่สุดมักได้รับการขัดเกลาเมื่อเวลาผ่านไปโดยคนงานที่มีทักษะและประสบการณ์และคนงานที่มีทักษะน้อยกว่าจะไม่ได้ค้นพบรูปแบบเดียวกันด้วยตัวเอง
Kylotan

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

ขอบคุณสำหรับคำตอบนี้ ฉันรู้สึกโล่งใจที่ได้อ่านว่ารูปแบบการออกแบบนั้นทำขึ้นเพื่อแก้ไขปัญหาที่เกิดจากการออกแบบซอฟต์แวร์ ฉันคิดว่าโครงสร้างของซอฟต์แวร์ขนาดใหญ่ควรจะคิดตั้งแต่ต้นจนจบก่อนที่จะเริ่มเขียนโค้ดอะไรจริง ๆ คุณไม่สามารถใช้ฟังก์ชั่นได้ตลอดเวลาบางครั้งคุณต้องคิดถึงคุณสมบัติเฉพาะแต่ละอย่างและตรวจสอบว่ามันจะไม่ยุ่งกับโครงสร้างระดับโลกของซอฟต์แวร์หรือแค่เข้าไปหาวิธีที่ซอฟต์แวร์ถูกวางจำหน่าย ประพฤติ. การแบ่งงานให้กับโปรแกรมเมอร์หลายบางครั้งสามารถสร้างความขัดแย้ง ...
jokoon

7

แน่นอนอย่างที่คนอื่น ๆ บอกว่ารูปแบบทั้งหมดมีประโยชน์ในสถานการณ์ที่เหมาะสมและส่วนหนึ่งของการเรียนรู้วิธีใช้พวกเขาคือการเรียนรู้ว่าจะใช้เมื่อใด อย่างไรก็ตามเทคนิคและอัลกอริทึมหลักของหนังสือยอดเยี่ยมในการเขียนโปรแกรมเกมโดย Daniel Sanchez-Crespo Dalmau แสดงรูปแบบการเขียนโปรแกรมหกรูปแบบและรูปแบบการใช้งานหกรูปแบบซึ่งมีประโยชน์อย่างยิ่งในการเขียนโปรแกรมเกม

การเขียนโปรแกรม:

  • ซิงเกิล: ฉันไม่ได้เกลียดคนนี้เหมือนที่หลาย ๆ คนทำ มันสามารถใช้สำหรับสิ่งต่าง ๆ เช่นผู้เล่นผู้เล่นเดี่ยวหรือผู้อ่านแป้นพิมพ์
  • โรงงาน: ช่วยให้คุณสร้างและทำลายวัตถุได้อย่างมีประสิทธิภาพ
  • กลยุทธ์: ช่วยให้คุณเปลี่ยนกลยุทธ์ AI ได้อย่างสวยงาม
  • ดัชนีเชิงพื้นที่: ช่วยดำเนินการสืบค้นในชุดข้อมูลเชิงพื้นที่
  • Composite: ตั้งค่าลำดับความสำคัญของวัตถุที่มีประโยชน์
  • Flyweight: ปลดปล่อยความทรงจำด้วยการทำให้สิ่งต่าง ๆ เหมือนศัตรูเหมือนกัน

การใช้งาน:

  • โล่: ปกป้องจากการเปิดใช้งานอย่างไม่ตั้งใจของการกระทำ
  • รัฐ: ตัวชี้นำภาพของสถานะโลก / UI
  • การยกเลิกโหมดอัตโนมัติ: ทำให้เกมทำงานอย่างชาญฉลาดยิ่งขึ้น
  • อำนาจแม่เหล็ก: เลือกอัตโนมัติและเลือกหน่วยได้ง่าย
  • โฟกัส: กำจัดองค์ประกอบ UI ที่รบกวนสมาธิ
  • ความคืบหน้า: มีประโยชน์สากล

แน่นอนว่าหนังสือเล่มนี้มีรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้


ขอบคุณสำหรับการเข้า! ฉันไม่ทราบเกี่ยวกับหนังสือเล่มนั้น แต่จะพิจารณาในตอนนี้จากการโพสต์ของคุณ ขอบคุณอีกครั้ง!
jcurrie33

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

ได้โปรดเกลียดคนโสด มันทำสองสิ่งไม่ดี การเข้าถึงและความเป็นสากล บ่อยครั้งที่นักพัฒนาคิดว่าการเข้าถึงระดับโลก == ซิงเกิล มีปัญหาเพียงไม่กี่อย่างที่ต้องการซิงเกิลจริงและอาจมีอีกสองสามข้อที่สง่างามกว่าเมื่อแก้ไขด้วยซิงเกิล
deft_code

7

ระบบเอนทิตีเป็นรูปแบบที่ดี มันไม่ใช่รูปแบบการออกแบบที่แน่นอนเพราะไม่ใช่ OOP อย่างน่ากลัว อย่างไรก็ตามคุณสามารถผสมกับ OOP

ลิงก์ที่ดีบางรายการ (เริ่มจากบนสุดสำหรับอินโทรภายใน):


3
"มันไม่ใช่รูปแบบการออกแบบที่แน่นอนเพราะมันไม่ใช่แบบ OOP [sic]" รูปแบบการออกแบบไม่เกี่ยวข้องกับ OOP หากมีสิ่งใด OOP เองก็เป็นรูปแบบการออกแบบ รูปแบบการออกแบบไม่เพียง แต่อยู่นอกเหนือจาก OOP เท่านั้น แต่ยังรวมถึงการพัฒนาซอฟต์แวร์ด้วย

นอกจากนี้OOP design patternsที่มักจะแสดงความสัมพันธ์และการมีปฏิสัมพันธ์ระหว่างเรียน / วัตถุ และยังมีลวดลายการออกแบบอื่น ๆ อีกมากมาย OOP เป็นชุดของแนวคิดไม่ใช่รูปแบบจริงๆ Design patternเป็นแนวคิดด้วย
topright

6
แทนที่จะพูดถึงความหมายคุณไม่ควรให้คะแนนความมีประโยชน์ของคำตอบที่ฉันได้รับ?
Wernight

6

ทั้งหมดนั้น. ยกเว้นซิงเกิล [/ เล้]


คุณอาจตั้งชื่อรูปแบบการออกแบบหนึ่งหรือสองรูปแบบที่คุณใช้เป็นประจำในการพัฒนาเกมของคุณและด้วยเหตุผลใดบ้าง ในฐานะผู้เริ่มต้นที่เกี่ยวกับรูปแบบการออกแบบ "ทุกคน" ไม่ใช่คำตอบที่เป็นประโยชน์อย่างยิ่ง ขอบคุณที่ตอบกลับ
jcurrie33

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

@ jcurrie33: ขอโทษฉันไม่สามารถต้านทานการขุดที่ singletons ก่อน ;)
Kylotan

6

ไม่เกี่ยวกับรูปแบบจริงๆ แต่เกี่ยวกับหลักการพื้นฐานที่อยู่เบื้องหลังพวกเขา ใน"รูปแบบการออกแบบ: องค์ประกอบของซอฟต์แวร์เชิงวัตถุที่ใช้ซ้ำได้" (1995)กลุ่มของสี่ (Gamma, Erich; Richard Helm, Ralph Johnson และ John Vlissides) แนะนำเพียงสองหลักการสำหรับการออกแบบเชิงวัตถุ: (1)โปรแกรมเพื่อ อินเทอร์เฟซและไม่นำไปใช้และ(2)สนับสนุนการจัดวางวัตถุมากกว่าการสืบทอดคลาส

หลักการ 2 ข้อนี้มีประโยชน์มากในการพัฒนาเกม ตัวอย่างเช่นโปรแกรมเมอร์เกมจำนวนมากใช้ลำดับชั้นระดับลึกเพื่อเป็นตัวแทนเกม มีวิธีการอื่นตามองค์ประกอบ - วัตถุเกมตามองค์ประกอบ บทความเกี่ยวกับวิธีการนี้ แม้เชื่อมโยงมากขึ้น มันเป็นตัวอย่างลวดลายมัณฑนากร


ส่วนประกอบที่ใช้ในการออกแบบเกมนั้นมีรูปแบบกลยุทธ์ที่เป็นรัฐมากขึ้นซึ่งแสดงออกมาตามธรรมชาติในรูปแบบการปิดภายนอก C / C ++ / Java / C # และเป็นวัตถุองค์ประกอบภายใน ลวดลายมัณฑนากรเป็นเหมือนพร็อกซี ความเป็นเจ้าของและการไหลของข้อมูลอยู่ตรงข้ามกับที่เราหมายถึงเมื่อเราพูดถึงระบบส่วนประกอบในเกม

องค์ประกอบยังต้องพูดคุยกันนำรูปแบบเช่นผู้ไกล่เกลี่ยผู้สังเกตการณ์และนักแต่งเพลง "Component-Based Game" เป็นรูปแบบการออกแบบคอมโพสิตโดยตัวมันเอง
CodexArcanum

@CodexArcanum, Observer, แน่นอน แต่ไม่เสมอไปที่ผู้ไกล่เกลี่ย (เชนแห่งความรับผิดชอบสามารถใช้แทน) มันเป็นนักแต่งเพลงเฉพาะในกรณีที่ GameObject (ประกอบด้วย GameObjectComponent) เป็น GameObjectComponent เอง (ไม่ใช่สิ่งจำเป็น)
topright

6

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

นี่อาจเป็นรูปแบบที่เหมาะสมเมื่อคุณไม่จำเป็นต้องมีคอนเทนเนอร์ของประเภทคลาสพื้นฐานที่มีอินเทอร์เฟซที่คุณใช้อยู่ แต่คุณต้องการมีพฤติกรรมและอินเทอร์เฟซที่มีชื่อคล้ายกัน

ตัวอย่างเช่นคุณสามารถใช้สิ่งนี้เมื่อรวบรวมคลาสสำหรับหลายแพลตฟอร์มหรือเอ็นจิ้น (dx vs. opengl) ซึ่งทราบความแปรปรวนของชนิดในเวลารวบรวม


ฉันเกลียดเสมอว่าเลเยอร์ abstraction ของระบบปฏิบัติการเป็นเสมือน คุณไม่ต้องการเลเยอร์ abtraction สองเลเยอร์เลยทีเดียว ดีกว่าการใช้ CRTP
deft_code

บางทีฉันแค่แก่ แต่ฉันจะไม่ใช้ CRTP สำหรับ DX / OpenGL หรืออินเตอร์เฟสของแพลตฟอร์ม มันช้าเกินไปที่จะรวบรวม - ฉันแค่ใช้ typedefs CRTP นั้นดีเมื่อคุณต้องการแบ่งปันอินเตอร์เฟสและการใช้งานระหว่างคลาส แต่ไม่มีความสัมพันธ์อื่น ๆ ไม่ใช่เมื่อคุณต้องการเลือกโครงสร้างหนึ่งหรือโครงสร้างอื่น

4

รูปแบบการออกแบบที่ฉันพัฒนาขึ้นในช่วงหลายปีที่ผ่านมาและสิ่งที่ฉันได้รับนั้นมีประโยชน์อย่างน่าทึ่งคือสิ่งที่ฉันเรียกว่า "ชุดคำจำกัดความของนายหน้า" วิธีการสรุปในเงื่อนไข GOF ดูเหมือนจะขัดแย้ง แต่คำถามนี้ฉันเขียนเกี่ยวกับมันใน StackOverflowไปลงรายละเอียดเกี่ยวกับมัน

แนวคิดหลักคือคุณสมบัติของแบบจำลองบางอย่างเช่นสปีชีส์ของสัตว์ถูกตั้งค่าเพื่อให้แต่ละค่าที่เป็นไปได้สำหรับคุณสมบัตินั้นมีวัตถุนิยามที่สอดคล้องกัน - วัตถุเดียวที่ใช้ร่วมกันต่อมูลค่า - ที่ระบุพฤติกรรมของมัน และสิ่งเหล่านี้สามารถเข้าถึงได้ผ่านนายหน้ากลาง (ซึ่ง GOF-wise อาจเป็น Registry, Factory หรือทั้งสองอย่าง) ในการใช้งานของฉันพวกมันยังเข้าถึงได้โดยทั่วไปด้วยปุ่มสเกลาร์


ฉันไม่เห็นว่านี่เป็นซิงเกิลเลยและเมื่อพูดถึงรูปแบบฟลายเวทคำว่า "รีจิสตรี" ซ้ำซ้อน นี่เป็นเพียงฟลายเวท

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

-1 สำหรับรูปแบบขอบเขตนั้นเกี่ยวกับการสื่อสารอย่างรวดเร็วนี่อาจเป็นความล้มเหลวที่ใหญ่ที่สุดที่ฉันเคยเห็น ฉันไม่สามารถเข้าใจคำอธิบายนี้ได้อย่างจริงจัง

พระเยซูยกโทษให้ฉันเพราะไม่ตัดคุกกี้ให้เพียงพอสำหรับคุณ คุณจะลงคะแนนตอบว่า "ระบบ Entity" เช่นกันเพราะมันไม่ได้สรุปได้ทันทีในแง่ของ GOF?
ความวุ่นวาย

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