คำถามติดแท็ก architecture

รหัสมีโครงสร้างอย่างไร สำหรับคำถามเกี่ยวกับการออกแบบภายในของเอ็นจิ้นเกม

5
การจัดการระบบป้อนข้อมูลด้วยแป้นพิมพ์
หมายเหตุ: ฉันต้องสำรวจแทนที่จะโทรกลับเนื่องจากข้อ จำกัด API (SFML) ฉันยังขอโทษที่ไม่มีชื่อ 'ที่เหมาะสม' ฉันคิดว่าฉันมีสองคำถามที่นี่; วิธีการลงทะเบียนข้อมูลที่ฉันได้รับและจะทำอย่างไรกับมัน การจัดการอินพุต ฉันกำลังพูดถึงหลังจากที่คุณได้ลงทะเบียนว่ามีการกดแป้น 'A' ตัวอย่างเช่นและวิธีการทำจากที่นั่น ฉันเคยเห็นชุดแป้นพิมพ์ทั้งหมดเช่น: bool keyboard[256]; //And each input loop check the state of every key on the keyboard แต่ดูเหมือนว่าจะไม่มีประสิทธิภาพ ไม่เพียง แต่คุณจะมีการเชื่อมต่อปุ่ม 'A' ถึง 'ผู้เล่นที่เลื่อนไปทางซ้าย' แต่มันจะตรวจสอบทุก ๆ 30-60 ครั้งต่อวินาที ฉันลองระบบอื่นซึ่งเพิ่งค้นหากุญแจที่ต้องการ std::map< unsigned char, Key> keyMap; //Key stores the keycode, and …

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

3
การระบุเนื้อหาในเครื่องมือสร้างเกม?
ฉันต้องการระบุเนื้อหาที่โหลด แต่ไม่ทราบว่าควรเลือกแบบใด มี 2 ​​ตัวเลือก: ชื่อ (สตริง) นี่เป็นวิธีที่ง่ายที่สุดและรวดเร็วด้วย unordered_map (O (1)) แต่วิธีที่ช้ากว่านั้นใช้จำนวนเต็ม เข้าใจได้ง่ายในรหัส จำนวนเต็ม ที่เร็วที่สุด ไม่เข้าใจในโค้ด ฉันรู้ว่าสายไม่ปลอดภัยหรือเร็ว แต่มันแย่ขนาดนั้นหรือนับว่าแย่ในชื่อ AAA เท่านั้น? ฉันสามารถสร้าง enums ใช้จำนวนเต็ม แต่ถ้าฉันโหลดฉากสินทรัพย์ ฯลฯ จากไฟล์ตอนรันไทม์ฉันไม่สามารถใช้ enums ได้ มีวิธีทำให้จำนวนเต็มเหล่านี้สามารถอ่านได้ถ้าพวกเขาจะถูกสร้างขึ้นที่ runtime? ฉันรู้ว่าปัญหานี้มีเธรดไม่กี่ทั่วอินเทอร์เน็ต แต่ฉันไม่สามารถหาวิธีที่สำคัญในกรณีนี้

