วิธีการออกแบบเอ็นจิ้นเกมในภาษาเชิงวัตถุ [ปิด]


26

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

การออกแบบที่ดีคืออะไรและจะนำไปใช้อย่างไร อะไรคือข้อตกลงที่ต้องทำและข้อดี / ข้อเสียของพวกเขา?


12
มีอะไรผิดปกติเกิดขึ้นกับแรงกระตุ้นและการปรับโครงสร้างใหม่จากที่นั่นแทนที่จะเป็นอัมพาตที่ต้องทนทุกข์ทรมาน?
The Duck คอมมิวนิสต์

7
@TheCommunistDuck เพราะการดำเนินการอย่างต่อเนื่องเป็นวิธีที่ฉันได้ทำในโครงการก่อนหน้านี้ของฉัน - และทุก ๆ หนึ่งยอดฮิตติดกำแพงหลังจากไม่กี่เดือนเมื่อฉันพบว่าคุณลักษณะใหม่ใด ๆ ต้องใช้ความพยายามและความซับซ้อนที่ยิ่งใหญ่เพื่อเพิ่ม ตอนนี้ฉันใช้เวลาเขียนเครื่องยนต์ของตัวเองมากกว่าที่จะเขียนเกมเองดังนั้นฉันจึงหวังว่าด้วยความสุขุมและวางแผนฉันจะประหยัดเวลาในระยะยาว
เครื่องยนต์ extropic

3
@ chuzzum จุดดี สิ่งหนึ่งที่ฉันอยากจะแนะนำก็คือตรวจสอบสถาปัตยกรรมของเครื่องยนต์ C4 นั่นคือ terathon.com/c4engine/images/ar Architecture.pngมันอาจจะสูงกว่าที่คุณต้องการ แต่อาจให้ความคิดกับคุณ ;-)
The Communist Duck


3
คำถามนี้ก็คลุมเครือเช่นกัน อาจใช้ตัวอย่างหนึ่งของคุณและทำให้คำถามนั้นลึกลงไป
Tetrad

คำตอบ:


24

ฉันสงสัยว่ามีใครบางคนกำลังจะสามารถพูดว่า 'คุณต้องทำสิ่งนี้และสิ่งนี้และสิ่งนี้และช่องนี้ด้วยรูปแบบ X'

อย่างไรก็ตามทรัพยากรที่มีประโยชน์บางอย่าง:
Enginuity - ชุดบทความสร้างเครื่องยนต์บน Gamedev.net
Game Coding Complete - ฉันเป็นเจ้าของหนังสือเล่มนี้และมันครอบคลุมทุกแง่มุมของการเขียนโปรแกรมเกม (ดีเกือบ) นอกจากนี้ยังมีเครื่องยนต์ที่สร้างขึ้นตลอดทั้งเล่ม
Game Engine Architecture - หนังสือเล่มนี้เป็นอีกหนึ่งหนังสือที่ยอดเยี่ยมสำหรับการออกแบบเครื่องยนต์
เค้าโครงเครื่องยนต์ C4 - นำมาจากความคิดเห็นของฉัน แต่นี่แสดงให้เห็นถึงวิธีระดับสูงในการติดตั้งแต่ละส่วนของเครื่องยนต์เข้าด้วยกัน

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

แก้ไข: ฉันลืมบทความ Gamedev ถูกเก็บถาวรตั้งแต่เว็บไซต์ใหม่แก้ไข :)


ลิงก์ Enginuity เสียและ googling บทความดูเหมือนจะแสดงว่าพวกเขาไม่ได้อยู่บนเว็บอีกต่อไป (?) หนังสือดูเหมือนว่าเป็นแหล่งข้อมูลที่ดีและฉันมักจะจับตาดูหนังสือการเขียนโปรแกรมมากขึ้น;)
เครื่องยนต์ extropic

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

1
แก้ไขลิงก์
The Duck คอมมิวนิสต์

