เขียน Game Engine ตั้งแต่เริ่มต้นด้วย OpenGL [ปิด]


15

ฉันต้องการเริ่มเขียนโปรแกรมเกมของฉันตั้งแต่เริ่มต้นเพื่อการเรียนรู้สิ่งที่จำเป็นต้องมีและวิธีการทำสิ่งที่ภาษาการเขียนโปรแกรมและสิ่งที่คุณแนะนำฉัน? นอกจากนี้หากคุณมีบทความและหนังสือที่ดีว่ามันจะยอดเยี่ยม ขอบคุณล่วงหน้า!

ภาษาและเครื่องมือในการเขียนโปรแกรมของฉันคือ:

  • C / C ++ ดีไหมที่จะใช้ C เท่านั้น?
  • หลาม
  • OpenGL
  • Git
  • GDB

สิ่งที่ฉันต้องการเรียนรู้จากมัน:

  • Core Game Engine
  • การแสดงผล / กราฟิก
  • การเล่นเกม / กฎ
  • อินพุต (แป้นพิมพ์ / เมาส์ / ตัวควบคุม ฯลฯ )

ในการแสดงผล / กราฟิก:

  • 3D
  • การแรเงา
  • โคมไฟ
  • พื้นผิว

สองประเด็น: คำถามนี้มันกว้างเกินไป คุณต้องการคุณลักษณะใดบ้างคุณต้องการสนับสนุนแพลตฟอร์มใดกรอบความคิดที่คุณต้องการสำรวจความรับผิดชอบที่คุณต้องการใช้ในภาษาสคริปต์ (ถ้ามี) และโฮสต์อื่น ๆ ที่ฉันต้องการ m จะไม่รบกวนรายการต่อไป
Tetrad

8
สอง: มีความรู้ทั่วไปที่คนอื่นจะพวยพุ่งออกมาว่าคุณไม่ควรมุ่งเน้นไปที่การสร้างเครื่องยนต์โดยไม่มีเกม เครื่องยนต์โดยไม่ต้องเกมหมายความว่าคุณไม่สามารถพิสูจน์เครื่องยนต์ของคุณเป็นประโยชน์ เครื่องยนต์ที่ดีต้องการให้คนกินอาหารสุนัขของตัวเองเหมือนเดิม บล็อกที่เชื่อมโยงไปยังเนื้อหาทั่วไปของอาร์กิวเมนต์นี้อยู่ที่นี่: scientificninja.com/blog/write-games-not-engines
Tetrad

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

1
ฉันไม่เห็นประเด็นในรายการของคุณ ข้อเท็จจริงที่คุณรู้ C / C ++ และ Python ช่วยเรา แต่ทำไมรายการที่คุณสามารถใช้การควบคุมเวอร์ชันและดีบักเกอร์
The Duck คอมมิวนิสต์

2
@TheCommunistDuck: เฮ้มันดีกว่าผู้พัฒนาบางคน :)
ChrisE

คำตอบ:


11

คุณสามารถเขียนเอ็นจิ้นเกมเป็นภาษาใดก็ได้โดยใช้วิธีการแสดงผลแบบใดก็ได้ คุณสามารถเขียนเอ็นจิ้นเกมเป็นทุบตีโดยใช้เอาต์พุตคอนโซลตัวอย่างเช่น

ดังนั้นฉันคิดว่ามันเป็นการดีที่สุดที่จะกำหนดสิ่งที่คุณต้องการเรียนรู้ในการเขียนโปรแกรมของคุณเอง มี "ฟิลด์" มากมายในการพัฒนาเกม

  • Core Game Engine

  • การแสดงผล / กราฟิก

  • AI

  • ระบบเครือข่าย

  • การเล่นเกม / กฎ

  • เสียง

  • อินพุต (แป้นพิมพ์ / เมาส์ / ตัวควบคุม ฯลฯ )

จากนั้นคุณสามารถมีหัวข้อย่อย ในการแสดงผล / กราฟิก

  • 2d หรือ 3d?

  • การสร้างแบบจำลอง

  • การแรเงา

  • โคมไฟ

  • พื้นผิว

  • GUIs / HUDs / การเชื่อมต่อ

  • ฯลฯ

เพียงหนึ่งในหัวข้อย่อยเหล่านั้นอาจกินการเรียนหลายชั่วโมง (หรือหลายปี!)!

ดังนั้นก่อนกำหนดสิ่งที่คุณต้องการเรียนรู้ เริ่มง่ายๆ

