จนถึงขณะนี้ระบบส่วนประกอบเอนทิตีที่ฉันใช้เคยทำงานเหมือนอาร์ทิมิสของ Java:
- ข้อมูลทั้งหมดในส่วนประกอบ
- ระบบอิสระไร้สัญชาติ (อย่างน้อยถึงระดับที่พวกเขาไม่ต้องการอินพุตในการกำหนดค่าเริ่มต้น) วนซ้ำแต่ละเอนทิตีที่มีเฉพาะส่วนประกอบที่ระบบเฉพาะสนใจ
- ทุกระบบประมวลผลเอนทิตีของพวกเขาหนึ่งขีดแล้วทุกอย่างก็เริ่มต้นขึ้น
ตอนนี้ฉันพยายามที่จะใช้สิ่งนี้กับเกมเทิร์นเบสเป็นครั้งแรกโดยมีเหตุการณ์และคำตอบมากมายที่ต้องเกิดขึ้นตามลำดับที่สัมพันธ์กับแต่ละคนก่อนที่เกมจะสามารถเดินหน้าต่อไปได้ ตัวอย่าง:
ผู้เล่น A ได้รับความเสียหายจากดาบ ในการตอบสนองต่อสิ่งนี้เกราะของ A จะเข้ามาและลดความเสียหายที่ได้รับ ความเร็วในการเคลื่อนที่ของ A นั้นลดลงด้วยเช่นกันเนื่องจากความอ่อนแอ
- ความเสียหายที่ได้รับนั้นเป็นสิ่งที่ทำให้เกิดปฏิสัมพันธ์ทั้งหมด
- เกราะจะต้องคำนวณและนำไปใช้กับความเสียหายที่เข้ามาก่อนที่ความเสียหายจะถูกนำไปใช้กับผู้เล่น
- การลดความเร็วในการเคลื่อนที่ไม่สามารถใช้กับยูนิตได้จนกว่าจะได้รับความเสียหายจริง ๆ แล้วเนื่องจากมันขึ้นอยู่กับจำนวนดาเมจสุดท้าย
เหตุการณ์ยังสามารถทริกเกอร์เหตุการณ์อื่น ๆ การลดความเสียหายของดาบโดยใช้เกราะสามารถทำให้ดาบแตก (ต้องเกิดขึ้นก่อนที่การลดความเสียหายจะเสร็จสิ้น) ซึ่งจะทำให้เกิดเหตุการณ์เพิ่มเติมในการตอบสนองต่อมัน
สรุปทั้งหมดนี้ดูเหมือนจะนำไปสู่ปัญหาเล็กน้อย:
- วงจรการประมวลผลที่สูญเปล่ามากมาย: ระบบส่วนใหญ่ (บันทึกสำหรับสิ่งต่าง ๆ ที่ทำงานอยู่ตลอดเวลาเช่นการเรนเดอร์) ก็ไม่มีอะไรคุ้มค่าที่จะทำเมื่อมันไม่ใช่ "การเลี้ยว" ในการทำงานและใช้เวลาส่วนใหญ่รอเกม สถานะการทำงานที่ถูกต้อง litters นี้ทุกระบบดังกล่าวด้วยการตรวจสอบที่มีการเติบโตในขนาดที่รัฐเพิ่มเติมจะถูกเพิ่มเข้าไปในเกม
- ในการตรวจสอบว่าระบบสามารถประมวลผลเอนทิตีที่มีอยู่ในเกมได้หรือไม่พวกเขาต้องการวิธีในการตรวจสอบสถานะเอนทิตี / ระบบอื่น ๆ ที่ไม่เกี่ยวข้อง (ระบบที่รับผิดชอบในการจัดการความเสียหายจำเป็นต้องรู้ว่ามีการใช้เกราะหรือไม่) นี่อาจทำให้ระบบยุ่งเหยิงด้วยความรับผิดชอบหลายอย่างหรือสร้างความต้องการระบบเพิ่มเติมโดยไม่มีจุดประสงค์อื่น แต่เพื่อสแกนคอลเล็กชั่นเอนทิตีหลังจากแต่ละรอบการประมวลผลและสื่อสารกับกลุ่มผู้ฟังโดยบอกพวกเขาเมื่อมันไม่เป็นไร
จุดสองจุดด้านบนสมมติว่าระบบทำงานบนเอนทิตีชุดเดียวกันซึ่งจบลงด้วยการเปลี่ยนสถานะโดยใช้แฟล็กในส่วนประกอบ
อีกวิธีในการแก้ปัญหาก็คือการเพิ่ม / ลบส่วนประกอบ (หรือสร้างเอนทิตีใหม่ทั้งหมด) อันเป็นผลมาจากระบบเดียวที่ทำงานเพื่อความคืบหน้าของเกม ซึ่งหมายความว่าเมื่อใดก็ตามที่ระบบมีเอนทิตีที่ตรงกันจริง ๆ แล้วมันรู้ว่ามันได้รับอนุญาตให้ประมวลผล
อย่างไรก็ตามสิ่งนี้ทำให้ระบบมีความรับผิดชอบในการเรียกระบบที่ตามมาทำให้มันยากที่จะให้เหตุผลเกี่ยวกับพฤติกรรมของโปรแกรมเนื่องจากข้อบกพร่องจะไม่ปรากฏขึ้นเป็นผลมาจากการมีปฏิสัมพันธ์ของระบบเดียว การเพิ่มระบบใหม่ก็ยากขึ้นเนื่องจากพวกเขาไม่สามารถใช้งานได้โดยไม่ทราบว่าระบบเหล่านั้นส่งผลกระทบต่อระบบอื่นอย่างไร (และระบบก่อนหน้านี้อาจต้องมีการแก้ไขเพื่อกระตุ้นสถานะที่ระบบใหม่สนใจ) กรุณาเอาชนะวัตถุประสงค์ของการมีระบบแยกต่างหาก ด้วยภารกิจเดียว
นี่เป็นสิ่งที่ฉันจะต้องอยู่ด้วยใช่ไหม ตัวอย่าง ECS เดียวที่ฉันได้เห็นนั้นเป็นแบบเรียลไทม์และเป็นเรื่องง่ายมากที่จะเห็นว่าการทำซ้ำแบบวนซ้ำต่อเกมในกรณีนี้เป็นอย่างไร และฉันก็ยังต้องการมันในการเรนเดอร์มันดูเหมือนว่าไม่เหมาะสำหรับระบบที่หยุดแง่มุมส่วนใหญ่ของตัวเองทุกครั้งที่มีอะไรเกิดขึ้น
มีรูปแบบการออกแบบบางอย่างสำหรับการย้ายสถานะเกมไปข้างหน้าที่เหมาะกับสิ่งนี้หรือฉันควรจะย้ายตรรกะทั้งหมดออกจากลูปและเรียกใช้เมื่อจำเป็นเท่านั้น?