4
คุณอนุญาตให้เขียนโค้ดระบบเครือข่ายในขั้นตอนต่อไปของการพัฒนาได้อย่างไร
ขณะนี้ฉันกำลังอยู่ระหว่างการเขียนเกมซึ่งในที่สุดฉันก็ต้องการที่จะปรับปรุงในด้านต่างๆ ฉันจะข้ามไปยังการเขียนรหัสเครือข่ายได้อย่างไร แต่ยังคงใช้งานได้ง่ายนั่นคือไม่ต้องเขียนเกมใหม่ทั้งหมดเพื่อเพิ่มมัน สิ่งที่ฉันต้องจำไว้? ฉันมีรูปแบบองค์ประกอบที่ฉันแยกฟิสิกส์ / การตรวจจับการชนกันของตรรกะเกมประเภทข้อมูลและการเคลื่อนไหว / การแสดงผลจากกันและกัน ฉันจะเขียนไคลเอนต์และเซิร์ฟเวอร์ที่ไม่มีรหัสเครือข่ายใด ๆ ที่นำไปใช้ยังสามารถทดสอบในเครื่องได้อย่างไร ฉันควรทำอย่างไรในไคลเอนต์และฉันควรทำอย่างไรในเซิร์ฟเวอร์? ฉันควรจะทำเป็นว่าฉันได้รหัสเครือข่ายเสร็จแล้วและส่งข้อความระหว่างเซิร์ฟเวอร์และลูกค้าและบัญชีสำหรับความล่าช้า ฯลฯ แม้ว่าจะไม่มี? แก้ไข:มีการวางแผนให้เป็นเกม RPG จากบนลงล่าง ผู้เล่นหลายคนง่ายๆที่คุณโฮสต์เซิร์ฟเวอร์สำหรับเพื่อนของคุณคือสิ่งที่ฉันกำลังคิดอยู่ดังนั้นการโกงจึงไม่เป็นปัญหามากนัก (ผู้ที่ต้องการเล่นกับเพื่อนโกง ยังฉันอยากจะไปกับ "เซิร์ฟเวอร์ที่ถูกต้องเสมอ" -approach แก้ไข 2:ฉันเดาว่าฉันกำลังมองหาพอยน์เตอร์บางอย่างเกี่ยวกับสิ่งที่ใจฉันควรจะเป็น ฉันควรจัดการกับการป้อนข้อมูลด้วยแป้นพิมพ์การเคลื่อนไหว ฯลฯ แทนที่จะใช้ทุกเอฟเฟกต์ / เปลี่ยนแปลงทันที อืมฉันอาจต้องอ่านอย่างถูกต้องในระบบเครือข่ายก่อนที่จะไปที่ไหนก็ได้ซึ่งเป็นสิ่งที่ฉันหวังว่าจะได้ออกไปจากการสร้างโครงข่ายเครือข่ายบางประเภทที่สามารถทำงานได้ในท้องถิ่น

2
ระบบสแนปชอตของเกมจะใช้งานอย่างไรสำหรับเกมเรียลไทม์บนเครือข่าย
ฉันต้องการสร้างเกมแบบเรียลไทม์แบบมัลติ - เพลย์เยอร์ไคลเอ็นต์เซิร์ฟเวอร์เป็นโปรเจ็กต์สำหรับคลาสเครือข่ายของฉัน ฉันได้อ่านมากมายเกี่ยวกับโมเดลเครือข่ายผู้เล่นหลายคนแบบเรียลไทม์และฉันเข้าใจความสัมพันธ์ระหว่างไคลเอนต์กับเซิร์ฟเวอร์และเทคนิคการชดเชยความล่าช้า สิ่งที่ฉันต้องการทำคือสิ่งที่คล้ายกับโมเดลเครือข่าย Quake 3: โดยทั่วไปแล้วเซิร์ฟเวอร์จะเก็บภาพรวมของสถานะเกมทั้งหมด เมื่อได้รับข้อมูลจากลูกค้าเซิร์ฟเวอร์จะสร้างสแน็ปช็อตใหม่ที่สะท้อนถึงการเปลี่ยนแปลง จากนั้นจะคำนวณความแตกต่างระหว่างสแน็ปช็อตใหม่และสแน็ปช็อตสุดท้ายและส่งไปยังไคลเอนต์เพื่อให้สามารถซิงค์ได้ วิธีการนี้ดูเหมือนจะแข็งแกร่งสำหรับฉัน - หากไคลเอนต์และเซิร์ฟเวอร์มีการเชื่อมต่อที่เสถียรจะมีการส่งข้อมูลจำนวนเล็กน้อยที่จำเป็นเพียงเล็กน้อยเพื่อให้ข้อมูลตรงกัน หากไคลเอ็นต์ไม่ซิงค์กันคุณสามารถร้องขอสแน็ปช็อตเต็มรูปแบบได้เช่นกัน อย่างไรก็ตามฉันไม่สามารถหาวิธีที่ดีที่จะใช้ระบบ snapshot ฉันพบว่ามันยากมากที่จะย้ายออกจากสถาปัตยกรรมการเขียนโปรแกรมผู้เล่นเดี่ยวและคิดว่าฉันจะเก็บสถานะของเกมในลักษณะที่: ข้อมูลทั้งหมดจะถูกแยกออกจากตรรกะ สามารถคำนวณความแตกต่างระหว่างสแน็ปช็อตของสถานะเกม เอนทิตีของเกมสามารถจัดการได้อย่างง่ายดายผ่านรหัส ว่าเป็นภาพรวมระดับการดำเนินการ? เอนทิตีและข้อมูลถูกจัดเก็บอย่างไร เอนทิตีของลูกค้าทุกคนมีรหัสที่ตรงกับ ID บนเซิร์ฟเวอร์หรือไม่ คำนวณความแตกต่างของสแนปชอตได้อย่างไร โดยทั่วไป: ระบบสแนปชอตของเกมจะมีการนำไปใช้อย่างไร

3
ฟังก์ชั่นการเขียนโปรแกรมและสถานะของเกมล้วนๆ
มีเทคนิคทั่วไปในการจัดการสถานะ (โดยทั่วไป) ในภาษาโปรแกรมการทำงานหรือไม่? มีคำตอบในทุกภาษา (ฟังก์ชั่น) การเขียนโปรแกรมเพื่อจัดการสถานะโกลบอล แต่ฉันต้องการหลีกเลี่ยงสิ่งนี้เท่าที่จะทำได้ สถานะทั้งหมดในลักษณะการทำงานบริสุทธิ์เป็นพารามิเตอร์ฟังก์ชั่น ดังนั้นฉันจึงจำเป็นต้องกำหนดสถานะของเกมทั้งหมด (แฮชแมปขนาดมหึมากับโลกผู้เล่นตำแหน่งคะแนนสินทรัพย์ศัตรู ... )) เป็นพารามิเตอร์สำหรับทุกฟังก์ชั่นที่ต้องการจัดการโลกบนอินพุตหรือทริกเกอร์ที่กำหนด . ฟังก์ชั่นของตัวเองเลือกข้อมูลที่เกี่ยวข้องจาก bloest gamestate ทำอะไรกับมันจัดการกับ gamestate และคืน gamestate แต่นี่ดูเหมือนจะเป็นทางออกที่ไม่ดีสำหรับผู้ชาย ถ้าฉันใส่เกมมิ่งทั้งหมดลงในฟังก์ชั่นทั้งหมดมันจะไม่มีประโยชน์สำหรับฉันในทางตรงกันข้ามกับตัวแปรทั่วโลกหรือวิธีการที่จำเป็น ฉันสามารถใส่ข้อมูลที่เกี่ยวข้องลงในฟังก์ชั่นและคืนการกระทำที่จะนำไปใช้สำหรับอินพุตที่กำหนด และหนึ่งฟังก์ชั่นเดียวใช้การกระทำทั้งหมดกับนักเล่นเกม แต่ฟังก์ชั่นส่วนใหญ่ต้องการข้อมูล"ที่เกี่ยวข้อง" จำนวนมาก move()ต้องการตำแหน่งวัตถุ, ความเร็ว, แผนที่สำหรับการชน, ตำแหน่งของศัตรูทั้งหมด, สุขภาพในปัจจุบัน, ... ดังนั้นวิธีนี้ดูเหมือนจะไม่ทำงานเช่นกัน ดังนั้นคำถามของฉันคือฉันจะจัดการกับรัฐจำนวนมากในภาษาโปรแกรมที่ใช้งานได้โดยเฉพาะอย่างยิ่งสำหรับการพัฒนาเกมได้อย่างไร แก้ไข:มีกรอบเกมบางอย่างสำหรับการสร้างเกมใน Clojure มีวิธีการแก้ปัญหานี้บางส่วนคือการเธรดวัตถุทั้งหมดในเกมเป็น "เอนทิตี" และวางไว้ในกระเป๋าใบใหญ่ หน้าที่หลัก Gigantถือหน้าจอและหน่วยงานและกิจกรรมจับ ( :on-key-down, :on-init, ... ) สำหรับองค์กรนี้และเรียกห่วงจอแสดงผลหลัก แต่นี่ไม่ใช่ทางออกที่สะอาดที่ฉันค้นหา