ใช้ภาษาใดก็ได้ที่คุณคุ้นเคย - แม้ว่าบางภาษาจะเหมาะกับงานบางประเภทมากขึ้น ตัวอย่างเช่นโปรแกรมหลักและการเรนเดอร์อาจทำได้ดีที่สุดด้วยภาษาระดับ "ต่ำลง" เช่น C / C ++ (ถ้าคุณต้องการประสิทธิภาพนั่นคือ); แต่สิ่งที่ชอบ AI หรือกฎของเกมอาจทำได้ดีกว่าในภาษาระดับที่สูงขึ้น ไม่มีอะไรบอกว่าคุณไม่สามารถมิกซ์แอนด์แมทช์ คุณสามารถเขียนเอนจิ้นของคุณใน C ++, การเรนเดอร์ของคุณใน C (เพราะมันทำงานได้ดีกับ OpenGL) จากนั้นใช้ LUA สำหรับการเขียนสคริปต์กฎเกมของคุณเป็นต้น

เท่าที่มีตัวอย่างเอ็นจิ้นเกมชื่อ Slick2D มันเขียนใน Java และเป็นโอเพนซอร์ส มันเป็นตัวอย่างของเครื่องมือ 2d ที่เรียบง่ายที่เขียนและออกแบบได้ดีจริงๆ คุณสามารถเรียนรู้แนวคิดพื้นฐานจากสิ่งนั้นเช่นลูปเกมการจัดการสถานะเกม ฯลฯ

ถ้าคุณพอใจกับ C / C ++; ฉันขอแนะนำให้ดู SDL / OpenGL มันจัดการดูแลทำความสะอาดบางอย่างเช่นการป้อนข้อมูลเสียงการสร้างหน้าต่าง ฯลฯ และสามารถมุ่งเน้นไปที่สิ่งอื่น ๆ


4
Ahh วันที่ฉันได้เรียนรู้ C ++ และเกมคอนโซลสนุกมาก ... [สร้างโครงการคอนโซลใหม่ ... ]
Nick Bedford

ฉันปรับปรุงคำถามของฉันหวังว่าจะให้ฉันมากของทรัพยากรที่น่ากลัว :)
Wazery

4

SDL + OpenGL เป็นตัวเลือกที่ยอดเยี่ยมในการเริ่มโปรแกรมเกมแบบกำหนดเอง

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

ฉันอยู่ในเรือลำเดียวกันกับที่คุณเป็นและฉันได้เขียนการผจญภัยของฉันกับ SDL และ OpenGL ในบล็อก ( immersedcode.org ) ในกรณีที่คนอื่นสนใจ

สำหรับสถาปัตยกรรมทั่วไปฉันมีสองข้อเสนอแนะ: ถ้าคุณต้องการโปรแกรม 3D ลองดูหนังสือ "Game Engine Architecture" โดย Jason Lander หากสิ่งที่คุณต้องการคือ 2D ให้ออกแบบให้ง่ายที่สุดและให้แรงบันดาลใจจาก XNA หรือโครงการอื่น ๆ

สุดท้าย: อย่าเรียก OpenGL ไปทั่วทุกที่ ทำสิ่งที่คุณโปรดปรานและแยกออกเป็นสองแห่งเพื่อให้คุณมีความสามารถในการสลับระหว่างเดสก์ท็อป OpenGL / OpenGL ES หรือแม้แต่ DirectX ในภายหลังหากคุณต้องการ


0

อย่าใช้ C ยกเว้นว่ารายละเอียดการใช้งานจะนำคุณไปสู่จุดที่น่าสงสัย มิฉะนั้นให้ใช้ C ++ เพราะภาษานี้มีความสามารถที่มากกว่าและคุณสามารถเลือกที่จะไม่ใช้ความสามารถเหล่านั้นได้ในภายหลัง โดยส่วนตัวฉันไม่มีอะไรจะใช้เพื่อต่อต้าน Python ฉันไม่เคยใช้มันเลย

ฉันจะไม่แนะนำ OpenGL กับ DirectX เพราะ DX มีวิธีการที่เน้นวัตถุที่ทันสมัยซึ่งมีความสะอาดกว่าและเกิดข้อผิดพลาดที่เข้าใจได้ง่ายขึ้น / น้อยลง อินเทอร์เฟซที่นำเสนอโดย OpenGL นั้นต่ำมากเมื่อเปรียบเทียบ

สิ่งสุดท้ายที่ฉันได้คือการที่ฉันได้ยินจากหลาย ๆ คนที่ฉันเชื่อว่า GDB อย่างเต็มที่สุดยอดจริงๆและดีบัก Visual Studio นั้นดีที่สุด นี่ไม่ใช่ประสบการณ์ส่วนตัวของฉันดังนั้นเอาเกลือเล็กน้อย


