การพัฒนาเกม

คำถาม & คำตอบสำหรับนักพัฒนาเกมมืออาชีพและเป็นอิสระ

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

2
ฝ่ายอักษะในแนวแกน: แบ่งพื้นที่ออกเป็นสี่เหลี่ยมผืนผ้าสุ่ม?
ฉันต้องการวิธีการแบ่งพื้นที่ 3 มิติเป็นรูปร่างกล่องที่จัดแนวแกนแบบสุ่ม ตอนนี้ฉันกำลังแบ่งพื้นที่ 2d สำหรับการทดสอบ วิธีที่ฉับพลันที่สุดที่ฉันคิดขึ้นมาคือการกำหนดขนาดสี่เหลี่ยมผืนผ้า (1, 1) แล้วแบ่งสี่เหลี่ยมที่มีอยู่ทั้งหมดกลับเป็นรูปสี่เหลี่ยมผืนผ้าไม่สม่ำเสมอสองอันสลับกันระหว่างแกน X และ Y ปัญหาที่นี่ชัดเจน วิธีการนี้ส่งผลให้เส้นยืดยาว (ทำเครื่องหมายด้วยสีแดง) สิ่งที่ฉันต้องการคือสิ่งที่ดูเป็นธรรมชาติมากขึ้น (ฉันรวมตัวอย่าง) ดูไม่มีเส้นตรงยาวจากบนลงล่างหรือจากซ้ายไปขวา ข้อ จำกัด เพียงอย่างเดียวคือฉันอาจต้องการ จำกัด ขนาดที่เล็กที่สุดของสี่เหลี่ยมผืนผ้าโดยไม่กระทบกับความละเอียดของขนาด นั่นคือถ้าส่วนที่เล็กที่สุดคือ 1 ตารางเซนติเมตรกว่าห้องที่เล็กที่สุดของวินาทีไม่ควรเป็น 2 ตารางหน่วย ดังนั้นขั้นตอนวิธีควรเป็นไปตามข้อ จำกัด ทั้งสามดังต่อไปนี้: รูปสี่เหลี่ยมผืนผ้ามีขนาดเล็กไม่เล็ก ขนาดของรูปสี่เหลี่ยมไม่ได้เป็นการคูณแบบแยกขนาดที่เล็กที่สุด เช่นถ้า rect ที่เล็กที่สุดคือ 3 square unit มากกว่า rects ที่ใหญ่กว่าจะไม่ถูก จำกัด ให้เป็น 6, 9, 12 และอื่น ๆ …

2
ฉันจะสุ่มสร้างภูมิประเทศที่ใช้แผ่นพื้นด้านข้างแบบสุ่มได้อย่างไร
ฉันต้องการสร้างแผนที่แบบสุ่มสำหรับเกม 2D sidescroller โดยใช้ชุดไพ่ต่อไปนี้: ฉันได้พบบทความที่ดีเกี่ยวกับกระบวนการ Bitmasking เช่น: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -method สำหรับใช้-tilemaps / ฉันชอบความคิดในการใช้ bitmask / tilemask แทนที่จะทำประโยคคำสั่งหรือ switch ขนาดใหญ่ อย่างไรก็ตามฉันมีปัญหาในการแสดงภาพกระบวนการทั้งหมดและไม่มีบทความใดที่พูดถึงการสุ่ม ไทล์ของฉันเข้าด้วยกันในหลาย ๆ แบบไม่ใช่แค่ทางเดียวเพราะไทล์ในตัวอย่างที่ฉันเชื่อมโยงดูเหมือนจะ ตัวอย่างเช่นนี่เป็นเพียงตัวอย่างไม่กี่: เนื่องจากกระเบื้องของฉันเข้ากันได้หลายวิธีฉันไม่คิดว่าหน้ากาก 8 บิตจะทำงานได้ ดังนั้นฉันคิดว่าจะใช้ bitmask ที่ใหญ่กว่านี้ บางอย่างเช่นถ่าน [8] หรือถ่าน4 หากใครบางคนสามารถแสดง pseudocode / ตัวอย่างของอัลกอริธึมทั่วไปที่ดูเหมือนฉันจะขอบคุณมันมาก