+1 สำหรับ enginuity @ chuzzum เพียงตรวจสอบเกมเอ็นจิ้นสองสามตัวปล่อยให้พวกเขาสร้างแรงบันดาลใจให้คุณและได้รับสถาปัตยกรรมที่ดีที่สุดสำหรับตัวคุณ บวก: เป็นการดีกว่าที่จะทำให้ส่วนประกอบของโปรแกรมเกมของคุณเป็นแบบลำดับขั้นดูที่Cowboyprogramming.com/2007/01/05/evolve-your-heirachy
Dave O.

1
ฉันจะไม่บอกว่ามันเป็นเอ็นจิ้นที่จำเป็นต้องรวมเข้าด้วยกันเป็นส่วนหนึ่งของเอนทิตีเฟรมเพิ่มเติม
The Duck คอมมิวนิสต์

7

ดังตัวอย่างต่อไปนี้คือโครงสร้างโครงการโร๊คไลค์ในปัจจุบันของฉัน (ใน Java) มันใช้เอ็นจิ้นกราฟิก 2 มิติดังนั้นโค้ดการเรนเดอร์จำนวนมากจึงได้รับการดูแลสำหรับฉัน ยินดีต้อนรับคำติชม

class Game
คลาสนี้ตั้งค่าเครื่องรัฐที่จัดการสถานะปัจจุบันของเกม (ในเมนูเทียบกับการเริ่มเกมใหม่เทียบกับการเล่นเกมที่บันทึกไว้)

interface State
แต่ละคลาสคลาสจะมีสองลูป: ลูปสำหรับการอัพเดตลอจิกและลูปสำหรับการเรนเดอร์ พวกเขายังมีรหัสสำหรับการโทรGameชั้นเรียนและขอเปลี่ยนเป็นสถานะที่แตกต่างกัน

class ResourceManager
ซิงเกิลตันที่เริ่มต้นโดยGameคลาสที่โหลดทรัพยากรที่จำเป็นทั้งหมดและอนุญาตให้เข้าถึงได้ ฉันไม่ชอบการออกแบบนี้เพราะมันยากที่จะโหลด / ยกเลิกการโหลดทรัพยากรในระดับต่าง ๆ เช่น ฉันอาจจะออกแบบสิ่งนี้แตกต่างกันถ้าฉันเริ่มต้นใหม่

class Map
แผนที่มีอาร์เรย์ของแผ่นกระเบื้องและรายการสิ่งมีชีวิตและรายการทั้งหมดบนแผนที่ มันเป็นระดับพื้นฐานที่ค่อนข้างสวย

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

interface AITask
สิ่งมีชีวิตสามารถมีรายการ AITasks ซึ่งจะถูกดำเนินการทุกครั้งที่วงลอจิกของสิ่งมีชีวิตนั้นทำงาน AITask มีลอจิกวนของตนเองที่ออกคำสั่งไปยังสิ่งมีชีวิตและเงื่อนไขการเลิกจ้างที่กำหนดว่างานจะเสร็จสมบูรณ์หรือไม่

interface UIElement
ฉันใช้งาน UI ของตัวเองสำหรับเครื่องมือนี้ UIElement แต่ละรายการมีลูปการเรนเดอร์และตรรกะลูป นอกจากนี้ยังมีลูปสำหรับการประมวลผลคีย์บอร์ด / เมาส์ องค์ประกอบทั้งหมดสามารถมีองค์ประกอบย่อยจำนวนหนึ่งซึ่งถูกแสดงผลหลังจากที่ผู้ปกครองของพวกเขาและเข้าควบคุมแป้นพิมพ์ / เมาส์ สิ่งนี้ทำให้คุณมีเมนูที่มีเมนูย่อยเช่น


เกิดอะไรขึ้นกับสิ่งนี้ ดูเหมือนดีกับฉันอย่างสมบูรณ์
The Duck คอมมิวนิสต์