2
ประโยชน์ของการใช้ระบบรหัสนิติบุคคลคืออะไร?
ฉันกำลังอ่านหนังสือเกม Programming AI โดยตัวอย่าง หนังสือเล่มนี้กล่าวถึงการกำหนดหมายเลข ID ที่ไม่ซ้ำกันให้กับแต่ละเอนทิตีในเกม บ่อยครั้งเมื่อเอนทิตีAต้องติดต่อเอนทิตีB , Aได้รับการอ้างอิงถึงBโดยส่งหมายเลข ID ของBไปยังคลาสEntityDatabase ชั้นนี้รับหมายเลข ID และส่งกลับการอ้างอิงไปยังเอนทิตี หมายเลข ID ของเอนทิตีบางตัวสามารถดึงมาจากไฟล์ที่มี ID ของเอนทิตีบางตัว (ตัวละครในเกมหลัก) คำถามของฉันคือ: ทำไมฉันจะทำเช่นนี้? เหตุใดฉันจึงไม่สามารถทำงานกับการอ้างอิงได้โดยตรง บางครั้งมันยากที่จะได้รับการอ้างอิงโดยตรง? การใช้ระบบ ID เป็นวิธีการทั่วไปหรือไม่ มีเกมที่ไม่ได้ใช้ ID หรือไม่? ฉันใหม่กับการพัฒนาเกม โปรดอธิบายถึงประโยชน์ของการทำงานกับระบบรหัสนิติบุคคล ข้อดีและข้อเสีย ตัวอย่างคอนกรีตจะดีมาก ขอบคุณ

