การเปลี่ยนแปลงสถานะในเอนทิตีหรือส่วนประกอบ


9

ฉันมีปัญหาในการหาวิธีจัดการกับการจัดการของรัฐในหน่วยงานของฉัน

ฉันไม่ได้มีปัญหากับการจัดการสถานะของเกมเช่นหยุดชั่วคราวและเมนูเนื่องจากสิ่งเหล่านี้ไม่ได้รับการจัดการเป็นระบบส่วนประกอบเอนทิตี เพียงแค่มีสถานะในหน่วยงาน / ส่วนประกอบ

ภาพวาดจาก Orcs Must Die เป็นตัวอย่างฉันมีตัวหลักและตัวดักของฉันซึ่งมีส่วนประกอบของพวกเขาเช่น PositionComponent, RenderComponent, PhysicsComponent เท่านั้น

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

ตอนนี้ฉันต้องสามารถวางกับดักได้: ก่อนอื่นเลือกตำแหน่งกับดักและกับดักจากนั้นจึงวางกับดัก

เมื่อวางกับดักมันควรจะปรากฏขึ้นที่ด้านหน้าของตัวละครหลักที่แสดงในรูปแบบที่แตกต่างกันและติดตามมันไปรอบ ๆ เมื่อวางไว้ก็ควรตอบสนองต่อการชนและแสดงผลตามปกติ

สิ่งนี้จัดการได้อย่างไรในระบบที่ใช้ส่วนประกอบเป็นหลัก

(ตัวอย่างนี้เป็นแบบเฉพาะ แต่สามารถช่วยหาวิธีทั่วไปในการจัดการกับสถานะเอนทิตี)


1
คุณสามารถเพิ่มและลบส่วนประกอบของเอนทิตีตามกิจกรรมอินพุตได้หรือไม่ บางทีคุณสามารถเปลี่ยนองค์ประกอบของกับดักได้เมื่อสภาวะเปลี่ยนไป ตัวอย่างเช่นในขณะที่วางกับดักมันจะมี FollowComponent และ RenderEffectComponnent เมื่อวางแล้วคุณจะลบทั้งสองคอมโพเนนต์และเพิ่ม CollisionComponent (แก้ไข: แสดงอย่างชัดเจนยิ่งขึ้นโดย Martin Sojka)
Asakeron

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

คำตอบ:


6

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

ตัวอย่างเช่นคุณคุณสามารถสร้างกับดักด้วยBuildControllerComponent(การปกครองการตอบสนองต่อการควบคุมผู้เล่นในการสร้างเฟส) เป็นและPositionComponent RenderComponentอันสุดท้ายมีเขตข้อมูลเดียวที่ควบคุมการใช้พิกเซล shader (s) ที่ใช้และหนึ่งในนั้นให้กับดักเพื่อที่จะสร้างรูปลักษณ์ "ผี" คุณจะสังเกตเห็นว่ายังไม่มีการกำหนดองค์ประกอบทางฟิสิกส์

เมื่อวางกับดักส่วนประกอบจะถูกแลกเปลี่ยน BuildControllerComponentไม่จำเป็นอีกต่อไปดังนั้นมันจะถูกนำออก RenderComponentshaders 's ได้รับการแทนที่ด้วยมุมมองมาตรฐานปกติของคุณจากกับดัก ในที่สุดPhysicsComponentรวมถึงสิ่งอื่นใดที่จำเป็นสำหรับกับดักในการทำงานจะถูกเพิ่มเข้าไปในเอนทิตี

ในวิธีการสืบทอดมรดกสิ่งนี้เทียบเท่ากับการมีคอนสตรัคเตอร์สำหรับActiveTrapEntityคลาสที่รับBuildTimeTrapEntityคลาสเป็นอาร์กิวเมนต์ตัวที่สองถูกใช้เพื่อเรนเดอร์ระหว่างการสร้างมันเป็นอันแรกที่ใช้กับกับดักหลังจากที่มันเข้าแทนที่ .


นี่คือฉลาด
Cypher

