c++ GUI เหตุการณ์/การออกแบบการส่งข้อความ

ฉันกำลังสร้างเกมง่ายๆ โดยใช้ DirectX 9 และ C++ ฉันดูที่ GUI ของ SDK แต่ฉันคิดว่าฉันสามารถใช้งานสิ่งที่ง่ายกว่านี้ได้

ทั้งหมดที่ฉันต้องการคือหน้าต่าง ป้ายกำกับ ปุ่ม กล่องข้อความ และช่องทำเครื่องหมาย

ฉันได้สร้าง GUIObject คลาสพื้นฐานที่สืบทอดมาทั้งหมด รวมถึงข้อมูลพื้นฐานเช่นขนาดและโฟกัสและอื่นๆ อีกมากมาย จากนั้นคลาสที่ได้รับ เช่น GUILabel ทั้งหมดจะกำหนด render(), update() และอะไรก็ตาม

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

ดังนั้นฉันจึงพยายามทำให้ GUILabel::Click() ใช้ตัวชี้ฟังก์ชันเป็นอาร์กิวเมนต์ในช่วงสั้นๆ แต่แล้วฉันก็รู้ว่าฉันจำเป็นต้องมีวิธีสมาชิกของคลาสของรัฐเป็นแบบคงที่ (เป็นไปไม่ได้จริงๆ เว้นแต่ทุกอย่างในนั้นจะเป็นแบบคงที่เช่นกันใช่ไหม) หรือส่งผ่านคลาส GUIObject ด้วยเช่นกัน นั่นคือทางที่จะไปเหรอ?

ฉันสามารถกำหนดที่มาของ GUILabel (หรือปุ่มหรืออะไรก็ตาม) ภายในสถานะของเกมและแทนที่การกระทำใดก็ตามที่ฉันต้องการได้หรือไม่ แล้วทำแบบนั้นกับการควบคุมใดก็ตามที่ฉันต้องการในสถานะนั้นเหรอ?

วิธีที่เหมาะสมในการใช้การจัดการเหตุการณ์คืออะไร?


person Nick    schedule 17.06.2011    source แหล่งที่มา
comment
ฉันกำลังพยายามดูว่าฉันสามารถออกแบบสิ่งนี้เช่น Swing ของ Java ได้อย่างไร โดยในกรณีของฉัน สถานะของเกมนั้นได้มาจากองค์ประกอบ GUI บางอย่าง (เช่น หน้าต่าง) และการกระทำทั้งหมดถูกกำหนดไว้ที่นั่นในวิธีการของตัวเองและส่งผ่าน (โดยใช้การบูสต์ หวังว่าห้องสมุด) เป็นการเรียกกลับ ฉันจะดูว่าสิ่งนี้ดำเนินไปอย่างไร ฉันไม่ชอบสิ่งนี้มากนักและพยายามแฮ็กมันออกเพื่อเข้าถึงเนื้อเกม แต่เมื่อเห็นว่าเกมส่วนใหญ่ขึ้นอยู่กับการโต้ตอบของ GUI นี้ ฉันคิดว่าการวางแผนเล็ก ๆ น้อย ๆ จะช่วยได้มาก...   -  person Nick    schedule 21.06.2011
comment
อย่าสร้างล้อนิค แค่อย่า   -  person Nick    schedule 14.10.2020


คำตอบ (2)


คุณอาจต้องการพิจารณาใช้ไลบรารีการส่งสัญญาณ เช่น boost::signals เพื่อให้คุณมีความยืดหยุ่นในการกำหนดอินเทอร์เฟซระหว่างออบเจ็กต์ GUI ของคุณและเหตุการณ์สำคัญที่การโทรกลับแต่ละครั้งจะทริกเกอร์ นอกจากนี้ยังมีประโยชน์สำหรับความสัมพันธ์แบบย้อนกลับที่คุณต้องการองค์ประกอบ GUI เช่น ตัวบ่งชี้สถานะ ฯลฯ เพื่อตอบสนองต่อเหตุการณ์ที่ซ่อนอยู่

person Jason    schedule 17.06.2011

สำหรับเหตุการณ์การโทรกลับ/คลิก ฉันจะใช้ boost::function/boost::bind ในเฟรมเวิร์ก GUI ของฉัน ฉันเคยมีคลาสนามธรรมที่แตกต่างกันสองคลาส InputHandler และ Renderable สำหรับการจัดการการสัมผัสและการเรนเดอร์ สิ่งนี้นำไปสู่การออกแบบที่ส่วนประกอบที่ไม่จำเป็นต้องคลิกได้ (เช่น UILabel) ไม่จำเป็นต้องใช้วิธีการที่ไร้ประโยชน์

ฮธ, อเล็กซ์

person Alex Kremer    schedule 17.06.2011