3
EXTREMELY สับสนมากกับ "เกมความเร็วคงที่สูงสุด FPS" ลูปเกม
ฉันเพิ่งอ่านบทความนี้เกี่ยวกับ Game Loops: http://www.koonsolo.com/news/dewitters-gameloop/ และการนำไปใช้ครั้งสุดท้ายที่แนะนำทำให้ฉันสับสนอย่างยิ่ง ฉันไม่เข้าใจวิธีการทำงานและดูเหมือนเป็นระเบียบสมบูรณ์ ฉันเข้าใจหลักการ: อัปเดตเกมด้วยความเร็วคงที่ไม่ว่าอะไรก็ตามที่เหลือจะทำให้เกมเป็นไปได้หลายครั้ง ฉันคิดว่าคุณไม่สามารถใช้: รับอินพุต 25 ขีด เกมแสดงผลสำหรับ 975 เห็บ วิธีการตั้งแต่คุณจะได้รับการป้อนข้อมูลสำหรับส่วนแรกของสองและสิ่งนี้จะรู้สึกแปลก? หรือเป็นสิ่งที่เกิดขึ้นในบทความ? เป็นหลัก: while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) มันจะใช้ได้ยังไง? สมมติว่าคุณค่าของเขา MAX_FRAMESKIP = 5 สมมุติว่า next_game_tick ซึ่งกำหนดช่วงเวลาหลังจากเริ่มต้นก่อนที่ลูปเกมหลักจะพูดว่า ... 500 ในที่สุดเมื่อฉันใช้ SDL และ OpenGL สำหรับเกมของฉันด้วย OpenGL ที่ใช้สำหรับการเรนเดอร์เท่านั้นสมมติว่าGetTickCount()คืนค่าเวลาตั้งแต่ SDL_Init ถูกเรียกซึ่งมันทำ SDL_GetTicks -- Get the number …