1
นี่เป็นกลยุทธ์ที่ดีสำหรับการใช้สถานะของกิจการ ไม่ได้แก้ไขปัญหาของวิธีการติดตามสถานะของแต่ละเอนทิตี คุณจะรู้ได้อย่างไรว่ารัฐเป็นนิติบุคคลในปัจจุบัน?
MichaelHouse

@MartinSojka สิ่งนี้มาใกล้กับสิ่งที่ฉันคิดหลังจากถามคำถาม ฉันกำลังพิจารณาที่จะเพิ่ม BuildTrapProcess (บางสิ่งที่ได้รับการอัพเดตที่ GameLogic) ซึ่งจะจัดการส่วนรันไทม์ของการเปลี่ยนส่วนประกอบเพื่อให้บรรลุการเปลี่ยนแปลงสถานะที่จำเป็นในการสร้างกับดัก เมื่อปุ่มสำหรับสร้างกับดักได้รับการกดตรรกะเกมจะสร้างกระบวนการและเริ่มต้น มีความคิดเห็นเกี่ยวกับวิธีการนี้ไหม?
GriffinHeart

@ Byte56: โดยทั่วไปคุณสามารถสอบถามองค์ประกอบที่เกี่ยวข้องและค่าของมัน ในทางปฏิบัติคุณมักจะต้องรู้ชุดย่อยที่เกี่ยวข้องของทั้งรัฐเท่านั้นตัวอย่างเช่น "เอนทิตีนี้มีBuildControllerComponentหรือไม่" หรือ "อะไรคือสถานะของเอนทิตีนี้ที่บันทึกไว้ในPositionComponentถ้ามีหรือไม่" - สิ่งที่คุณทำโดยการตรวจสอบรายการส่วนประกอบสำหรับสิ่งที่คุณสนใจและเลือกที่จะสืบค้นค่าของมัน
Martin Sojka

1
@GriffinHeart: ฉันจะใช้สิ่งที่จำเป็นในการ "สร้าง" กับดักในระบบที่เกี่ยวข้องกับการจัดการBuildControllerComponents มันต้องดำเนินการเปลี่ยนแปลงมุมมองของตัวละคร (หรือกล้อง) และกิจกรรมการกดปุ่มและเมาส์
Martin Sojka

5

ฉันไม่ชอบแนวคิดของเอนทิตีที่เรียกการอัปเดตเกี่ยวกับส่วนประกอบ (ระบบควรทำงาน) และนั่นจะนำไปสู่ปัญหาเกี่ยวกับการทำให้ส่วนประกอบไม่รู้จักซึ่งกันและกัน

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

แต่จริงๆแล้วถ้าคุณไม่มีระบบและคุณต้องพึ่งพาส่วนประกอบในการทำงานทั้งหมดที่คุณกำลังประสบกับปัญหามากมาย ส่วนประกอบไม่ควรรู้ซึ่งกันและกันและไม่ควรทำการประมวลผล


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

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

ฉันชอบความคิดของสิ่งStateComponentที่สามารถใช้ได้กับหลาย ๆ ระบบ
Cypher

1
มันสุภาพที่จะให้เหตุผลแก่ผู้ลงคะแนน ขอบคุณ
MichaelHouse

2
ในหมายเหตุอื่นการคัดค้านแนวทางของผู้ถามจะขึ้นอยู่กับข้อสันนิษฐานว่าการออกแบบโดยใช้องค์ประกอบทั้งหมดจะต้องอัปเดตส่วนประกอบจากระบบแยกต่างหาก (เช่นการออกแบบระบบเอนทิตี) นั่นเป็นวิธีหนึ่งในการทำเช่นนั้น แต่ไม่แน่นอนเพียงอย่างเดียวและไม่มีเหตุผลที่จะห้ามวิธีการดังกล่าวสำหรับเกมที่ไม่จำเป็นต้องมีการปรับปรุงองค์ประกอบแคชที่ปรับให้เหมาะสม
Sean Middleditch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.