การระบุ 'ประเภท' ของเอนทิตีในระบบส่วนประกอบ - เอนทิตี


10

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

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 *velocity = player->getComponent<VelocityComponent>();
    SpriteComponent *sprite = player->getComponent<SpriteComponent>();

    // Detect and handle player collisions using the components.
  }
}

ทั้งผู้เล่นและลูกแบ่งปันองค์ประกอบที่เกี่ยวข้องประเภทเดียวกันสำหรับการจัดการการชน แต่การใช้ระบบของพวกเขาจะแตกต่างกัน

ถ้าฉันมีคอนเทนเนอร์ของเอนทิตีเกมทั้งหมดฉันจะระบุเอนทิตีประเภทเฉพาะได้อย่างไรโดยไม่สืบทอดEntityหรือรวมถึงตัวแปรสมาชิกเช่นstd::string typeในกรณีนี้เอนทิตีไม่ได้เป็นเพียงการรวบรวมส่วนประกอบอีกต่อไป?

คำตอบ:


21

คำตอบของ Nicol Bolas ตรงไปตรงมา แต่ก้าวไปข้างหน้าและมองปัญหาของคุณจากระยะไกล: คุณไม่ต้องการประเภทของเอนทิตี้

คุณจะต้องดูแลไม่ว่าจะเป็น "ไม่วัตถุที่มีส่วนประกอบX" Xหรือไม่และปัญหาของคุณคือการที่คุณยังไม่ได้ระบุอย่างถูกต้อง หากวัตถุสองตัวทำงานแตกต่างกันจากนั้นให้องค์ประกอบที่แตกต่างกันหรือเพียงแค่วางธงบูลีนบนองค์ประกอบถ้ามันจะทำให้มันทำงานแตกต่างกันสำหรับการกำหนดค่าวัตถุที่แตกต่างกัน ใช้ระบบคอมโพเนนต์เพื่อตัดสินใจเกี่ยวกับพฤติกรรมไม่ใช่เอนทิตี "ประเภท" นั่นคือจุดรวมของการใช้ส่วนประกอบ

คุณได้รับอนุญาตอย่างสมบูรณ์ให้มีPaddlePhysicsส่วนประกอบ / ระบบและBallPhysicsส่วนประกอบ / ระบบแยกต่างหากหากทำงานแตกต่างกัน หรือคุณสามารถแยกส่วนประกอบออกเป็นส่วนย่อย ๆ เช่นที่คุณมีBounceส่วนประกอบที่มีเฉพาะลูกบอลและStopAtBoundaryส่วนประกอบที่ทั้งสองBallและPaddleถ้าส่วนหนึ่งของพฤติกรรมนั้นซับซ้อนพอที่จะพิสูจน์รหัสที่ใช้ร่วมกัน หรือคุณก็สามารถทำให้PongPhysicsองค์ประกอบที่มีธงบูลีนBouncesชุดtrueสำหรับBallและสำหรับfalse Paddleคุณสามารถสร้างWallCollisionส่วนประกอบพื้นฐานจากนั้นรับองค์ประกอบนั้นเพื่อBallWallCollisionเพิ่มพฤติกรรมพิเศษที่จำเป็นในนั้น


4
ฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากไม่มีข้อ จำกัด หรือปัญหากับ "วนิลา" ECS การติดแท็กสามารถทำได้โดยการสร้างส่วนประกอบเฉพาะที่ทำหน้าที่เป็นเครื่องหมาย นอกจากนี้ยังอาจเป็นเพียงแค่ PlayerTypeComponent จำลองที่ไม่ได้ทำอะไรที่มีประโยชน์ แต่เป็นเพียงการแสดงผลเป็นแท็ก
tiguchi

19

ระบบมีประโยชน์ก็ต่อเมื่อมันมีประโยชน์ หากระบบที่เอนทิตีคือ "การรวบรวมส่วนประกอบ" นั้นมีประโยชน์น้อยกว่าระบบที่เอนทิตีส่วนใหญ่เป็น "การรวบรวมส่วนประกอบ" ดังนั้นทำอย่างนั้น

หยุดพยายามทำให้ระบบ "บริสุทธิ์" และมุ่งเน้นการทำดีที่คุณต้องการ ใช้ส่วนประกอบจนกว่าส่วนประกอบจะไม่มีประโยชน์สำหรับคุณอีกต่อไป จากนั้นใช้อย่างอื่น

คุณใช้เวลาคิดเกี่ยวกับสิ่งนี้มากกว่าที่สมควรแล้ว


ดีมาก 1 "คุณได้ใช้จ่ายไปแล้วเวลาคิดเกี่ยวกับเรื่องนี้มากขึ้นกว่าที่มันสมควรได้รับ"
Wes

8
ฉันไม่คิดว่านี่เป็นคำตอบเลยหัวข้อของการปรับแต่ง ECS เป็นสิ่งที่สมควรได้รับความสนใจอย่างมากและ Garee (เมื่อเขาโพสต์สิ่งนี้ในปี 2013) อาจไม่ได้ใช้เวลาพอคิดเกี่ยวกับเรื่องนี้ ความคิดที่ว่าหัวข้อไม่สมควรได้รับเวลามากขึ้นแสดงว่าระบบควรจะง่ายหรือไม่สำคัญและโดยทั่วไปแล้วเราไม่สมควรได้รับเวลา ฉันชอบคำตอบของ Sean Middleditch มากกว่าเพราะมันพยายามตอบคำถามแทนการไม่สนใจมัน
กาวินวิลเลียมส์

คำตอบที่ดี ฉันพบว่าตัวเองต้องพูดกับตัวเองเป็นครั้งคราว มุ่งเน้นการก้าวไปข้างหน้า
Dominic Bou-Samra

5

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

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

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


0

เอนทิตีคือชุดของส่วนประกอบ คุณไม่สามารถกำหนดป้ายกำกับที่เรียบร้อยให้กับชุดสุ่ม การ จำกัด ประเภทให้เป็นราคาสำหรับความยืดหยุ่นที่ดี

แน่นอนคุณสามารถมีคลาสเอนทิตี้พิเศษ (พิมพ์) ซึ่งกำหนดข้อ จำกัด เกี่ยวกับส่วนประกอบ

ส่วนประกอบที่ดีเลิศนั้นมีความเป็นอิสระ ดังนั้นวิธีแก้ไขปัญหาของคุณคือการเรียกการจัดการการชนในแต่ละคอมโพเนนต์ย่อยตามลำดับ ในการใช้งานจริงมีการพึ่งพาซึ่งกันและกันและปัญหาการสั่งซื้อ หากเป็นกรณีนี้คุณต้องใช้ตรรกะ 'ดิสแพตเชอร์' ในทุกวิธีของคลาสเอนทิตี

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