สนุกยิ่งขึ้นด้วย ES ...
ปัจจุบันฉันมีระบบน้อย:
- Renderer (แอตทริบิวต์ Renderable, แอตทริบิวต์การแปลง)
- การเคลื่อนไหว (แอตทริบิวต์ที่เคลื่อนย้ายได้, การแปลงแอตทริบิวต์, แอตทริบิวต์ที่แสดงผลได้ [สำหรับกล่องขอบ ฯลฯ ])
- อินพุต (แอตทริบิวต์ InputReceiver)
- เป็นต้น
ฉันกำลังเพิ่มการตรวจจับการชน ความคิดแรกของฉันคือการเพิ่มระบบใหม่ที่ดำเนินการชนกัน มันสมเหตุสมผลสำหรับฉันที่จะแยกสิ่งนี้ออกจากMotion
ระบบเนื่องจากไม่ใช่ทุกสิ่งที่เคลื่อนไหวหรือเป็นภาพเคลื่อนไหวจำเป็นต้องมีส่วนร่วมในการตรวจจับการชนกัน - กล้องหมอก ฯลฯ - แต่ดูเหมือนว่าCollision
และMotion
มันพึ่งพาซึ่งกันและกัน
เมื่อไหร่ Motion
ย้ายเอนทิตีการแปลงจะต้องได้รับการตรวจสอบความถูกต้องCollision
และการเคลื่อนไหวจะถูกยกเลิกหรือปรับ (การกระดอนหยุดที่ผนัง ฯลฯ )
อีกทางเลือกหนึ่งคือการสร้างแอตทริบิวต์ Collidable ที่รักษาการอ้างอิงไปยังวัตถุการชน - kd-tree, octree เป็นต้นที่ใช้ร่วมกันระหว่างเอนทิตีที่สามารถชนกัน Motion
ระบบแล้วจะตรวจสอบสำหรับแอตทริบิวต์นั้นและใช้มันในการตรวจสอบหรือปรับการเคลื่อนไหว
จากมุมมองของรหัสนั่นเป็นทางออกที่ยอมรับได้ อย่างไรก็ตามจากมุมมองสถาปัตยกรรมของ ECS ดูเหมือนว่ามันเป็นการผลักตรรกะในMotion
ระบบที่ไม่สามารถใช้กับเอนทิตีทั้งหมดที่มีMovable
แอตทริบิวต์
ฉันยังสามารถจัดเก็บเวคเตอร์แบบเคลื่อนไหวในMovable
แอตทริบิวต์และCollider
ปรับระบบTransform
ตามต้องการ แต่จะเกี่ยวข้องกับการทำซ้ำการทำงานระหว่างMotion
และCollider
หรือการโทรกลับจากCollider
ไปยังMotion
ด้วยข้อมูลบางอย่างเกี่ยวกับตำแหน่งการชนและข้อมูลพื้นผิวสำหรับการตีกลับ / การสะท้อน ฯลฯ .
สิ่งนี้อาจตกอยู่ภายใต้หัวข้อของ "การแฮ็กกรณีพิเศษ" แต่ฉันต้องการรับข้อมูลบางอย่างจากผู้ที่เคยจัดการสิ่งนี้มาก่อนโดยไม่ต้องสร้างโค้ดเคสแบบขอบจำนวนมาก
คำถาม เป็นวิธีที่ดีในการหลีกเลี่ยงการเชื่อมต่ออย่างแน่นหนาระหว่างระบบการเคลื่อนที่และการชนเมื่อดูเหมือนว่าพวกเขาต้องการความรู้ซึ่งกันและกัน