4
การตรวจจับการชนกันแบบ 2D
สมมติว่าฉันใช้ตัวละครนี้ (แหล่งที่มา: iconbug.com ) คุณจะใช้การตรวจจับการชนกันอย่างไร การใช้กล่องขอบไม่น่าจะเป็นการประมาณที่ดีเพราะรูปร่างของนกอยู่ใกล้กับสี่เหลี่ยม ฉันคิดว่าจะมีโครงสร้างข้อมูลแบบต้นไม้สี่คี่ภายในวัตถุที่แสดงถึงส่วนต่าง ๆ ของภาพ ใบแต่ละใบอาจเป็นได้ทั้งfalse(ในกรณีที่มันครอบคลุมพื้นที่สีขาว / โปร่งใสนอกนก) หรือtrue(ในกรณีที่มันหมายถึงพื้นที่ของนกเช่นจะงอยปากตา ฯลฯ ) จากนั้นก็ทดสอบสิ่งกีดขวางเพียงอย่างเดียวในที่เกิดเหตุเพื่อชนกับนก แต่ปัญหาของฉันในแนวทางของฉันคือ: ฉันไม่ทราบวิธีการเริ่มต้นต้นไม้รูปสี่เหลี่ยม เมื่อเริ่มต้นต้นไม้รูปสี่เหลี่ยมแล้วฉันไม่แน่ใจว่าจะสำรวจและใช้งานได้อย่างไรเมื่อมีสิ่งกีดขวางภายในพิกัดของภาพ คุณจะตรวจจับการชนกันของตัวละครที่ไม่ใช่รูปสี่เหลี่ยมได้อย่างไร? LE: อีกวิธีที่ฉันเห็นคือใช้กล่องที่มีขอบเขตหลายอัน ตัวอย่างเช่นฉันจะมีหนึ่งหรือสองกล่องที่ถูกผูกไว้สำหรับจะงอยปากแล้วบางส่วนของพวกเขาสำหรับผมหรือหาง แต่มันน่าเบื่อ หากนี่เป็นวิธีการที่ถูกต้องในกรณีของฉันฉันจะสร้างกล่องขอบเหล่านั้นได้อย่างไร ฉันสงสัยว่าฉันต้องให้พวกเขาฮาร์ดโค้ดในโปรแกรมของฉัน LE2: ฉันสนใจการชนที่แม่นยำพอสมควร ฉันไม่สามารถจินตนาการได้ว่ากล่องหรือวงกลมอย่างน้อยหนึ่งกล่องสามารถประมาณรูปร่างที่เหมาะสมได้อย่างไรดังนั้นวิธีการนี้จะไม่ทำงาน

