คำถามติดแท็ก component-based

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

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 ข้างในนั้น, ใช้ / ลบตามความจำเป็น ฉันเดาว่านี่เป็นปัญหาทั่วไปมากขึ้นของการมีองค์ประกอบเดียวกันจำนวนมากและต้องการให้ระบบที่เกี่ยวข้องดำเนินการกับแต่ละองค์ประกอบ …

2
การเปลี่ยนแปลงสถานะในเอนทิตีหรือส่วนประกอบ
ฉันมีปัญหาในการหาวิธีจัดการกับการจัดการของรัฐในหน่วยงานของฉัน ฉันไม่ได้มีปัญหากับการจัดการสถานะของเกมเช่นหยุดชั่วคราวและเมนูเนื่องจากสิ่งเหล่านี้ไม่ได้รับการจัดการเป็นระบบส่วนประกอบเอนทิตี เพียงแค่มีสถานะในหน่วยงาน / ส่วนประกอบ ภาพวาดจาก Orcs Must Die เป็นตัวอย่างฉันมีตัวหลักและตัวดักของฉันซึ่งมีส่วนประกอบของพวกเขาเช่น PositionComponent, RenderComponent, PhysicsComponent เท่านั้น ในการอัพเดทแต่ละครั้งเอนทิตีจะเรียกการอัพเดทบนส่วนประกอบของมัน ฉันยังมี EventManager สามัญพร้อมฟังสำหรับประเภทเหตุการณ์ที่แตกต่างกัน ตอนนี้ฉันต้องสามารถวางกับดักได้: ก่อนอื่นเลือกตำแหน่งกับดักและกับดักจากนั้นจึงวางกับดัก เมื่อวางกับดักมันควรจะปรากฏขึ้นที่ด้านหน้าของตัวละครหลักที่แสดงในรูปแบบที่แตกต่างกันและติดตามมันไปรอบ ๆ เมื่อวางไว้ก็ควรตอบสนองต่อการชนและแสดงผลตามปกติ สิ่งนี้จัดการได้อย่างไรในระบบที่ใช้ส่วนประกอบเป็นหลัก (ตัวอย่างนี้เป็นแบบเฉพาะ แต่สามารถช่วยหาวิธีทั่วไปในการจัดการกับสถานะเอนทิตี)

3
การออกแบบที่อิงส่วนประกอบ: การจัดการการโต้ตอบกับวัตถุ
ฉันไม่แน่ใจว่าวัตถุทำสิ่งต่าง ๆ อย่างไรกับวัตถุอื่น ๆ ในการออกแบบส่วนประกอบ บอกว่าฉันมีObjชั้นเรียน ฉันทำ: Obj obj; obj.add(new Position()); obj.add(new Physics()); ฉันจะมีวัตถุอื่นได้อย่างไรไม่เพียง แต่เคลื่อนที่ลูกบอล แต่ใช้ฟิสิกส์เหล่านั้น ฉันไม่ได้กำลังมองหารายละเอียดการใช้งาน แต่ค่อนข้างเป็นนามธรรมว่าวัตถุสื่อสารกันอย่างไร ในการออกแบบตามเอนทิตีคุณอาจมี: obj1.emitForceOn(obj2,5.0,0.0,0.0); บทความหรือคำอธิบายใด ๆ เพื่อให้เข้าใจการออกแบบส่วนประกอบได้ดีขึ้นและวิธีการทำสิ่งพื้นฐานจะมีประโยชน์จริง ๆ

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

1
ฉันอยู่ในเส้นทางที่ถูกต้องด้วยสถาปัตยกรรมองค์ประกอบนี้หรือไม่?
ฉันเพิ่งตัดสินใจปรับปรุงสถาปัตยกรรมเกมของฉันเพื่อกำจัดลำดับชั้นของระดับลึกและแทนที่ด้วยองค์ประกอบที่กำหนดค่าได้ ลำดับชั้นแรกที่ฉันกำลังแทนที่คือลำดับชั้นของรายการและฉันต้องการคำแนะนำเพื่อให้ทราบว่าฉันอยู่ในเส้นทางที่ถูกต้องหรือไม่ ก่อนหน้านี้ฉันมีลำดับขั้นที่ทำสิ่งนี้: Item -> Equipment -> Weapon -> Armor -> Accessory -> SyntehsisItem -> BattleUseItem -> HealingItem -> ThrowingItem -> ThrowsAsAttackItem ไม่จำเป็นต้องบอกว่ามันเริ่มยุ่งเหยิงและสิ่งเหล่านี้ไม่ใช่วิธีแก้ปัญหาง่าย ๆ สำหรับรายการที่จำเป็นต้องมีหลายประเภท (เช่นอุปกรณ์บางอย่างใช้ในการสังเคราะห์ไอเท็มอุปกรณ์บางอย่างสามารถโยนได้ ฯลฯ ) จากนั้นฉันพยายาม refactor และวางฟังก์ชันการทำงานลงในคลาสไอเท็มพื้นฐาน แต่ฉันก็สังเกตเห็นว่ารายการนั้นมีข้อมูลที่ไม่ได้ใช้ / ฟุ่มเฟือยจำนวนมาก ตอนนี้ฉันกำลังพยายามทำส่วนประกอบเช่นสถาปัตยกรรมอย่างน้อยก็สำหรับไอเท็มของฉันก่อนที่จะพยายามทำเช่นนั้นกับคลาสเกมอื่น ๆ ของฉัน นี่คือสิ่งที่ฉันกำลังคิดสำหรับการตั้งค่าส่วนประกอบ: ฉันมีคลาสไอเท็มพื้นฐานที่มีสล็อตสำหรับส่วนประกอบต่าง ๆ (เช่นสล็อตคอมโพเนนต์อุปกรณ์สล็อตคอมโพเนนต์การแพทย์ ฯลฯ รวมถึงแผนที่สำหรับคอมโพเนนต์โดยพลการ) ดังนั้นสิ่งนี้: class Item { //Basic item properties …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.