@TheCommunistDuck มันไม่ได้มาจากตัวอย่างจริง ๆ ที่ฉันเลือก แต่ฉันมีปัญหามากมายเกี่ยวกับรหัสนี้ คลาส ResourceManager เป็นหนึ่งในนั้น แต่ฉันมีปัญหากับรัฐเช่นกัน - ฉันจบลงด้วยการเพิ่มจำนวนมากของพวกเขาและคัดลอกรหัสจำนวนมาก โดยเฉพาะอย่างยิ่งในเกม RPG ที่ผู้เล่นมีตัวเลือกมากมายในแต่ละครั้งคุณสามารถจบลงด้วยกราฟสถานะที่ซับซ้อนจริงๆ ตัวอย่าง: เสกคาถา ไปจาก NormalState -> SelectSpellState -> SelectTargetState -> InvalidTargetState (หากล้มเหลว) -> DoSpellAnimationState -> NormalState และนั่นเป็นเพียงการกระทำเดียว
เครื่องยนต์ extropic

1
ไม่ไม่. NO NOPE กรุณาอย่า โอ้รอคุณบอกว่าคุณไม่ชอบมัน
Bartek Banachewicz

6

จุดสำคัญแรกที่ต้องทำคือไม่มีคำตอบที่ 'ดี' สำหรับคำถามนี้

สิ่งที่ใกล้เคียงที่สุดกับคำตอบที่ถูกต้องน่าจะเป็น: มันขึ้นอยู่กับประเภทของเกมแพลตฟอร์มเป้าหมายข้อ จำกัด (เวลา) เป็นต้น

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

การออกแบบปัจจุบันของฉันคือลูกผสมของ Quake3 / Doom3และห้องสมุดระดับ. NET เล็กน้อย :)

ฉันมีสองห้องสมุด (คงที่หรือแบบไดนามิกขึ้นอยู่กับว่าคุณต้องการสร้าง / ส่ง) และFrameworkLibrary

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

Framework เป็นความกล้าของ 'engine' ถ้าคุณต้องการเรียกมันว่า สิ่งเหล่านี้มากมายตามปรัชญาการออกแบบของ Quake3 (ในทิศทางที่เป็นวัตถุมากขึ้น) มันมีCLIการจัดการเวลารหัสเฉพาะระบบปฏิบัติการและในที่สุดเครือข่ายเลเยอร์อื่น ๆ

ทั้งสองนี้เชื่อมโยงกับแอพที่เกิดขึ้นจริง Gameถ้าคุณชอบซึ่งมีรหัสเฉพาะเกม ในทำนองเดียวกัน Quake3 จะโหลด DLL ขึ้นอยู่กับว่า 'mod' กำลังเล่นอยู่

หากต้องการให้แนวคิดเกี่ยวกับโครงสร้างที่นี่คุณสามารถแบ่งโฟลเดอร์และเนื้อหาอย่างรวดเร็วสำหรับแต่ละ lib:


  • กรอบ
    • IO (คลาสการจัดการไฟล์ผู้เชี่ยวชาญ, คลาสการพิมพ์ข้อความ (เช่น CLI) และการบันทึกเป็นต้น)
    • เครือข่าย
      • ลูกค้า (คลาสที่แสดงถึงสิ่งที่ Framework พิจารณาว่าเป็น 'ผู้เล่น / เชื่อมต่อกับเกม')
      • เซิร์ฟเวอร์ (คลาสเพื่อจัดการการเชื่อมต่อเข้าสู่กรอบงานและจัดการโปรแกรมเล่น)
    • แพลตฟอร์ม (คีย์บอร์ด / เมาส์ / ตัวควบคุมคลาสที่จัดการรูทีน OS เฉพาะเช่น getTime ())
    • ระบบ (คลาสที่มีระดับต่ำมากเช่นคลาสข้อผิดพลาดเพื่อช่วยในการพิมพ์ข้อความแสดงข้อผิดพลาดคลาสของการกำหนดเวลาและ CLI เอง)
    • Renderer (อธิบายตนเอง)
    • เป็นต้น

  • ห้องสมุด
    • คอลเลกชัน (คลาสที่แสดงคอลเลกชันของข้อมูลรายการที่เชื่อมโยง / แฮชเทเบิ้ล ฯลฯ )
    • คณิตศาสตร์ (คลาสตัวช่วยคณิตศาสตร์พื้นฐานเช่นเวกเตอร์และเมทริกซ์)
    • เป็นต้น

HTH! ควรให้คำแนะนำคุณ ...