4
"OpenGL vs. DX" ความจริงที่ว่า DirectX เป็น OO มากกว่านั้นไม่สำคัญจริงๆ เท่าที่เข้าใจได้มากกว่า ... OpenGL (ก่อนหน้า 3) จะเปิดเผยส่วนติดต่อที่ค่อนข้างตรงไปตรงมาและอีกอันที่ง่ายต่อการสแกนเนื่องจากทั้งหมดนี้อยู่ในวิธีการกำหนดรูปแบบ C "ตั้งค่าเมทริกซ์การฉายภาพเป็นสิ่งนี้เริ่มสามเหลี่ยมที่นี่คือจุดยอดนี่คือจุดยอดนี่คือจุดยอดนี่คือจุดยอดจุดสิ้นสุดจุดจบ" OpenGL API 1.x ซีรี่ย์นั้นเหมาะสำหรับการเขียนโปรแกรมกราฟิกและใช้งานร่วมกับ SDL (หรือแม้กระทั่ง GLUT ... เร่งด่วน) ให้คุณได้แอพที่มีรหัส 30-50 บรรทัด
ChrisE

2
@ChrisE: แน่นอน มีสิ่งที่เรียกว่าextern "C"และการใช้งานที่เหมาะสมทำให้การเขียนอินเตอร์เฟส C ค่อนข้างน่าสนใจโดยเฉพาะอย่างยิ่งสำหรับ Python ที่มีตัวแปลงอยู่ภายใน Boost ที่ทำให้การเชื่อมโยงทำได้ง่าย คุณสมบัติภาษา C ++ เป็นอย่างไร พวกเขากำลังดี การใช้คุณสมบัติภาษา C ++ มากขึ้นจะเพิ่มความน่าเชื่อถือของโครงการและความง่ายในการเขียนโปรแกรมอย่างหนาแน่นเพื่อการแลกเปลี่ยนที่มีประสิทธิภาพน้อยกว่าที่ยอมรับได้ คุณสมบัติทางภาษาของ C นั้นเปรียบเทียบกันอย่างน่าสงสาร ตัวอย่างเช่นการใช้คอมไพเลอร์ C ++ ที่ทันสมัยอย่างถูกต้องสามารถรับประกันได้ว่าไม่มีการรั่วไหลของหน่วยความจำ ทำเช่นนั้นใน C.
DeadMG

1
@DeadMG: ถ้า OOP เป็นเรื่องใหญ่คำตอบก็คือ Java หรือ C # ไม่ใช่ C ++ สิ่งที่ฉันไม่เห็นด้วยคือการใช้คุณสมบัติ C ++ ไม่ได้ทำให้โค้ดของคุณดีขึ้นเร็วขึ้นหรือน่าเชื่อถือมากขึ้น คุณต้องรู้วิธีการใช้คุณสมบัติเหล่านั้นและการเรียนรู้ภาษานอกเหนือจากการออกแบบโครงสร้างเครื่องยนต์ใช้เวลาอย่างคุ้มค่าหรือไม่? ไม่ใช่สำหรับคนที่ทำสิ่งนี้เป็นครั้งแรก คุณสามารถเรียนรู้ C ทั้งหมดในหนึ่งหรือสองวันอย่างสะดวกสบายและไม่เคยสงสัยเลยว่าภาษากำลังทำอะไร OpenGL การโทรพื้นฐานที่มีประโยชน์ในทุก ๆ อัตรามีความโปร่งใสเหมือนกัน
ChrisE

2
OOP ไม่ได้เป็นข้อตกลงที่ยิ่งใหญ่ไม่ใช่ในเกมเอ็นจิ้นประสิทธิภาพสูง แน่นอนว่ามันมีประโยชน์ แต่มักจะเป็นสิ่งที่ผิดที่เป็นนามธรรม มีการไหลของข้อมูลที่ดีท้องถิ่นและเค้าโครงหน่วยความจำของมักจะดีกว่า ในขณะที่ทีมส่วนใหญ่ใช้ C ++ พวกเขาไม่ได้ใช้คุณสมบัติ C ++ เป็นส่วนใหญ่ ไม่มีข้อยกเว้นให้น้อยที่สุดเท่าที่เป็นไปได้ไม่มี RTTI ไม่มี STL / Boost ทำไม? การประมวลผลที่คาดเดาได้และรวดเร็วและโค้ดขนาดเล็กบนหลายแพลตฟอร์ม ฉันเขียนโค้ดใน C และมีเพียงสองส่วนที่ฉันอยากจะใช้ C ++: scoped lock และ array ทั่วไป ไม่คุ้มกับความยุ่งยาก IMHO
ถือเป็นโมฆะ

4
บน GL กับ D3D: ไม่มีเมทริกซ์สแต็กในแกน GL3 / 4 และไม่มีสแต็ค attrib ทั้ง GL และ D3D จับคู่กับสถาปัตยกรรมฮาร์ดแวร์เดียวกัน แต่หลายครั้งที่ GL รู้สึกบางลง แน่ใจว่าเครื่องสถานะ GL นั้นค่อนข้างยุ่งยาก แต่ก็เป็นฮาร์ดแวร์จริง ๆ ) การเรียนรู้ใด ๆ ของพวกเขานั้นดีและตราบใดที่คุณเข้าใจสิ่งที่เกิดขึ้นจริงคุณสามารถสลับไปที่อื่นได้อย่างง่ายดาย (หรือคอนโซล API)
โมฆะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.