ฉันจะออกแบบชุดรูปแบบการโต้ตอบวัตถุเกมที่มีประสิทธิภาพด้วยสถาปัตยกรรมที่ใช้ส่วนประกอบได้อย่างไร


14

นี่เป็นคำถามการออกแบบ ... ฉันแน่ใจว่านี่จะเป็นแบบทั่วไปมากขึ้น แต่ฉันมีปัญหากับมัน ฉันสงสัยเกี่ยวกับการออกแบบสำหรับการโต้ตอบวัตถุเกม - นี่คือตัวอย่างของฉัน (2D puzzle-platformer)

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

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

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

นอกจากนี้การเชื่อมต่อเสียงกับการโต้ตอบเหล่านี้ ดูเหมือนว่าการเชื่อมต่อเสียงกับระบบจะเหมือนกับการเชื่อมต่อกับคุณสมบัติอื่น ๆ เช่นการมองเห็นหรือการเคลื่อนไหว / การชนของผู้เล่น

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

ข้อมูลอื่น ๆ : เครื่องยนต์ฉันใช้เป็นเครื่องมือ XNA เรียกIceCream


อาจเป็นไปได้ที่ซ้ำกันของข้อมูลระบบตามส่วนประกอบ

2
มีคำถามจริงที่นี่แม้ว่าตรงข้ามกับ "คำถาม" ที่ลิงค์ที่โจให้
dash-tom-bang

2
ไม่เห็นคนดักคำถามคือเกี่ยวกับวิธีการออกแบบข้อกำหนดเฉพาะของเกมในโค้ดโดยใช้ระบบคอมโพเนนต์ (@Christopher: พูดถึงว่าใครจะช่วยได้บ้างคุณกำลังใช้ Unity หรือไม่? Torque? Proprietary?)
LearnCocos2D

2
ฉันชอบไอเดียการเล่นเกมของคุณโดยวิธี =)
Nailer

คำตอบ:


5

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

  1. เพิ่มรหัสไปยังองค์ประกอบที่มีน้ำหนักเบาเพื่อแพลตฟอร์มโครงการ (ใช้งานได้)
  2. คัดลอกส่วนประกอบนั้นไปยังส่วนประกอบใหม่ลบสิ่งแพลตฟอร์มและเพิ่มรหัสเพื่อลดแรงเสียดทานของวัตถุที่เหมาะสม (ใช้การทำงานนี้ตรวจสอบว่า # 1 ยังใช้งานได้)
  3. คัดลอกส่วนประกอบนั้นไปยังส่วนประกอบใหม่ลบรหัส "ใหม่" และเพิ่มเนื้อหาเพื่อปิดใช้งานเอฟเฟกต์ส่วนประกอบอื่น ๆ (ใช้การทำงานนี้จากนั้นยืนยันว่า # 1 และ # 2 ยังคงใช้งานได้)

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


ฉันกำลังทำเครื่องหมายสิ่งนี้เป็นคำตอบเพราะมันจะตอบว่า "ฉันควรออกแบบอย่างไร ... " ขอบคุณสำหรับสิ่งนี้แน่นอนทำให้ฉันอยู่บนเส้นทางที่ถูกต้อง
Christopher Horenstein

2

โดยทั่วไปเมื่อวัตถุประเภท A โต้ตอบกับวัตถุประเภท B คุณต้องการให้เอฟเฟกต์บางอย่าง C เรียกว่า"การแจกจ่ายสองครั้ง"และยากที่จะทำอย่างหรูหราในภาษา C-like

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

รูปแบบของผู้เข้าชมเป็นโซลูชั่นที่มีประสิทธิภาพมากขึ้นว่าหนังประเภทการสลับที่น่ารังเกียจ แต่สามารถ clumbersome การตั้งค่า

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


2

ให้ฉันดู. นี่เป็นเพียงสิ่งที่ฉันปรุงขึ้นในหัวของฉันในขณะที่ฉันกำลังเขียนดังนั้นขอโทษถ้าฉันขาดอะไร

รับโหนดแสงทั้งหมดในระยะที่เหมาะสมรอบเพื่อนของคุณ

สำหรับแสงแต่ละครั้งคุณจะสร้างรูปหลายเหลี่ยมที่แสดงว่าเป็นเอฟเฟกต์ของวัตถุเฟรมเฟรม ดังนั้นกรวยแสงจะสร้างกรวยหนึ่งพิกเซลใน FBO ของคุณ สร้างการแสดงผลแต่ละโหนดในการส่งผ่านในลำดับความสำคัญที่เหมาะสม คุณสามารถเข้ารหัสข้อมูลลงในแต่ละพิกเซลเช่นช่องสีเขียวอาจเป็น fricition, แดงเป็นแรงโน้มถ่วง, สีน้ำเงินและอัลฟาเป็นอย่างอื่น

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

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

scetch หยาบทำใน 2 นาทีชนิดของการแสดงความคิดของฉัน:

ภาพประกอบ

แก้ไข: ในทางปฏิบัติสิ่งนี้หมายถึงสิ่งเดียวที่คุณต้องการคือองค์ประกอบแสงหนึ่งเปล่งสีที่แน่นอน กฎที่เชื่อมโยงกับสีใดสามารถทำอะไรที่อื่นได้อย่างสิ้นเชิง คุณสามารถเข้ารหัสข้อมูลจำนวนมากเป็น 32 บิตที่คุณมีพิกเซล pr หรือคุณสามารถมี FBO หลายรายการที่มีคุณลักษณะที่แตกต่างกันซึ่งจะไม่ส่งผลกระทบต่อกันและกัน คุณอาจมีแรงโน้มถ่วง / แรงเสียดทาน FBO และการชนหนึ่งครั้ง 1 บิต FBO หากคุณเลือกสิ่งนี้คุณจะต้องตั้งค่าสถานะ FBO ที่แสงของคุณจะแสดง


ขอบคุณสำหรับข้อมูลของคุณ ฉันชื่นชมภาพและนี่ทำให้ฉันคิดเกี่ยวกับวิธีที่ช่างสามารถทำงานเบื้องหลังได้
Christopher Horenstein

เฮ้ไม่มีปัญหา ฉันรู้ว่ามันไม่ได้ตอบคำถามของคุณแน่นอน แต่ปัญหาบางอย่างต้องการวิธีแก้ปัญหาเฉพาะ โชคดี!
Nailer

0

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

มีการนำสัญญาณ / สล็อตมาใช้งานมากมาย ตัวอย่างเช่นใน C ++ มี ไลบรารี sigslot

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ่านสัญญาณ Qt และช่อง

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