ลิงก์สำรองไปยังซีรี่ส์
Enginuity

-3

สิ่งที่ต้องพิจารณา

  • ภาษาเชิงวัตถุมีปัญหาเพราะโดยปกติแล้วพวกเขาจะไม่มีฟังก์ชั่นชั้นหนึ่งหรือไม่ใช่ข้อมูลทั้งหมดเป็นวัตถุ (เช่นจำนวนเต็มหรือลอยใน Java) รูปแบบการออกแบบที่อยู่ปัญหาเหล่านี้มีหลายรูปแบบ โดยทั่วไปจะเร็วกว่าการเขียนโค้ดและง่ายต่อการใช้ภาษาซึ่งสามารถทำได้ (วัตถุชั้นหนึ่ง); เช่น Python (ซึ่งอนุญาตการออกแบบเชิงวัตถุ) คุณจะมีความเร็วช้ากว่า
  • แคลคูลัสเหตุการณ์ถึง AI อย่างน้อยที่สุด
  • ลอจิก Hoare ใช้เงื่อนไขและ postconditions เพื่อทดสอบรหัสของคุณอย่างน้อยที่สุด
  • ตัวแทนดูที่หน่วยงาน Quake
  • ฐานข้อมูลเชิงสัมพันธ์วิธีที่มีประสิทธิภาพในการจัดเก็บข้อมูล

การออกแบบที่ดี

  • ทำแผนภาพ ER
  • ทำให้ถูกต้อง
  • สร้างฐานข้อมูลวัตถุหรือโครงสร้างข้อมูลของคุณ

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


-1 เนื่องจากคำตอบนี้คลุมเครือและสับสน ฐานข้อมูลเชิงสัมพันธ์ไม่มีอะไรเกี่ยวข้องกับ OO-engine ฉันเข้าใจได้ว่าภาษาอังกฤษไม่ใช่ภาษาแรกของคุณ แต่คุณสามารถอธิบายสิ่งที่คุณหมายถึงในย่อหน้าแรกได้หรือไม่ ดูเหมือนว่าจะขัดแย้งกัน (ภาษา OO มีปัญหา แต่ง่ายกว่าในการเขียนโปรแกรมในภาษาที่มีรูปแบบการออกแบบ .. แม้ว่ารูปแบบการออกแบบมักจะเป็นโครงสร้าง OO เสมอ)
The Duck คอมมิวนิสต์

@duck ขัดแย้งหรือไม่ OO มีปัญหาที่ไม่ได้อยู่ในภาษาอื่น ๆ , DP แก้ปัญหาให้พวกเขาเห็นc2.com/cgi/wiki?DesignPatternsInDynamicProgramming
user712092

@Duck 1) คุณสามารถใช้ SQL ใน C ++ 2) คุณสามารถอนุมานคุณลักษณะของวัตถุจาก ER (แม้ว่าจะไม่แนะนำให้ปฏิบัติ) 3) คุณสามารถ data structeres จากความสัมพันธ์ (นี่คือรายการเพราะฉันต้องการเรียงลำดับ elemenents ที่ willm นี่คือแฮชเพราะฉันต้องการค้นหาอย่างรวดเร็ว)
user712092

@ เป็ดฉันขอโทษฉันทำผิดพลาดโดยการสั่งใหม่ ฉันไม่ต้องการอ้างสิทธิ์ "DP ง่ายกว่า XY" แต่ "ภาษาที่สามารถใช้งานเฟิร์สคลาสได้คือ ... " :)
user712092

ใช่อาจมีข้อดีสำหรับภาษาทำงาน อย่างไรก็ตามแม้อย่างเป็นกลางฉันรู้สึกว่าวิธีการ OO นั้นสมเหตุสมผลจากมุมมองของ gamedev นอกจากนี้ยังไม่มีเหตุผลที่คุณต้องการฐานข้อมูลเชิงสัมพันธ์ได้ทุกที่ แน่นอนว่าพวกเขาจะมีประโยชน์ อย่างไรก็ตามมันไม่ได้กลายเป็นองค์ประกอบที่จำเป็นได้ทุกที่
The Duck คอมมิวนิสต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.