นี่คือการติดตามคำถามนี้ซึ่งฉันตอบไป แต่สิ่งนี้จะจัดการกับหัวข้อที่เฉพาะเจาะจงมากขึ้น
คำตอบนี้ช่วยให้ฉันเข้าใจระบบ Entity ได้ดีกว่าบทความ
ฉันได้อ่าน(ใช่แล้ว) บทความเกี่ยวกับระบบ Entity และมันบอกฉันต่อไปนี้:
เอนทิตีเป็นเพียง id และอาร์เรย์ของส่วนประกอบ (บทความบอกว่าการเก็บเอนทิตีในส่วนประกอบไม่ใช่วิธีที่ดีในการทำสิ่งต่าง ๆ แต่ไม่มีทางเลือกอื่น)
ส่วนประกอบคือชิ้นส่วนของข้อมูลที่บ่งบอกถึงสิ่งที่สามารถทำได้กับเอนทิตีที่แน่นอน
ระบบคือ "วิธีการ" พวกเขาทำการจัดการข้อมูลกับเอนทิตี
ดูเหมือนว่าจะใช้งานได้จริงในหลาย ๆ สถานการณ์ แต่ส่วนที่เกี่ยวกับส่วนประกอบที่เป็นเพียงคลาสข้อมูลกำลังรบกวนฉัน ตัวอย่างเช่นฉันจะใช้คลาส Vector2D ของฉัน (ตำแหน่ง) ในระบบกิจการได้อย่างไร
ชั้น Vector2D เก็บข้อมูล: พิกัด x และ y แต่ก็มีวิธีการซึ่งมีความสำคัญต่อความมีประโยชน์และแยกความแตกต่างของชั้นเรียนจากเพียงแค่องค์ประกอบสองแถว วิธีการตัวอย่างเช่น: add()
, rotate(point, r, angle)
, substract()
, normalize()
และมาตรฐานอื่น ๆ ที่มีประโยชน์และจำเป็นอย่างยิ่งวิธีการที่ตำแหน่ง (ซึ่งเป็นกรณีของชั้น Vector2D) ควรจะมี
หากองค์ประกอบนั้นเป็นเพียงตัวยึดข้อมูลมันจะไม่สามารถมีวิธีการเหล่านี้ได้!
ทางออกหนึ่งที่อาจปรากฏขึ้นก็คือการใช้พวกเขาภายในระบบ แต่ดูเหมือนว่าเคาน์เตอร์ง่าย วิธีการเหล่านี้เป็นสิ่งที่ฉันต้องการดำเนินการในขณะนี้ให้พวกเขาเสร็จสมบูรณ์และพร้อมใช้งาน ฉันไม่ต้องการรอMovementSystem
ให้อ่านชุดข้อความราคาแพงที่สั่งให้ทำการคำนวณเกี่ยวกับตำแหน่งของเอนทิตี!
และบทความระบุไว้อย่างชัดเจนว่าเฉพาะระบบที่ควรมีฟังก์ชั่นใด ๆและคำอธิบายเดียวที่ฉันสามารถหาได้คือ "เพื่อหลีกเลี่ยง OOP" ก่อนอื่นฉันไม่เข้าใจว่าทำไมฉันจึงควรงดใช้วิธีในเอนทิตีและส่วนประกอบ ค่าใช้จ่ายหน่วยความจำจะเหมือนกันจริงและเมื่อเชื่อมต่อกับระบบเหล่านี้ควรจะง่ายต่อการใช้งานและรวมในรูปแบบที่น่าสนใจ ตัวอย่างเช่นระบบสามารถให้ตรรกะพื้นฐานแก่เอนทิตี / ส่วนประกอบซึ่งรู้ถึงการใช้งานด้วยตนเอง หากคุณถามฉัน - นี่เป็นการใช้สารพัดจากทั้ง ES และ OOP สิ่งที่ไม่สามารถทำได้ตามที่ผู้เขียนบทความ แต่สำหรับฉันดูเหมือนว่าเป็นการปฏิบัติที่ดี
คิดแบบนี้ มีวัตถุที่สามารถวาดได้หลายประเภทในเกม ภาพธรรมดาเก่า, ภาพเคลื่อนไหว ( update()
, getCurrentFrame()
ฯลฯ ), การรวมกันของชนิดดั้งเดิมเหล่านี้และทั้งหมดของพวกเขาก็สามารถให้draw()
วิธีการเพื่อให้ระบบแสดงผลที่แล้วไม่จำเป็นต้องดูแลเกี่ยวกับวิธีเทพดาของกิจการจะดำเนินการเท่านั้น เกี่ยวกับส่วนต่อประสาน (วาด) และตำแหน่ง จากนั้นฉันก็แค่ต้องการระบบภาพเคลื่อนไหวที่จะเรียกวิธีการเฉพาะภาพเคลื่อนไหวที่ไม่มีอะไรเกี่ยวข้องกับการแสดงผล
และอีกสิ่งหนึ่ง ... มีทางเลือกอื่นสำหรับอาร์เรย์เมื่อพูดถึงการจัดเก็บส่วนประกอบหรือไม่ ฉันไม่เห็นที่อื่นที่จะเก็บส่วนประกอบอื่นนอกเหนือจากอาร์เรย์ในคลาส Entity ...
บางทีนี่อาจเป็นวิธีที่ดีกว่า: จัดเก็บองค์ประกอบเป็นคุณสมบัติอย่างง่ายของเอนทิตี entity.position
ยกตัวอย่างเช่นเป็นส่วนประกอบตำแหน่งจะได้รับการติดกาวที่
เพียงวิธีอื่น ๆ จะมีชนิดของตารางการค้นหาบางอย่างแปลกภายในระบบที่อ้างอิงหน่วยงานต่าง ๆ แต่ที่ดูเหมือนว่ามากไม่มีประสิทธิภาพและมีความซับซ้อนมากขึ้นในการพัฒนากว่าส่วนประกอบเพียงแค่การจัดเก็บในกิจการ