คำถามติดแท็ก entity-system

กระบวนทัศน์การเขียนโปรแกรมที่ gameobjects (เอนทิตี) ประกอบด้วยองค์ประกอบและดำเนินการโดยระบบ แต่ละเอนทิตีคือ ID ที่ชี้ไปยังส่วนประกอบเฉพาะ

4
เอ็นจิ้นเกมที่มีการสร้าง / จัดการเอนทิตี Lua ที่ดี [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ฉันกำลังมองหาเอ็นจิ้นที่สร้างเอนทิตี้ของมันโดยใช้ Lua หรือภาษาสคริปต์อื่น ๆ นี่คือเพื่อหาแรงบันดาลใจและทำในเครื่องยนต์ของฉันเองเช่นกัน ฉันรู้ว่า CryEngine ใช้ Lua เพื่อสร้างเอนทิตี้ของพวกเขา แต่ฉันอยากรู้ว่ามีทางเลือกอื่นที่ฉันสามารถค้นหาได้หรือไม่ ขอบคุณ!

4
ระบบและการแสดงผล
Okey สิ่งที่ฉันรู้จนถึงตอนนี้; เอนทิตีประกอบด้วยส่วนประกอบ (data-storage) ซึ่งเก็บข้อมูลเช่น; - พื้นผิว / สไปรต์ - Shader - ฯลฯ จากนั้นฉันก็มีระบบตัวแสดงภาพที่วาดทั้งหมดนี้ แต่สิ่งที่ฉันไม่เข้าใจก็คือการออกแบบโหมดแสดงภาพควรเป็นอย่างไร ฉันควรมีองค์ประกอบหนึ่งรายการสำหรับ "ประเภทภาพ" แต่ละรายการหรือไม่ องค์ประกอบหนึ่งที่ไม่มี shader หนึ่งชิ้นที่มี shader เป็นต้น เพียงแค่ต้องป้อนข้อมูลบางอย่างใน "วิธีที่ถูกต้อง" เพื่อทำสิ่งนี้ เคล็ดลับและข้อผิดพลาดที่ต้องระวัง

2
วิธีจัดโครงสร้างสถานะเกมในระบบที่ยึดเอนทิตี / ส่วนประกอบ
ฉันทำเกมที่ออกแบบมาพร้อมกับกระบวนทัศน์นิติบุคคลองค์ประกอบว่าระบบที่ใช้ในการติดต่อสื่อสารระหว่างส่วนประกอบตามที่อธิบายไว้ที่นี่ ฉันได้มาถึงจุดในการพัฒนาของฉันที่ฉันต้องเพิ่มรัฐเกม (เช่นหยุดเล่นระดับเริ่มต้นรอบเริ่มเกมมากกว่า ฯลฯ ) แต่ฉันไม่แน่ใจว่าจะทำอย่างไรกับกรอบของฉัน ฉันได้ดูตัวอย่างโค้ดนี้ในสถานะเกมที่ทุกคนดูเหมือนจะอ้างอิง แต่ฉันคิดว่ามันไม่เหมาะกับกรอบงานของฉัน ดูเหมือนว่าแต่ละรัฐจัดการรูปวาดของตนเองและปรับปรุง เฟรมเวิร์กของฉันมี SystemManager ที่จัดการการอัพเดตทั้งหมดโดยใช้ระบบ ตัวอย่างเช่นนี่คือคลาส RenderingSystem ของฉัน: public class RenderingSystem extends GameSystem { private GameView gameView_; /** * Constructor * Creates a new RenderingSystem. * @param gameManager The game manager. Used to get the game components. */ public RenderingSystem(GameManager gameManager) { super(gameManager); …

1
วิธีแคชทรัพยากรในระบบการแสดงผล homebrew ของฉัน
พื้นหลัง: ฉันกำลังออกแบบระบบการเรนเดอร์ 3D แบบง่ายสำหรับสถาปัตยกรรมชนิดเอนทิตีคอมโพเนนต์โดยใช้ C ++ และ OpenGL ระบบประกอบด้วย renderer และกราฟฉาก เมื่อฉันเสร็จสิ้นการทำซ้ำครั้งแรกของโหมดแสดงภาพฉันอาจกระจายกราฟฉากลงในสถาปัตยกรรม ECS สำหรับตอนนี้มันเป็นตัวยึดตำแหน่งทางเดียวหรืออื่น หากเป็นไปได้ต่อไปนี้เป็นเป้าหมายของฉันสำหรับผู้สร้างภาพ: ความง่าย นี่เป็นโครงการวิจัยและฉันต้องการที่จะสามารถเปลี่ยนแปลงและขยายระบบของฉันได้อย่างง่ายดาย (ด้วยวิธีการของ ECS) การปฏิบัติ ฉากของฉันอาจมีนางแบบขนาดเล็กจำนวนมากและยังมีเล่มขนาดใหญ่ที่มีรูปทรงเรขาคณิตมากมาย ไม่สามารถรับวัตถุจากบริบท OGL และเรขาคณิตบัฟเฟอร์ทุกเฟรมการเรนเดอร์ ฉันตั้งเป้าหมายในการหาที่ตั้งของข้อมูลเพื่อหลีกเลี่ยงการพลาดแคช มีความยืดหยุ่น มันจะต้องสามารถแสดงสไปรต์โมเดลและโวลุ่ม (voxels) แยกออก กราฟฉากอาจถูก refactored ลงในสถาปัตยกรรมหลักของ ECS หลังจากที่ฉันเขียน renderer ของฉัน modular เป็นเรื่องดีที่สามารถสลับในโหมดแสดงภาพที่ต่างกันได้โดยไม่ต้องเปลี่ยนกราฟฉากของฉัน ความโปร่งใสอ้างอิงซึ่งหมายความว่า ณ เวลาใด ๆ ฉันสามารถให้มันถูกต้องฉากใด ๆ และมันจะทำให้ภาพเดียวกันสำหรับฉากนั้น โดยเฉพาะอย่างยิ่งเป้าหมายนี้ไม่จำเป็นต้องมี ฉันคิดว่ามันจะช่วยทำให้การจัดลำดับฉากเป็นเรื่องง่ายขึ้น (ฉันจะต้องสามารถบันทึกและโหลดฉาก) และให้ความยืดหยุ่นในการสลับฉากต่าง ๆ …

1
ใครจะจัดเก็บข้อมูลบริบททั่วโลกในระบบส่วนประกอบนิติบุคคล?
คำถามของฉันคือ: วิธีหนึ่งจะเก็บข้อมูลบริบททั่วโลกเช่น ข้อมูลข้อมูลโลกเวลาโลกปัจจุบัน ฯลฯ ในระบบองค์ประกอบเอนทิตี ฉันคิดว่าจะทำงานเพื่อสร้างเกมจำลองสถานการณ์แบบเปิดของ Dwarf Fortress สไตล์โลกใน C ++ ฉันได้สร้างเอ็นจิ้นเกมสไตล์เอนทิตีเพื่อความสนุกและตอนนี้ฉันกำลังพยายามหาวิธีที่ฉันจะทำงานในคุณสมบัติทั้งหมดที่ฉันต้องการ นอกเหนือจากการเล่นเกมมาตรฐาน (การเรนเดอร์ฟิสิกส์ข้อมูลส่วนประกอบเฉพาะเอนทิตี ฯลฯ ) แล้วฉันยังต้องการมีข้อมูลบริบทระดับโลกที่ระบบที่เกี่ยวข้องทั้งหมดสามารถเข้าถึงได้ (เช่นข้อมูลโลกเช่นปีปัจจุบัน ไม่ว่าจะเกิดภาวะโลกร้อนหรืออะไรก็ตามที่เกี่ยวข้องกับการจำลองโลก) เดิมทีฉันเคยคิดที่จะสร้างองค์ประกอบ "โลก" แต่มันดูไร้จุดหมายและยากหากระบบต่าง ๆ มากมายต้องการเข้าถึงข้อมูล "ทั่วโลก" อย่างมีเหตุผล มันจะสมเหตุสมผลไหมที่จะมีองค์ประกอบ "โลก" หรือฉันควรเก็บข้อมูลนี้ด้วยวิธีอื่น? ฉันยังคิดที่จะทำให้ข้อมูลนี้เป็นสากลดังนั้นจึงให้การเข้าถึงระบบใด ๆ ที่ต้องการใช้งาน ดูเหมือนเป็นการละเมิดหลักการองค์ประกอบเอนทิตี้โดยทั่วไปและอาจยุ่งเหยิงด้วยเหตุผลอื่น แต่ฉันคิดว่ามันอาจใช้งานได้จริง สิ่งอื่นที่ฉันคิดว่าน่าจะฝังข้อมูลบริบทโลกที่เกี่ยวข้องลงในระบบโดยตรง ตัวอย่างเช่นถ้าฉันมีAgeSystem"อายุ" เอนทิตีทั้งหมดที่มีgetsWeakerAsTimePassesส่วนประกอบหรืออะไรก็ตามบางทีระบบนี้อาจเก็บข้อมูลเวลาที่เกี่ยวข้องสำหรับโลกโดยตรงเป็นข้อมูลสมาชิกที่จะใช้ในการคำนวณเวลาที่ผ่านไปและจำนวนเท่าใด อายุและความอ่อนแอของผู้คน ฯลฯ ตัวเลือกที่สามนี้เป็นสิ่งที่ฉันชอบน้อยที่สุด แต่สิ่งที่เกิดขึ้นกับฉันในการระดมสมอง มีใครให้คำแนะนำได้บ้าง

4
การระบุ 'ประเภท' ของเอนทิตีในระบบส่วนประกอบ - เอนทิตี
หากเอนทิตีไม่มี 'ประเภท' ชัดเจน (เช่นผู้เล่น) และเป็นเพียงชุดของส่วนประกอบฉันจะระบุเอนทิตีที่ระบบของฉันควรและไม่ควรทำงานได้อย่างไร ตัวอย่างเช่นในเกมของพงษ์พายและลูกทั้งคู่ชนกับขอบเขตของหน้าต่าง อย่างไรก็ตามระบบการจัดการการชนของแต่ละระบบจะแตกต่างกันดังนั้นระบบไม่ควรจัดการเอนทิตีที่มีชนิดผิด void PlayerCollisionSystem::update(std::vector<Entity *> entities) { typedef std::vector<Entity *>::iterator EIter; for (EIter i = entities.begin(); i != entities.end(); ++i) { Entity *player = *i; // How do I verify that the entity is a player? // Get relevant components. PositionComponent *position = player->getComponent<PositionComponent>(); VelocityComponent …

3
จะหลีกเลี่ยง“ Blob-Systems” ในระบบองค์ประกอบของเอนทิตี้ได้อย่างไร?
ขณะนี้ฉันกำลังประสบปัญหาต่อไปนี้: ฉันพยายามเขียน pong clone โดยใช้ระบบ component component (ECS) ฉันเขียน "กรอบงาน" ทั้งหมดด้วยตัวเอง ดังนั้นจึงมีคลาสที่จัดการเอนทิตีกับส่วนประกอบทั้งหมด จากนั้นจะมีคลาสคอมโพเนนต์เอง และสุดท้ายก็มีระบบของฉันที่เพิ่งได้รับเอนทิตีทั้งหมดที่มีส่วนประกอบที่ระบบต้องการ ตัวอย่างเช่นระบบการเคลื่อนไหวของฉันค้นหาหน่วยงานทั้งหมดที่มีองค์ประกอบตำแหน่งและส่วนประกอบการเคลื่อนไหว องค์ประกอบตำแหน่งเพียงแค่ดำรงตำแหน่งและองค์ประกอบการเคลื่อนไหวจะเก็บความเร็ว แต่ปัญหาที่แท้จริงคือระบบการชนของฉัน ชั้นนี้เป็นเหมือนหยดตรรกะ ฉันมีคดีพิเศษมากมายในชั้นนี้ ตัวอย่างเช่น: พายของฉันสามารถชนกับเส้นขอบได้ หากสิ่งนี้เกิดขึ้นความเร็วของพวกเขาจะถูกตั้งค่าเป็นศูนย์ ลูกของฉันสามารถชนกับเส้นเขตแดนได้เช่นกัน แต่ในกรณีนี้ความเร็วของมันจะถูกสะท้อนกลับตามปกติของเส้นขอบดังนั้นมันจึงสะท้อนออกมา เมื่อต้องการทำสิ่งนี้ฉันได้ให้องค์ประกอบฟิสิกส์พิเศษแก่ลูกบอลซึ่งเพิ่งบอกว่า: "เฮ้สิ่งนี้ไม่หยุดเลยมันสะท้อน" ดังนั้นองค์ประกอบทางฟิสิกส์ไม่มีข้อมูลจริง มันเป็นคลาสที่ว่างเปล่าซึ่งมีเพียงเพื่อบอกระบบว่าวัตถุสะท้อนหรือหยุด จากนั้นก็มาที่นี่: ฉันต้องการที่จะทำให้อนุภาคบางอย่างเมื่อลูกชนกับไม้พายหรือเส้นขอบ ดังนั้นฉันคิดว่าลูกบอลจะต้องมีส่วนประกอบอื่นที่บอกระบบการชนเพื่อสร้างอนุภาคในการชน จากนั้นฉันต้องการมี ups พลังงานซึ่งสามารถชนกับไม้พายได้ แต่ไม่ใช่กับเส้นขอบ หากเกิดเหตุการณ์เช่นนี้การเพิ่มพลังจะต้องหายไป ดังนั้นฉันจึงต้องการเคสและส่วนประกอบมากขึ้น (เพื่อบอกระบบว่าบางหน่วยงานสามารถชนกับคนอื่น ๆ ได้บางคนบอทไม่ได้อยู่ด้วยแม้ว่าคนอื่น ๆ จะสามารถชนกันได้จริง ๆ และระบบชนก็ต้องใช้พลังงาน -ups ไม้พายเป็นต้นและอื่น ๆ ) ฉันเห็นว่าระบบองค์ประกอบของเอนทิตีเป็นสิ่งที่ดีเพราะมีความยืดหยุ่นและคุณไม่มีปัญหาเกี่ยวกับการสืบทอด แต่ตอนนี้ฉันติดอยู่ทั้งหมด …

3
จะอัพเดทสถานะเอนทิตีและแอนิเมชั่นในเกมที่อิงองค์ประกอบได้อย่างไร
ฉันกำลังพยายามออกแบบระบบเอนทิตีที่อิงองค์ประกอบเพื่อการเรียนรู้ (และใช้ในภายหลังในบางเกม) และฉันมีปัญหาบางอย่างเมื่อต้องอัพเดตสถานะเอนทิตี ฉันไม่ต้องการให้มีการอัปเดตวิธี () ภายในคอมโพเนนต์เพื่อป้องกันการพึ่งพาระหว่างคอมโพเนนต์ สิ่งที่ฉันมีอยู่ในใจในขณะนี้คือส่วนประกอบเก็บข้อมูลและส่วนประกอบการปรับปรุงระบบ ดังนั้นถ้าฉันมีเกม 2D ง่าย ๆ ที่มีบางหน่วยงาน (เช่นผู้เล่น, ศัตรู 1, ศัตรู 2) ที่มีองค์ประกอบการแปลง, การเคลื่อนไหว, สถานะ, ภาพเคลื่อนไหวและการแสดงผลฉันคิดว่าฉันควรจะมี: MovementSystem ที่จะทำการเคลื่อนย้ายส่วนประกอบการเคลื่อนไหวทั้งหมดและอัพเดทส่วนประกอบของรัฐ และ RenderSystem ที่อัพเดทองค์ประกอบภาพเคลื่อนไหว (องค์ประกอบภาพเคลื่อนไหวควรมีภาพเคลื่อนไหวหนึ่งภาพ (เช่นชุดของเฟรม / พื้นผิว) สำหรับแต่ละรัฐและอัปเดตหมายถึงการเลือกภาพเคลื่อนไหวที่สอดคล้องกับสถานะปัจจุบัน (เช่นการกระโดด, moving_left ฯลฯ ) และ อัปเดตดัชนีเฟรม) จากนั้น RenderSystem จะอัปเดตส่วนประกอบ Render ด้วยพื้นผิวที่สอดคล้องกับเฟรมปัจจุบันของ Animation ของแต่ละกิจการและแสดงทุกอย่างบนหน้าจอ ฉันเห็นการใช้งานบางอย่างเช่นกรอบงานของ Artemis แต่ฉันไม่รู้วิธีแก้ปัญหานี้: สมมติว่าเกมของฉันมีเอนทิตีต่อไปนี้ แต่ละเอนทิตีมีชุดสถานะและภาพเคลื่อนไหวหนึ่งรายการสำหรับแต่ละสถานะ: ผู้เล่น: …

3
ระบบเอนทิตีส่วนประกอบ - อัปเดตและคำสั่งโทร
เพื่อให้ส่วนประกอบสามารถอัปเดตทุกเฟรม (และปล่อยให้ฟังก์ชันนี้ออกจากส่วนประกอบที่ไม่จำเป็นต้องใช้) ฉันมีแนวคิดที่จะสร้างคอมโพเนนต์ UpdateComponent ส่วนประกอบอื่น ๆ เช่นMovableComponent(ซึ่งมีความเร็ว) จะสืบทอดมาจากIUpdatableคลาสนามธรรม กองกำลังนี้MovableComponentจะใช้Update(gametime dt)วิธีการและอื่น ๆRegisterWithUpdater()ที่จะช่วยให้ชี้ไปUpdateComponent MovableComponentส่วนประกอบจำนวนมากสามารถทำสิ่งนี้ได้และUpdateComponentสามารถเรียกใช้Update(gametime dt)วิธีการทั้งหมดได้โดยไม่ต้องสนใจว่าเขาเป็นใครหรืออะไร คำถามของฉันคือ: สิ่งนี้ดูเหมือนจะเป็นสิ่งที่ปกติหรือเคยถูกใช้โดยทุกคนหรือไม่ ฉันไม่พบสิ่งใดในหัวข้อ ฉันจะรักษาคำสั่งซื้อส่วนประกอบเช่นฟิสิกส์แล้วเปลี่ยนตำแหน่งได้อย่างไร มันจำเป็นหรือไม่ มีวิธีอื่นใดในการประกันว่าส่วนประกอบที่ควรประมวลผลทุกเฟรมกำลังดำเนินการในความเป็นจริง แก้ไข ฉันคิดว่าฉันจะให้ความสำคัญกับรายการประเภทที่สามารถอัปเดตได้ จากนั้นองค์ประกอบทั้งหมดของประเภทนั้นสามารถอัปเดตได้มากกว่าการจัดการมันต่อเอนทิตี (ซึ่งเป็นเพียงดัชนีในระบบของฉัน) ยังคง คำถามของฉันยังคงใช้ได้สำหรับฉัน ฉันไม่รู้ว่านี่เป็นเหตุผล / ปกติหรือสิ่งที่คนอื่นมักจะทำ นอกจากนี้ผู้คนที่อินซอมเนียก็ยอดเยี่ยมมาก! / แก้ไข ตัวอย่างโค้ดก่อนหน้านี้: class IUpdatable { public: virtual void Update(float dt) = 0; protected: virtual void RegisterAsUpdatable() = 0; }; class …

3
การสร้างเอนทิตีเป็นการรวมตัว
ฉันเพิ่งถามเกี่ยวกับวิธีแยกเอนทิตีออกจากพฤติกรรมและคำตอบหลักที่เชื่อมโยงกับบทความนี้: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ แนวคิดขั้นสุดยอดที่เขียนเกี่ยวกับที่นี่คือ: วัตถุประสงค์ในการรวมบริสุทธิ์ ฉันสงสัยว่าฉันจะทำอย่างไรเพื่อสร้างเอนทิตีเกมเป็นการรวมที่บริสุทธิ์โดยใช้ C # ฉันยังไม่เข้าใจแนวคิดเกี่ยวกับวิธีการทำงานนี้ (บางทีเอนทิตีเป็นอาร์เรย์ของวัตถุที่ใช้อินเทอร์เฟซหรือชนิดฐานที่แน่นอน?) ความคิดปัจจุบันของฉันยังคงเกี่ยวข้องกับการมีคลาสที่เป็นรูปธรรมสำหรับแต่ละประเภทเอนทิตีที่ใช้อินเทอร์เฟซที่เกี่ยวข้อง (IMoveable, ICollectable, ISpeakable และอื่น ๆ ) ฉันจะดำเนินการเกี่ยวกับการสร้างเอนทิตี้อย่างเดียวเป็นการรวมตัวโดยไม่ต้องมีรูปธรรมใด ๆ สำหรับเอนทิตีนั้น

2
การสืบทอดหลายอย่างไม่สามารถแก้ปัญหาทั้งหมดที่ระบบเอนทิตี้ทำได้หรือไม่
คำถามคือการอธิบายตัวเองค่อนข้างสวย: การสืบทอดหลายอย่างไม่สามารถแก้ปัญหาทั้งหมดที่ระบบนิติบุคคลแก้ได้หรือไม่ ฉันจำคำศัพท์ที่เรียกว่า "การสืบทอดหลายอย่าง" และดูเหมือนจะแก้ปัญหาท้องอืดได้มากมายที่การสืบทอดแบบดั้งเดิมกำหนดขึ้น

2
ฉันจะสนับสนุนการสื่อสารระหว่างส่วนประกอบกับวัตถุได้อย่างปลอดภัยและด้วยการจัดเก็บส่วนประกอบที่เป็นมิตรกับแคชได้อย่างไร?
ฉันกำลังสร้างเกมที่ใช้วัตถุเกมตามองค์ประกอบและฉันมีเวลายากที่จะใช้วิธีการสำหรับแต่ละองค์ประกอบในการสื่อสารกับวัตถุเกม แทนที่จะอธิบายทุกอย่างพร้อมกันฉันจะอธิบายแต่ละส่วนของโค้ดตัวอย่างที่เกี่ยวข้อง: class GameObjectManager { public: //Updates all the game objects void update(Time dt); //Sends a message to all game objects void sendMessage(Message m); private: //Vector of all the game objects std::vector<GameObject> gameObjects; //vectors of the different types of components std::vector<InputComponent> input; std::vector<PhysicsComponent> ai; ... std::vector<RenderComponent> render; } การGameObjectManagerเก็บวัตถุเกมทั้งหมดและส่วนประกอบของพวกเขา นอกจากนี้ยังรับผิดชอบในการปรับปรุงวัตถุของเกม …

1
การออกแบบตามส่วนประกอบ / เอนทิตี + พฤติกรรมต้นไม้ => วิธีการรวม?
สำหรับโครงการปัจจุบันของฉันฉันดำเนินการองค์ประกอบระบบ / นิติบุคคลตามพื้นต่อไปมากที่สุดของการปฏิบัติที่ดีที่สุดที่มีอยู่ในนี้พื้นที่ค่อนข้างไม่ได้กำหนด ดังนั้นฉันจึงได้ (ขยายออกไปเล็กน้อย) เอนทิตีซึ่งโดยทั่วไปแล้วจะเป็นintID, ชื่อที่มนุษย์อ่านได้, std::mapของคอมโพเนนต์และlong"ตัวบ่งชี้ประเภท" ซึ่งใช้เพื่อแสดงองค์ประกอบที่มีอยู่ (ฉันมีพลังสองenumสำหรับองค์ประกอบทั้งหมด ประเภทและเมื่อใดก็ตามที่มีการเพิ่มองค์ประกอบลงในเอนทิตีฉันจะแก้ไขความยาวนั้นโดยอัตโนมัติผ่านการดำเนินการระดับบิตเปรียบเทียบคำตอบนี้ ) จากนั้นมีส่วนประกอบซึ่งค่อนข้างง่าย: intID enumเป็นประเภทส่วนประกอบตัวชี้ Entity หลักและstd::mapคุณสมบัติทั้งหมดที่มีอยู่ในคอมโพเนนต์นี้ ในที่สุดระบบ / ผู้จัดการที่จัดการกับการประมวลผลเชิงตรรกะ พวกเขาตรวจสอบก่อนว่า Entity ที่ประมวลผลในปัจจุบันมีการจับคู่long"type indicator" = ส่วนประกอบที่จำเป็นทั้งหมดสำหรับระบบนั้นมีอยู่หรือไม่ จากนั้นจะเข้าถึงคุณสมบัติบางอย่างถ้าจำเป็นและเรียกใช้ฟังก์ชันบางอย่างโดยตรงในองค์ประกอบที่เกี่ยวข้องหรือส่งข้อความบางอย่าง (ผ่านตัวแจกจ่ายข้อความ) Bottom-line:จนกระทั่งถึงที่นี่เป็นส่วนประกอบที่ขับเคลื่อนด้วยเหตุการณ์ / ระบบเอนทิตีที่เป็นมาตรฐานมากกว่ารวมกับวิธีการที่ขับเคลื่อนด้วยข้อมูล (เปรียบเทียบส่วนประกอบไม่ได้มีตัวแปรข้อมูลที่มีรหัสตายตัว แต่เป็นแผนที่ทั่วไปแทน (บางส่วน) / archetypes ของส่วนประกอบจะถูกอ่านจากไฟล์ที่มีตัวเลือกในการเพิ่มข้อมูลเพิ่มเติมซึ่งไม่ได้เป็นส่วนหนึ่งของรหัสส่วนประกอบจริง ตอนนี้ฉันอยากจะแนะนำBehavior Trees (อิงจากAiGameDev BTSK ) ในโครงการนั้น แต่ฉันไม่แน่ใจว่าควรเชื่อมโยงกับส่วนประกอบที่มีอยู่แล้วหรือไม่หรือจะรวมการออกแบบเหล่านั้นเข้าด้วยกันอย่างไร แนวคิด / คะแนน / คำถามที่เกี่ยวข้องหลายประการอยู่ในใจ: BT …

2
หลายแหล่งที่มาของการเคลื่อนไหวในระบบเอนทิตี
ฉันค่อนข้างใหม่กับแนวคิดของระบบเอนทิตีที่ได้อ่านสิ่งต่าง ๆ (ส่วนใหญ่เป็นประโยชน์บล็อกที่ยอดเยี่ยมนี้และคำตอบนี้ ) แม้ว่าฉันจะมีปัญหาเล็กน้อยในการทำความเข้าใจว่าบางสิ่งง่าย ๆ เช่นเดียวกับที่สามารถจัดการตำแหน่งของวัตถุด้วยแหล่งที่มาที่ไม่ได้กำหนดจำนวนมาก นั่นคือฉันมีหน่วยงานของฉันซึ่งมีองค์ประกอบตำแหน่ง ฉันมีเหตุการณ์บางอย่างในเกมที่บอกเอนทิตีนี้ให้ย้ายระยะทางที่กำหนดในเวลาที่กำหนด เหตุการณ์เหล่านี้สามารถเกิดขึ้นได้ตลอดเวลาและจะมีค่าแตกต่างกันสำหรับตำแหน่งและเวลา ผลก็คือพวกเขาจะรวมกัน ในโซลูชัน OO แบบดั้งเดิมฉันมีMoveByคลาสบางประเภทที่มีระยะทาง / เวลาและอาเรย์ของผู้ที่อยู่ในคลาสอ็อบเจ็กต์เกมของฉัน แต่ละเฟรมฉันจะวนซ้ำทั้งหมดMoveByและนำไปใช้กับตำแหน่ง หาก a MoveByถึงเวลาสิ้นสุดแล้วให้ลบออกจากอาร์เรย์ ด้วยระบบเอนทิตี้ฉันสับสนนิดหน่อยว่าฉันควรทำซ้ำพฤติกรรมแบบนี้อย่างไร หากมีเพียงหนึ่งในเหล่านี้ในแต่ละครั้งแทนที่จะสามารถรวมพวกเขาเข้าด้วยกันมันก็จะค่อนข้างตรงไปตรงมา (ฉันเชื่อ) และมีลักษณะเช่นนี้: PositionComponent มี x, y MoveByComponent มี x, y, time Entityซึ่งมีทั้งPositionComponentและMoveByComponent MoveBySystemที่รูปลักษณ์สำหรับนิติบุคคลที่มีทั้งส่วนประกอบเหล่านี้และเพิ่มมูลค่าของไปMoveByComponent PositionComponentเมื่อtimeถึงมันจะลบองค์ประกอบจากเอนทิตีนั้น ฉันสับสนเล็กน้อยว่าฉันจะทำสิ่งเดียวกันได้อย่างไรด้วยการเคลื่อนไหวหลายอย่างด้วยกัน ความคิดเริ่มต้นของฉันคือฉันจะมี: PositionComponent, MoveByComponentเช่นเดียวกับข้างต้น MoveByCollectionComponentซึ่งมีอาร์เรย์ของMoveByComponents MoveByCollectionSystemที่มองหาเอนทิตีที่มีPositionComponentและ a MoveByCollectionComponent, วนซ้ำMoveByComponents ข้างในนั้น, ใช้ / ลบตามความจำเป็น ฉันเดาว่านี่เป็นปัญหาทั่วไปมากขึ้นของการมีองค์ประกอบเดียวกันจำนวนมากและต้องการให้ระบบที่เกี่ยวข้องดำเนินการกับแต่ละองค์ประกอบ …

3
เอ็นจิ้นที่ใช้ระบบเอ็นติตี้คอมโพเนนต์
หมายเหตุ: ฉันกำลังเขียนโปรแกรมนี้ใน Javascript แต่ควรเป็นภาษาที่ไม่เชื่อเรื่องพระเจ้าส่วนใหญ่ ฉันกำลังคิดที่จะเปลี่ยนเอนจินของฉันให้เป็น ECS ฉันได้รับแนวคิดพื้นฐาน ( หมายเหตุ: นี่ผิดโปรดดูคำตอบของฉัน ): หน่วยงานเป็นวัตถุเกม คอมโพเนนต์คือบิตของฟังก์ชัน ( reactToInput()) หรือสถานะ ( position) ซึ่งสามารถรับ "ติดกาว" กับเอนทิตี ระบบมีรายการเอนทิตีที่จัดการและอัปเดต แต่ฉันไม่แน่ใจว่าจะได้รับการใช้งานและรายละเอียดบางอย่าง ... คำถาม: ระบบสามารถทำงานกับเอนทิตีประเภทต่าง ๆ ได้หรือไม่? ฉันมักจะให้ตัวอย่างของคลาสที่เรียกSceneในเครื่องยนต์ของฉันและมันจะให้บริการตามวัตถุประสงค์นี้ทันทีเช่นกัน ฉากหนึ่งเป็นคอนเทนเนอร์ของวัตถุทั้งหมดที่สามารถแสดงผลอัปเดตส่งผลกระทบต่อการเรนเดอร์ (ไฟ) และบางทีในอนาคตแม้กระทั่ง2DSoundEmitterวัตถุ มีอินเทอร์เฟซระดับสูงเพื่อให้ผู้ใช้ไม่จำเป็นต้องกังวลเกี่ยวกับประเภทของวัตถุที่เขามีอยู่scene.add()และสิ่งต่าง ๆ ทั้งหมดนั้น ฉันตระหนักว่าSceneอาจเป็นระบบ ใช้เวลาในเอนทิตีจัดเก็บและจากนั้นสามารถเรียกวิธีการอัพเดตของพวกเขาและอาจทำการเปลี่ยนแปลงสถานะบางอย่าง แต่มีปัญหา: ตามที่ฉันได้อธิบายไว้ข้างต้นแล้วมันSceneสามารถเลี้ยงวัตถุประเภทต่าง ๆ ได้ ! ฉันควรทำอย่างไรในสถานการณ์ที่มีทั้งวัตถุที่สามารถถ่ายภาพได้ ("drawable") และไฟในนั้น ฉันควรจะตรวจสอบเอนทิตีก่อนทำการโต้ตอบหรือไม่ หรือฉันควรจะแก้ปัญหาในระดับที่ต่ำกว่า: สร้างLightSourceส่วนประกอบที่สามารถเพิ่มเข้าไปในวัตถุใด ๆและแสงก็จะเป็นนิติบุคคลที่มีLightSourceและPositionส่วนประกอบ เป็นที่ยอมรับหรือไม่? …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.