1
ฉันจะจัดการข้อมูลและการพึ่งพาระหว่างคลาสได้อย่างเรียบร้อยและสวยงามได้อย่างไร
ฉันกำลังเล่นเกม 2d topdown ใน SFML 2 และต้องการหาวิธีที่สวยงามที่ทุกอย่างจะทำงานร่วมกันได้ ให้ฉันอธิบาย ฉันมีจำนวนคลาสที่สืบทอดมาจากฐานนามธรรมที่ให้วิธีการวาดและวิธีการอัปเดตไปยังคลาสทั้งหมด ในเกมวนรอบฉันเรียกการอัปเดตแล้ววาดในแต่ละชั้นฉันคิดว่านี่เป็นวิธีการทั่วไป ฉันมีชั้นเรียนสำหรับไทล์การชนผู้เล่นและผู้จัดการทรัพยากรที่มีไทล์ / รูปภาพ / พื้นผิวทั้งหมด เนื่องจากวิธีการอินพุตทำงานใน SFML ฉันตัดสินใจที่จะให้แต่ละอินพุตจัดการคลาส (ถ้าจำเป็น) ในการเรียกใช้การอัพเดต จนถึงตอนนี้ฉันได้ผ่านการอ้างอิงตามต้องการเช่นในคลาสผู้เล่นเมื่อกดปุ่มการเคลื่อนไหวฉันเรียกวิธีการในคลาสการชนเพื่อตรวจสอบว่าตำแหน่งที่ผู้เล่นต้องการย้ายไปเป็นการชนหรือไม่ และย้ายผู้เล่นเฉพาะเมื่อไม่มีการชนกัน สิ่งนี้ใช้ได้ดีสำหรับส่วนใหญ่ แต่ฉันเชื่อว่ามันสามารถทำได้ดีกว่าฉันไม่แน่ใจว่าจะทำอย่างไร ตอนนี้ฉันมีสิ่งที่ซับซ้อนกว่าที่ฉันต้องนำไปใช้เช่นผู้เล่นสามารถเดินไปที่วัตถุบนพื้นดินกดปุ่มเพื่อหยิบขึ้นมา / ยกมันขึ้นมาแล้วมันจะปรากฏในสินค้าคงคลัง นี่หมายความว่าต้องมีบางสิ่งเกิดขึ้น: ตรวจสอบว่าผู้เล่นอยู่ในช่วงของไอเท็มที่สามารถรีบูตได้บนปุ่มกดมิฉะนั้นจะไม่ดำเนินการต่อ ค้นหารายการ อัปเดตพื้นผิวสไปรต์ในรายการจากพื้นผิวเริ่มต้นเป็นพื้นผิว "ปล้น" อัปเดตการชนกันของรายการ: อาจมีการเปลี่ยนแปลงรูปร่างหรือถูกลบออกอย่างสมบูรณ์ ต้องอัปเดตคลังโฆษณาด้วยรายการที่เพิ่ม ฉันจะทำให้ทุกอย่างสื่อสารได้อย่างไร ด้วยระบบปัจจุบันของฉันฉันจะจบลงด้วยการเรียนนอกขอบเขตและวิธีการโทรหากันทั่วทุกที่ ฉันสามารถผูกชั้นเรียนทั้งหมดในผู้จัดการใหญ่คนหนึ่งและให้แต่ละคนอ้างอิงถึงชั้นผู้จัดการหลัก แต่สิ่งนี้ดูดีขึ้นเล็กน้อยเท่านั้น ความช่วยเหลือ / คำแนะนำใด ๆ ที่จะได้รับการชื่นชมอย่างมาก! หากสิ่งใดไม่ชัดเจนฉันยินดีที่จะขยายสิ่ง
12 c++  2d  architecture  sfml 

4
การพึ่งพาคลาสแบบวงกลม
การออกแบบไม่ดีหรือไม่ที่มี 2 คลาสที่ต้องใช้ซึ่งกันและกัน? ฉันกำลังเขียนเกมเล็ก ๆ ที่ฉันมีGameEngineชั้นเรียนที่มีGameStateวัตถุบางอย่าง ในการเข้าถึงวิธีการแสดงผลหลายวิธีGameStateวัตถุเหล่านี้จำเป็นต้องทราบGameEngineคลาสด้วย - ดังนั้นจึงเป็นการอ้างอิงแบบวนรอบ คุณจะเรียกการออกแบบที่ไม่ดีนี้หรือไม่? ฉันแค่ถามเพราะฉันไม่แน่ใจและในเวลานี้ฉันยังสามารถ refactor สิ่งเหล่านี้
12 c++  architecture 

