ฉันได้ทำงานกับ RPG 2d มานานแล้วและฉันก็ตระหนักว่าฉันได้ตัดสินใจออกแบบที่ไม่ดี โดยเฉพาะอย่างยิ่งมีบางสิ่งที่ทำให้ฉันมีปัญหาดังนั้นฉันจึงสงสัยว่าคนอื่น ๆ ที่ใช้ในการเอาชนะพวกเขาหรือใช้
สำหรับพื้นหลังเล็กน้อยฉันเริ่มทำงานในเวลาว่างของฉันเมื่อฤดูร้อนปีที่แล้ว ตอนแรกฉันสร้างเกมใน C # แต่ประมาณ 3 เดือนที่แล้วตัดสินใจเปลี่ยนเป็น C ++ ฉันต้องการได้รับการจัดการที่ดีใน C ++ เพราะมันไม่นานมานี้เพราะฉันใช้มันอย่างหนักและคิดว่าโครงการที่น่าสนใจเช่นนี้จะเป็นแรงจูงใจที่ดี ฉันใช้ห้องสมุดเพิ่มอย่างกว้างขวางและใช้ SFML สำหรับกราฟิกและ FMOD สำหรับเสียง
ฉันมีโค้ดที่ค่อนข้างเป็นธรรม แต่กำลังพิจารณาที่จะทิ้งมันและเริ่มต้นใหม่
นี่คือประเด็นสำคัญที่ฉันกังวลและต้องการรับความคิดเห็นเกี่ยวกับวิธีการที่เหมาะสมที่ผู้อื่นแก้ไขได้หรือจะแก้ปัญหา
1. การพึ่งพาตามวัฏจักร เมื่อฉันทำเกมใน C # ฉันไม่ต้องกังวลเกี่ยวกับสิ่งนี้เพราะมันไม่มีปัญหา การย้ายไปที่ C ++ นี้ได้กลายเป็นปัญหาใหญ่พอสมควรและทำให้ฉันคิดว่าฉันอาจออกแบบสิ่งต่าง ๆ ไม่ถูกต้อง ฉันไม่สามารถจินตนาการได้ว่าจะแยกชั้นเรียนของฉันอย่างไรและยังให้พวกเขาทำสิ่งที่ฉันต้องการ นี่คือตัวอย่างบางส่วนของห่วงโซ่การพึ่งพา:
ฉันมีคลาสเอฟเฟ็กต์สถานะ ชั้นเรียนมีวิธีการมากมาย (ใช้ / นำไปใช้, ขีด, ฯลฯ ) เพื่อใช้เอฟเฟกต์กับอักขระ ตัวอย่างเช่น
virtual void TickCharacter(Character::BaseCharacter* character, Battles::BattleField *field, int ticks = 1);
ฟังก์ชั่นนี้จะถูกเรียกว่าทุกครั้งที่ตัวละครที่มีผลกระทบสถานะจะเปลี่ยน มันจะใช้เพื่อใช้เอฟเฟกต์เช่น Regen, Poison เป็นต้นอย่างไรก็ตามมันยังแนะนำการพึ่งพาคลาส BaseCharacter และคลาส BattleField โดยปกติแล้วคลาส BaseCharacter จำเป็นต้องติดตามผลกระทบสถานะใดบ้างที่พวกเขากำลังใช้งานอยู่ในปัจจุบันเพื่อให้การพึ่งพาวงจร Battlefield จำเป็นต้องติดตามฝ่ายต่อสู้และกลุ่มปาร์ตี้มีรายชื่อ BaseCharacters ที่แนะนำการพึ่งพาวงจรอื่น
2 - กิจกรรม
ใน C # ฉันใช้ผู้ได้รับมอบหมายอย่างกว้างขวางเพื่อเชื่อมโยงกับเหตุการณ์ในตัวละครสนามรบ ฯลฯ (ตัวอย่างเช่นมีผู้ร่วมประชุมเมื่อตัวละครมีการเปลี่ยนแปลงสุขภาพของตัวละครเมื่อสถิติเปลี่ยนไปเมื่อมีการเพิ่ม / ลบสถานะผล ฯลฯ .) และส่วนประกอบสนามรบ / กราฟิกจะเชื่อมโยงกับผู้ได้รับมอบหมายเหล่านั้นเพื่อบังคับใช้เอฟเฟกต์ ใน C ++ ฉันทำสิ่งที่คล้ายกัน เห็นได้ชัดว่าไม่มีตัวแทนโดยตรงเทียบเท่ากับ C # ดังนั้นฉันจึงสร้างบางสิ่งเช่นนี้ขึ้น:
typedef boost::function<void(BaseCharacter*, int oldvalue, int newvalue)> StatChangeFunction;
และในชั้นเรียนของฉัน
std::map<std::string, StatChangeFunction> StatChangeEventHandlers;
เมื่อใดก็ตามที่สถานะของตัวละครเปลี่ยนไปฉันจะทำซ้ำและเรียก StatChangeFunction ทุกอันบนแผนที่ ในขณะที่ใช้งานได้ฉันกังวลว่านี่เป็นวิธีการที่ไม่ดีในการทำสิ่งต่าง ๆ
3 - กราฟิก
นี่คือสิ่งที่ยิ่งใหญ่ มันไม่เกี่ยวข้องกับไลบรารีกราฟิกที่ฉันใช้ แต่เป็นแนวคิดมากกว่า ใน C # ฉันเชื่อมโยงกราฟิกเข้ากับคลาสจำนวนมากซึ่งฉันรู้ว่าเป็นความคิดที่แย่มาก ต้องการที่จะทำมัน decoupled ครั้งนี้ฉันพยายามแนวทางที่แตกต่าง
เพื่อที่จะใช้งานกราฟิกของฉันฉันได้จินตนาการกราฟิกทุกอย่างที่เกี่ยวข้องในเกมเป็นชุดของหน้าจอ นั่นคือหน้าจอชื่อเรื่อง, หน้าจอสถานะตัวละคร, หน้าจอแผนที่, หน้าจอรายการสินค้า, หน้าจอการต่อสู้, หน้าจอการต่อสู้ GUI, และโดยทั่วไปฉันสามารถซ้อนหน้าจอเหล่านี้ไว้ด้านบนของกันและกันตามความจำเป็นเพื่อสร้างกราฟิกเกม สิ่งที่หน้าจอที่ใช้งานอยู่เป็นเจ้าของอินพุตของเกม
ฉันออกแบบตัวจัดการหน้าจอที่จะผลักและป็อปหน้าจอตามการป้อนข้อมูลของผู้ใช้
ตัวอย่างเช่นหากคุณอยู่บนหน้าจอแผนที่ (ตัวจัดการอินพุต / วิชวลไลเซอร์สำหรับแผนที่แบบเรียงต่อกัน) และกดปุ่มเริ่มต้นระบบจะส่งการเรียกไปยังผู้จัดการหน้าจอเพื่อผลักหน้าจอเมนูหลักเหนือหน้าจอแผนที่และทำเครื่องหมายแผนที่ หน้าจอที่จะไม่ถูกวาด / อัปเดต โปรแกรมเล่นจะนำทางไปรอบ ๆ เมนูซึ่งจะออกคำสั่งเพิ่มเติมให้กับตัวจัดการหน้าจอตามความเหมาะสมในการผลักหน้าจอใหม่ลงบนสแต็กหน้าจอ ในที่สุดเมื่อผู้เล่นออกจากเมนูหลักฉันจะปิดและกลับไปที่หน้าจอแผนที่สังเกตว่ามันจะถูกดึง / อัปเดตและไปจากที่นั่น
หน้าจอการต่อสู้จะซับซ้อนมากขึ้น ฉันมีหน้าจอทำหน้าที่เป็นพื้นหลังหน้าจอเพื่อให้เห็นภาพของแต่ละฝ่ายในการต่อสู้และหน้าจอเพื่อแสดงภาพ UI สำหรับการต่อสู้ UI จะเชื่อมโยงกับเหตุการณ์ของตัวละครและใช้สิ่งเหล่านั้นเพื่อกำหนดว่าเมื่อใดที่ต้องอัปเดต / วาดใหม่ส่วนประกอบของ UI ในที่สุดการโจมตีทุกครั้งที่มีสคริปต์ภาพเคลื่อนไหวที่มีอยู่จะเรียกเลเยอร์เพิ่มเติมเพื่อทำให้เคลื่อนไหวก่อนที่จะหยุดกองซ้อนหน้าจอ ในกรณีนี้ทุกเลเยอร์ถูกทำเครื่องหมายอย่างต่อเนื่องเป็น drawable และสามารถอัปเดตได้และฉันได้รับหน้าจอจำนวนมากที่จัดการกับกราฟิกการต่อสู้ของฉัน
แม้ว่าฉันจะไม่สามารถให้ตัวจัดการหน้าจอทำงานได้อย่างสมบูรณ์แบบ แต่ฉันคิดว่าฉันสามารถทำได้ในบางเวลา คำถามของฉันเกี่ยวกับเรื่องนี้คือวิธีการที่คุ้มค่าหรือไม่? ถ้ามันเป็นการออกแบบที่ไม่ดีที่ฉันอยากรู้ตอนนี้ก่อนที่ฉันจะลงทุนเวลามากเกินไปในการสร้างหน้าจอทั้งหมดที่ฉันต้องการ คุณสร้างกราฟิกสำหรับเกมของคุณได้อย่างไร