3
จุดประสงค์ของดัชนีในการเรนเดอร์ 3D คืออะไร?
สมมติว่าคุณกำลังสร้างลูกบาศก์ 3D ใน OpenGL คุณใช้ข้อมูลจุดสุดยอดที่จำเป็นสำหรับวัตถุ (คิวบ์) จุดประสงค์ของการใช้ดัชนีคืออะไร void CreateCube() { const Vertex VERTICES[8] = { { { -.5f, -.5f, .5f, 1 }, { 0, 0, 1, 1 } }, { { -.5f, .5f, .5f, 1 }, { 1, 0, 0, 1 } }, { { .5f, .5f, .5f, 1 }, …
11 opengl 

2
วิธีซิงโครไนซ์การกระทำเช่นการกระโดดในผู้เล่นหลายคนได้อย่างไร
ฉันเป็นนักพัฒนาเกมมือใหม่และฉันค้นคว้าเกี่ยวกับเกมที่มีผู้เล่นหลายคน ฉันสังเกตว่ามันมีเวลาแฝงอยู่เสมอผู้เล่นจะได้รับการอัพเดตจากการกระทำในอดีตเสมอ แต่มีเทคนิคต่าง ๆ เช่นการคำนวณคนตายเพื่อจัดการเวลาแฝง ฉันสามารถทำนายการเคลื่อนไหวและทำให้การเคลื่อนไหวราบรื่น แต่ฉันจะทำให้การประสานเหมือนกระโดดหยุดเดินได้อย่างไร สมมติว่าลูกค้า A กำลังเคลื่อนไหวเขาอยู่ที่ 100m ในเวลา 10.2 ด้วยความเร็ว 100m / วินาทีและส่งข้อมูลนี้ ลูกค้า B จะได้รับข้อมูลนี้ในภายหลังให้เป็น 10.4 ดังนั้นที่ลูกค้า B ฉันสามารถใช้การคาดการณ์และวางลูกค้า A ที่ 120m แต่ถ้าลูกค้าทำกระโดดได้ที่ 110m ที่ 10.3 ฉันไม่สามารถคาดการณ์ได้และเนื่องจากฉันใช้การคาดการณ์ฉันจึงไม่สามารถแสดงให้ลูกค้า A กระโดดข้ามไปในอดีต ฉันอาจจัดการกับปัญหานี้โดยไม่ส่งการกระทำข้ามเลย แต่ถ้าเกมของฉันมีช่องว่างบางอย่างที่ผู้เล่นสามารถล้มและตาย ดังนั้นถ้าฉันไม่ซิงค์แอคชั่นกระโดดผู้เล่นคนอื่นจะสังเกตเห็นว่าผู้เล่นคนหนึ่งกำลังทำงานอยู่เขาจะตกเป็นโมฆะและปรากฏบนหน้าจออีกครั้งเพื่อทำลายการมีส่วนร่วมทางสายตา Jump เป็นเพียงตัวอย่างอาจมีหลายสถานการณ์ที่การทำนายไม่สามารถทำได้ ดังนั้นจะจัดการกับพวกเขาอย่างไร ตัวอย่างหนึ่งดังกล่าวสามารถเป็นได้หลายเกมออนไลน์เวทีการต่อสู้เช่น Awesomenauts

3
เหตุใดฉันจึงควรแยกวัตถุออกจากการแสดงผล
Disclamer:ฉันรู้ว่ารูปแบบของเอนทิตีคืออะไรและฉันไม่ได้ใช้ ฉันอ่านมากเกี่ยวกับการแยกวัตถุและการแสดงผล เกี่ยวกับความจริงที่ว่าตรรกะของเกมควรเป็นอิสระจากเอ็นจิ้นการเรนเดอร์พื้นฐาน นั่นเป็นสิ่งที่ดีและสวยงามและมันก็สมเหตุสมผลดี แต่มันก็ทำให้เกิดความเจ็บปวดอื่น ๆ อีกมากมายเช่นกัน: ต้องการการซิงโครไนซ์ระหว่างวัตถุลอจิกและวัตถุการแสดงผล (อันที่ทำให้สถานะของภาพเคลื่อนไหว, สไปรต์ ฯลฯ ) จำเป็นต้องเปิดวัตถุตรรกะให้กับประชาชนเพื่อให้วัตถุแสดงผลอ่านสถานะที่แท้จริงของวัตถุตรรกะ (มักจะนำวัตถุตรรกะที่จะเปลี่ยนได้อย่างง่ายดายในวัตถุทะเยอทะยานและ setter) นี่มันฟังดูไม่ดีสำหรับฉัน ในทางกลับกันมันง่ายมากที่จะจินตนาการว่าวัตถุเป็นตัวแทนของ 3d (หรือ 2d) และยังง่ายต่อการบำรุงรักษา มีวิธีการรักษาการแสดงกราฟิกและตรรกะเกมควบคู่กัน (หลีกเลี่ยงปัญหาการซิงโครไนส์) แต่เป็นนามธรรมออกไปจากเอ็นจิ้นการเรนเดอร์หรือไม่? หรือมีวิธีแยกตรรกะเกมและการเรนเดอร์ที่ไม่ทำให้เกิดข้อเสียข้างต้นหรือไม่? (อาจมีตัวอย่างฉันไม่เข้าใจการพูดที่เป็นนามธรรม)

2
การออกแบบที่ขับเคลื่อนด้วยข้อมูลคืออะไร? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันได้อ่านบทความมากมายเกี่ยวกับการออกแบบที่ขับเคลื่อนด้วยข้อมูลสำหรับเกม ดูเหมือนว่าจะลงไปที่: ไม่มีการเข้ารหัสที่ยาก ไม่มีรหัสเฉพาะของเกมในเอ็นจิ้น การเขียนสคริปต์สำหรับ AI, cutscenes, และ cetera การสรุปรหัสสำหรับการใช้ซ้ำ การออกแบบส่วนประกอบ modularity คลัปต่ำ บรรณาธิการ (สำหรับข้อมูลแผนที่สคริปต์) การดึงข้อมูลภายนอก ค่าคงที่เก็บไว้ในไฟล์ข้อความ ( .iniหรือมิฉะนั้น) เปิดเผยข้อมูลผ่านบรรณาธิการสำหรับการเขียนสคริปต์และการจัดการโดยนักออกแบบ ตอนนี้คำถามของฉันคือความเข้าใจนี้ถูกต้องหรือไม่

3
เหตุใดจึงเป็นไปได้ที่จะพบการประสานพื้นผิวมากกว่า 1 หรือน้อยกว่า 0
ฉันกำลังศึกษาข้อความเกี่ยวกับtexture mappingและในpreparing to drawเซสชั่นฉันอ่าน: กำหนดพารามิเตอร์การห่อพื้นผิว สิ่งนี้จะควบคุมสิ่งที่จะเกิดขึ้นเมื่อมีการประสานพื้นผิวมากกว่า 1.0 หรือน้อยกว่า 0.0 ที่พบ: glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap); โดยที่ wrap คือ: GL_REPEAT: ระบุว่ารูปแบบนี้จะทำซ้ำ (เช่นล้อมรอบ) หากพบว่าพิกัดพื้นผิวที่แปลงสภาพน้อยกว่า 0.0 หรือมากกว่า 1.0 จะพบ GL_CLAMP: ระบุว่ารูปแบบจะ“ ติด” กับค่าที่ 0.0 หรือ 1.0 แต่ไม่มีคำอธิบายว่าอะไรเป็นสาเหตุของการเผชิญหน้ากับพิกัดพื้นผิว เช่นสมมติว่าฉันเพิ่งวาดสี่เหลี่ยมและฉันต้องการใช้รูปภาพเป็นพื้นผิวบนมันเป็นไปได้หรือไม่ที่จะพบพิกัดดังกล่าว?

3
แยกการอ่าน / การคำนวณ / การเขียนอย่างมีประสิทธิภาพสำหรับการประมวลผลพร้อมกันของเอนทิตีในระบบ Entity / Component
ติดตั้ง ฉันมีสถาปัตยกรรมเอนทิตีคอมโพเนนต์ที่เอนทิตีสามารถมีชุดของคุณลักษณะ (ซึ่งเป็นข้อมูลที่บริสุทธิ์โดยไม่มีพฤติกรรม) และมีระบบที่ใช้ตรรกะเอนทิตีซึ่งทำงานกับข้อมูลนั้น เป็นหลักในรหัสหลอกบ้าง: Entity { id; map<id_type, Attribute> attributes; } System { update(); vector<Entity> entities; } ระบบที่เพิ่งเคลื่อนที่ไปตามเอนทิตีทั้งหมดในอัตราคงที่อาจเป็น MovementSystem extends System { update() { for each entity in entities position = entity.attributes["position"]; position += vec3(1,1,1); } } เป็นหลักฉันพยายามขนาน update () อย่างมีประสิทธิภาพที่สุด สิ่งนี้สามารถทำได้โดยการรันทั้งระบบในแบบคู่ขนานหรือโดยการให้แต่ละการอัปเดต () ของระบบหนึ่งมีส่วนประกอบสองส่วนเพื่อให้เธรดที่แตกต่างกันสามารถดำเนินการอัปเดตระบบเดียวกันได้ แต่สำหรับชุดย่อยอื่น ปัญหา ในกรณีของระบบการเคลื่อนไหวที่แสดงการขนานกันนั้นเป็นเรื่องเล็กน้อย เนื่องจากเอนทิตีไม่ได้พึ่งพาซึ่งกันและกันและไม่แก้ไขข้อมูลที่แชร์เราจึงสามารถย้ายเอนทิตีทั้งหมดในแบบคู่ขนาน อย่างไรก็ตามบางครั้งระบบเหล่านี้ต้องการให้เอนทิตีโต้ตอบกับ …

2
การแรเงาแบบเรียงต่อกันของกระเบื้องการคำนวณ frusta ของกระเบื้องใน OpenGL
ฉันพยายามแรเงาแบบเรียงต่อกันบนกระเบื้องใน OpenGL โดยใช้ตัวประมวลผล แต่ฉันได้รับอุปสรรคเมื่อพยายามสร้าง frustum สำหรับแต่ละไทล์ ฉันใช้การสาธิตฟอร์เวิร์ด + ของ AMD (เขียนใน D3D) เป็นแนวทาง แต่ดูเหมือนว่าไฟจะถูกกำจัดเมื่อพวกเขาไม่ควร UPDATE อ่านด้านล่างสำหรับการปรับปรุง นี่คือ shader การคำนวณของฉัน (สมบูรณ์): #version 430 core #define MAX_LIGHTS 1024 #define MAX_LIGHTS_PER_TILE 40 #define WORK_GROUP_SIZE 16 struct PointLight { vec3 position; float radius; vec3 color; float intensity; }; layout (binding = 0, rgba32f) uniform …

1
จะทราบได้อย่างไรว่าผู้เล่นลงชื่อเข้าใช้?
ฉันสงสัยว่ามีวิธีใดที่จะทราบว่า "ผู้เล่น" ลงชื่อเข้าใช้หรือไม่? บางสิ่งเช่นนี้ if (GamePad.GetState(PlayerIndex.Two).IsConnected && !Gamer.PlayerTwo.IsSignedIn) เพื่อให้คอนโทรลเลอร์นั้นเชื่อมต่อและสามารถใช้งานได้ แต่ผู้เล่นไม่ได้ลงชื่อเข้าใช้บัญชี สิ่งที่ชอบเดา

3
ฉันรู้ว่าการตั้งค่าผู้เล่นหลายคนที่เรียบง่ายของฉันอาจไม่ใช่ความคิดที่ดี แต่ทำไม?
ฉันกำลังสร้าง MOBA ตัวเล็ก ๆ ง่ายๆเพื่อความสนุกสนาน ฉันทำทุกอย่างที่ผู้เล่นคนเดียวแล้วฉันก็รู้ว่า "โอ้ฉันน่าจะเพิ่มหลายคนเหรอ" ฉันไม่เคยทำอะไรกับระบบเครือข่ายมาก่อนดังนั้นการเรียนรู้วิธีรวมLidgrenเข้ากับเกมของฉันนั้นสนุกและยอดเยี่ยม สิ่งคือฉันค่อนข้างรู้ว่าฉันทำสิ่งต่าง ๆ ผิดเพราะมันไม่แข็งแรงพอสำหรับเกมกระแสหลักที่จะใช้เท่าที่ฉันรู้ แต่มีอะไรผิดปกติกับมัน? สิ่งที่ฉันทำคือโดยทั่วไปเมื่อใดก็ตามที่ผู้เล่นทำการกระทำมันจะส่งข้อความไปยังเซิร์ฟเวอร์ว่า "เฮ้ฉันเพิ่งทำสิ่งนี้" เซิร์ฟเวอร์และไคลเอนต์ต่างก็ใช้การจำลองสถานการณ์เดียวกัน จากนั้นเซิร์ฟเวอร์จะส่งข้อความไปยังลูกค้ารายอื่นทั้งหมดบอกพวกเขาว่าผู้ชายคนนั้นทำสิ่งนั้น ส่วนใหญ่ยกเว้นในบางกรณีเมื่อผู้เล่นทำสิ่งใดลูกค้าถือว่ามันเจ๋งและก้าวไปข้างหน้าด้วยตัวมันเอง ดังนั้นเมื่อคุณคลิกขวาที่ใดที่หนึ่งเพื่อย้ายไปที่นั่นไคลเอนต์ของผู้เล่นนั้นเพิ่งเริ่มเคลื่อนย้ายคนที่แต่งตัวประหลาดของเขาที่นั่นแล้วส่งข้อความไปยังเซิร์ฟเวอร์ที่บอกเรื่องนี้ ดังนั้นโดยทั่วไป: ผู้เล่นคนที่ 1 ร่ายคาถาเพื่อให้เขาเคลื่อนที่เร็วขึ้น 100% เป็นเวลาหกวินาที ลูกค้าในพื้นที่ของผู้เล่น 1 เพิ่มบัฟนั้นไปยังวัตถุหน่วยของเขา ลูกค้าของผู้เล่น 1 ส่งข้อความไปยังเซิร์ฟเวอร์ว่า "เฮ้ฉันเพิ่งเสกคาถานี้" เซิร์ฟเวอร์ทำให้แน่ใจว่าเขามีมานามากพอที่จะใช้คาถานั้นและถ้าเป็นเช่นนั้นจะเพิ่ม buff นั้นลงในสำเนาของเซิร์ฟเวอร์ของวัตถุหน่วย เซิร์ฟเวอร์ส่งข้อความถึงลูกค้ารายอื่นว่า "เฮ้คนนี้เพิ่งเสกคาถานี้" ลูกค้าอื่น ๆ ทุกคนจะได้รับข้อความและไปที่ "อ่าโอเคเจ๋ง" และเพิ่มบัฟนั้นไปยังออบเจคยูนิตในพื้นที่ของตนสำหรับผู้เล่นนั้น ฉันได้อ่านข้อมูลต่าง ๆ เพื่อดูว่าเกมใหญ่ ๆ เล่นหลายคนได้อย่างไรและมันค่อนข้างสับสนสำหรับใครบางคนที่เพิ่งเริ่มตะลุยสิ่งนี้ แต่ดูเหมือนว่า Source engineจะส่งแพ็คเก็ตที่มีการเปลี่ยนแปลงทุกอย่างใน โลกทุกเห็บ? …

2
ฉันจะทำให้การโจมตีของผู้ชายที่ดีได้เพียงแค่โจมตีคนเลวและในทางกลับกันได้อย่างไร
เกมของฉันมีคนดีหลายประเภทและผู้ชายเลวหลายประเภท พวกเขาทั้งหมดจะทำการยิงขีปนาวุธใส่กัน แต่ฉันไม่ต้องการให้เกิดความเสียหายจากหลักประกันใด ๆ ที่เกิดขึ้นสำหรับการจัดเรียงอย่างใดอย่างหนึ่ง ดังนั้นคนเลวจึงไม่สามารถตี / ทำลายคนเลวคนอื่นและคนดีไม่ควรที่จะตี / ทำความเสียหายคนดีคนอื่น วิธีที่ฉันคิดว่าการแก้ปัญหานี้คือการทำให้มันเพื่อให้Unitอินสแตนซ์ (นี่คือ javascript, BTW) มีalignmentคุณสมบัติที่สามารถเป็นได้ทั้งหรือgood badและฉันจะปล่อยให้การปะทะเกิดขึ้นถ้า class Attack boolean didAttackCollideWithTarget(target) return attack.source.alignment != target.alignment and collisionDetected(attack.source, target) นี่คือรหัสหลอกแน่นอน แต่ฉันถามคำถามนี้เพราะฉันเข้าใจว่าอาจมีวิธีที่สง่างามกว่านี้ในการออกแบบนอกเหนือจากการเพิ่มคุณสมบัติอื่นให้กับUnitชั้นเรียน ของฉัน

2
ฉันจะเชื่อมโยง key_callback กับอินสแตนซ์คลาสของ wrapper ได้อย่างไร
ฉันพยายามรวมการโทร GLFW3 ไว้ในคลาสเดียว: class WindowManager { private: GLFWwindow* window_; GLFWmonitor* monitor_; Keyboard* keyboard_; ... } และฉันกำลังพยายามตั้งค่าคลาสคีย์บอร์ดแบบซิงเกิลที่รวบรวมแป้นกดระหว่างการดำเนินการ ใน GLFW ฉันสามารถตั้งค่าkey_callbackฟังก์ชั่นที่อยู่นอกนิยามคลาส (ฟังก์ชั่นฟรี): WindowManager::WindowManager() { ... glfwSetKeyCallback(window_, key_callback); ... } // not a class function void key_callback(GLFWwindow* window, int key, int scan code, int action, int mods) { ... } ฉันจะเชื่อมโยงการติดต่อกลับและWindowManagerอินสแตนซ์ของฉันเพื่อให้สามารถตั้งค่าkeyboard_วัตถุได้อย่างไร ฉันไม่สามารถสร้างkey_callbackฟังก์ชั่นสมาชิกของWindowManagerเพราะจะไม่ทำงานเนื่องจากฟังก์ชั่นนั้นจะเป็นสมาชิกของคลาส WindowManager …
11 c++  glfw 

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