ฉันเพิ่งตัดสินใจปรับปรุงสถาปัตยกรรมเกมของฉันเพื่อกำจัดลำดับชั้นของระดับลึกและแทนที่ด้วยองค์ประกอบที่กำหนดค่าได้ ลำดับชั้นแรกที่ฉันกำลังแทนที่คือลำดับชั้นของรายการและฉันต้องการคำแนะนำเพื่อให้ทราบว่าฉันอยู่ในเส้นทางที่ถูกต้องหรือไม่
ก่อนหน้านี้ฉันมีลำดับขั้นที่ทำสิ่งนี้:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
ไม่จำเป็นต้องบอกว่ามันเริ่มยุ่งเหยิงและสิ่งเหล่านี้ไม่ใช่วิธีแก้ปัญหาง่าย ๆ สำหรับรายการที่จำเป็นต้องมีหลายประเภท (เช่นอุปกรณ์บางอย่างใช้ในการสังเคราะห์ไอเท็มอุปกรณ์บางอย่างสามารถโยนได้ ฯลฯ )
จากนั้นฉันพยายาม refactor และวางฟังก์ชันการทำงานลงในคลาสไอเท็มพื้นฐาน แต่ฉันก็สังเกตเห็นว่ารายการนั้นมีข้อมูลที่ไม่ได้ใช้ / ฟุ่มเฟือยจำนวนมาก ตอนนี้ฉันกำลังพยายามทำส่วนประกอบเช่นสถาปัตยกรรมอย่างน้อยก็สำหรับไอเท็มของฉันก่อนที่จะพยายามทำเช่นนั้นกับคลาสเกมอื่น ๆ ของฉัน
นี่คือสิ่งที่ฉันกำลังคิดสำหรับการตั้งค่าส่วนประกอบ:
ฉันมีคลาสไอเท็มพื้นฐานที่มีสล็อตสำหรับส่วนประกอบต่าง ๆ (เช่นสล็อตคอมโพเนนต์อุปกรณ์สล็อตคอมโพเนนต์การแพทย์ ฯลฯ รวมถึงแผนที่สำหรับคอมโพเนนต์โดยพลการ) ดังนั้นสิ่งนี้:
class Item
{
//Basic item properties (name, ID, etc.) excluded
EquipmentComponent* equipmentComponent;
HealingComponent* healingComponent;
SynthesisComponent* synthesisComponent;
ThrowComponent* throwComponent;
boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents;
}
ส่วนประกอบรายการทั้งหมดจะสืบทอดมาจากคลาส ItemComponent พื้นฐานและแต่ละประเภทส่วนประกอบมีหน้าที่รับผิดชอบในการบอกเอ็นจิ้นถึงวิธีการใช้ฟังก์ชันการทำงานนั้น เช่น HealingComponent บอกกลไกการต่อสู้วิธีการใช้ไอเทมเป็นไอเทมรักษาในขณะที่ ThrowComponent บอกเครื่องมือต่อสู้ว่าจะรักษาไอเทมเป็นไอเทมที่สามารถโยนได้
แผนที่ถูกใช้เพื่อเก็บส่วนประกอบโดยพลการที่ไม่ใช่องค์ประกอบของรายการหลัก ฉันกำลังจับคู่กับบูลเพื่อระบุว่ารายการคอนเทนเนอร์ควรจัดการ ItemComponent หรือถ้ามันถูกจัดการโดยแหล่งภายนอก
ความคิดของฉันที่นี่คือฉันกำหนดองค์ประกอบหลักที่ใช้โดยเอ็นจิ้นเกมของฉันล่วงหน้าและโรงงานผลิตรายการของฉันจะกำหนดส่วนประกอบที่รายการนั้นมีอยู่จริง แผนที่จะมีองค์ประกอบตามอำเภอใจที่โดยทั่วไปจะถูกเพิ่ม / ใช้งานโดยไฟล์สคริปต์
คำถามของฉันคือนี่เป็นการออกแบบที่ดีหรือไม่? ถ้าไม่จะปรับปรุงได้อย่างไร ฉันถือว่าการจัดกลุ่มส่วนประกอบทั้งหมดลงในแผนที่ แต่การใช้การจัดทำดัชนีสตริงดูเหมือนไม่จำเป็นสำหรับส่วนประกอบรายการหลัก