1
จะรักษาโครงสร้างข้อมูลให้ตรงกันบนเครือข่ายได้อย่างไร?
บริบท ในเกมที่ฉันกำลังทำอยู่ (เรียงลำดับจากจุดและคลิกการผจญภัยกราฟิก) ทุกอย่างที่เกิดขึ้นในโลกของเกมจะถูกควบคุมโดยตัวจัดการแอ็คชั่นที่มีโครงสร้างคล้าย: ตัวอย่างเช่นหากผลลัพธ์ของการตรวจสอบวัตถุควรทำให้ตัวละครพูดว่าสวัสดีเดินนิดหน่อยแล้วก็นั่งลงฉันก็วางไข่โค้ดต่อไปนี้: var actionGroup = actionManager.CreateGroup(); actionGroup.Add(new TalkAction("Guybrush", "Hello there!"); actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300)); actionGroup.Add(new SetAnimationAction("Guybrush", "Sit")); สิ่งนี้จะสร้างกลุ่มการกระทำใหม่ (ทั้งบรรทัดในภาพด้านบน) และเพิ่มลงในผู้จัดการ กลุ่มทั้งหมดจะถูกดำเนินการแบบขนาน แต่การกระทำภายในแต่ละกลุ่มจะถูกล่ามโซ่ไว้ด้วยกันเพื่อให้กลุ่มที่สองเริ่มต้นหลังจากที่กลุ่มแรกเสร็จสิ้น เมื่อการกระทำสุดท้ายในกลุ่มเสร็จสิ้นกลุ่มจะถูกทำลาย ปัญหา ตอนนี้ฉันต้องทำซ้ำข้อมูลนี้ทั่วทั้งเครือข่ายเพื่อให้ผู้เล่นทุกคนเห็นสิ่งเดียวกันในเซสชั่นผู้เล่นหลายคน การทำให้การกระทำแต่ละอย่างเป็นอันดับไม่ใช่ปัญหา แต่ฉันเป็นผู้เริ่มต้นแน่นอนเมื่อพูดถึงเรื่องเครือข่ายและฉันมีคำถามสองสามข้อ ฉันคิดว่าเพื่อความเรียบง่ายในการสนทนานี้เราสามารถสรุปองค์ประกอบของ action manager ให้ง่ายขึ้น: var actionManager = new List<List<string>>(); ฉันจะเก็บเนื้อหาของโครงสร้างข้อมูลด้านบนให้ตรงกันระหว่างผู้เล่นทุกคนได้อย่างไร นอกจากคำถามหลักแล้วฉันยังมีข้อกังวลอื่นอีกสองสามข้อที่เกี่ยวข้อง (เช่นความหมายที่เป็นไปได้ทั้งหมดของปัญหาเดียวกันข้างต้น): ถ้าฉันใช้สถาปัตยกรรมเซิร์ฟเวอร์ / ไคลเอนต์ (หนึ่งในผู้เล่นที่ทำหน้าที่เป็นทั้งเซิร์ฟเวอร์และไคลเอนต์) และหนึ่งในไคลเอนต์ได้วางกลุ่มของการกระทำเขาควรเพิ่มพวกเขาโดยตรงไปยังผู้จัดการหรือส่งคำขอเท่านั้น ไปยังเซิร์ฟเวอร์ซึ่งจะสั่งให้ลูกค้าทุกคนเพื่อเพิ่มกลุ่มที่ ? …

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

2
ฉันจะบ้าไปกับ Event Handlers ได้ไหม? ฉันกำลังจะ“ ผิดไป” กับการออกแบบของฉันหรือไม่?
ฉันเดาฉันตัดสินใจว่าฉันชอบตัวจัดการเหตุการณ์ ฉันอาจกำลังทุกข์ทรมานเล็กน้อยจากการวิเคราะห์อัมพาต แต่ฉันกังวลเกี่ยวกับการทำให้การออกแบบของฉันยุ่งเหยิงหรือวิ่งไปสู่ผลลัพธ์ที่ไม่คาดฝันอื่น ๆ ต่อการตัดสินใจออกแบบของฉัน เอ็นจิ้นเกมของฉันทำการเรนเดอร์พื้นฐานโดยใช้กล้องส่ายกล้อง การออกแบบของฉันมีลักษณะเช่นนี้: SceneHandler มีรายการคลาสที่ใช้อินเตอร์เฟส SceneListener (ปัจจุบันเป็น Sprites เท่านั้น) โทร render () หนึ่งครั้งต่อหนึ่งขีดและส่ง onCameraUpdate (); ข้อความถึง SceneListeners InputHandler โพลอินพุตหนึ่งครั้งต่อหนึ่งขีดและส่งข้อความ "onKeyPressed" ธรรมดาไปยัง InputListeners ฉันมี Camera InputListener ซึ่งเก็บอินสแตนซ์ของ SceneHandler และทริกเกอร์ updateCamera (); เหตุการณ์ขึ้นอยู่กับสิ่งที่ป้อนเข้า AgentHandler เรียกการกระทำเริ่มต้นใน Agent (AI) หนึ่งครั้งต่อหนึ่งขีดและจะตรวจสอบสแต็กสำหรับเหตุการณ์ใหม่ใด ๆ ที่ลงทะเบียนโดยส่งไปยังตัวแทนที่เฉพาะเจาะจงตามความจำเป็น ดังนั้นฉันจึงมีวัตถุสไปรต์ขั้นพื้นฐานที่สามารถเคลื่อนที่ไปรอบ ๆ ฉากและใช้พฤติกรรมการขับขี่แบบพื้นฐานเพื่อเดินทาง ฉันได้รับการตรวจจับการชนกันและนี่คือที่ฉันไม่แน่ใจว่าทิศทางการออกแบบของฉันเป็นไปได้ดี เป็นการดีหรือไม่ที่จะมีตัวจัดการเหตุการณ์ขนาดเล็กจำนวนมาก? ฉันคิดว่าจะเป็นอย่างที่ฉันจะต้องใช้ CollisionHandler บางประเภท …

2
วิธีที่ถูกต้องในการทำให้นามธรรมเป็นตัวควบคุม XBox
ฉันมีตัวควบคุม XBox360 ซึ่งฉันต้องการใช้เป็นอินพุตสำหรับแอปพลิเคชัน สิ่งที่ฉันไม่สามารถทำได้คือวิธีที่ดีที่สุดในการเปิดเผยสิ่งนี้ผ่านทางอินเทอร์เฟซ ด้านหลังของฉากคลาสที่จัดการกับคอนโทรลเลอร์นั้นขึ้นอยู่กับสถานะของปุ่มสำรวจ ฉันเริ่มลองลิงค์แล้ว: Event ButtonPressed() as ButtonEnum ที่ButtonEnumเป็นButtonRed, ButtonStartฯลฯ ... ข้อ จำกัด เล็ก ๆ น้อย ๆ ที่สนับสนุนเฉพาะการกดปุ่มไม่ถือ / รูปแบบ (กดสองครั้งเป็นต้น) แนวคิดต่อไปคือการเปิดเผยสถานะปุ่มให้กับแอพเช่น Property RedPressed as Boolean Property StartPressed as Boolean Property Thumb1XAxis as Double นี่ยืดหยุ่นมาก แต่จริงๆแล้วมันบังคับให้ทำงานมากเกินไปในแอพและต้องการให้แอพโพล - ฉันต้องการให้มีการขับเคลื่อนกิจกรรมหากเป็นไปได้ ฉันพิจารณาเพิ่มกิจกรรมหลายรายการเช่น: Event ButtonPressed(Button as ButtonEnum) Event ButtonPressedTwice(Button as ButtonEnum) Event …

2
คำถามเกี่ยวกับสถาปัตยกรรมเกมด้วย XNA
ในที่สุดฉันก็เลยได้เล่นกับ XNA และเล่นด้วยการทำเกม 2D (ฉันมีทรัพย์สินทางศิลปะมากมายจากเพื่อนที่พัฒนาบน iOS) ดูเหมือนจะเป็นเรื่องง่ายมากที่จะทำและออกมาจากกล่อง แต่ฉันถูกทิ้งไว้กับสิ่งต่าง ๆ ตั้งแต่วรรณกรรมส่วนใหญ่ (หนังสือที่ฉันซื้อมาเป็นตัวอย่าง) ไม่สนใจ 2D มากนัก ฉันขอขอบคุณการชี้แจงหรือชี้ไปที่ข้อมูลเพิ่มเติมเกี่ยวกับภารกิจต่อไปนี้: จุดบริการเกมคืออะไร ฉันเข้าใจถึงสำนวนทั้งหมดของการลงทะเบียนวัตถุเป็นบริการเพื่อให้ GameComponent อื่น ๆ สามารถคว้ามันได้อย่างไรสิ่งนี้ทำให้เอาชนะได้ง่ายเพียงแค่ทำให้เป็นสาธารณะหรือคงที่? ตัวอย่างเช่นหนังสือของฉันแนะนำให้ลงทะเบียนวัตถุ SpriteBatch ในคลาส Game.cs ฉันไม่แน่ใจว่าสิ่งนี้จะดีกว่าที่จะทำให้เป็นแบบสาธารณะ / คงที่เนื่องจากควรมีเพียงหนึ่งตัวอย่างของเกม anyways (ซิงเกิลตัน)? ฉันสับสนเมื่อฉันควรสืบทอดจาก GameComponent หรือ RenderableGameComponent ฉันกำลังพยายามติดตามการออกแบบผู้จัดการ / ผู้ควบคุมซึ่งเอนทิตีทั้งหมดจะถูกสร้าง / เป็นเจ้าของโดยผู้จัดการเดียวและเหมือนกันสำหรับสิ่งอื่น ๆ ขณะนี้ฉันมีผู้จัดการ / ผู้ควบคุมแต่ละคนที่สืบทอดมาจาก GameComponent แต่สิ่งนี้ทำให้เกมวัตถุเป็นเจ้าของผู้จัดการทั้งหมดและเรียกการปรับปรุงด้วยตนเองและวาดได้อย่างไร ฉันสังเกตเห็นว่า Initialize เรียกก่อน ContentLoad () …

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