สิ่งที่เกี่ยวกับเครื่องยนต์ component-based ?
คุณจะได้เรียนหลักชื่อEngineซึ่งจะเก็บรายชื่อของที่ตัวเองจะถือรายการGameScreensComponents
เครื่องยนต์มีUpdateและDrawวิธีการและการโทรทั้งGameScreen's UpdateและDrawวิธีการที่ตัวเองไปผ่านทุกองค์ประกอบและการโทรและUpdateDraw
นำเสนอเช่นนั้นฉันยอมรับว่ามันฟังดูเหมือนการออกแบบที่ไม่ดีและซ้ำซ้อน แต่เชื่อฉันรหัสของฉันกลายเป็นสะอาดกว่ามากโดยใช้วิธีการที่เป็นส่วนประกอบกว่าที่เคยทำกับคลาสผู้จัดการเก่าทั้งหมดของฉัน
มันง่ายกว่ามากในการรักษาโค้ดเช่นนี้เนื่องจากคุณเพิ่งจะผ่านลำดับชั้นของชั้นเรียนขนาดใหญ่และไม่ต้องค้นหาBackgroundManagerภูมิหลังที่แตกต่างกันทั้งหมด คุณเพียงแค่มีScrollingBackground, ParallaxBackground, StaticBackgroundฯลฯ ซึ่งมาจากทุกBackgroundระดับ
ในที่สุดคุณจะสร้างเอนจิ้นที่มั่นคงซึ่งคุณสามารถนำกลับมาใช้กับโครงการทั้งหมดของคุณด้วยส่วนประกอบและวิธีการช่วยเหลือที่ใช้บ่อย (เช่นFrameRateDisplayerยูทิลิตีการดีบักSpriteคลาสเป็นสไปรต์พื้นฐานพร้อมพื้นผิวและส่วนขยายสำหรับเวกเตอร์ และการสร้างตัวเลขสุ่ม)
คุณจะไม่มีBackgroundManagerชั้นเรียนอีกต่อไปแต่Backgroundชั้นเรียนที่จะจัดการตัวเองแทน
เมื่อเกมของคุณเริ่มต้นสิ่งที่คุณต้องทำก็คือ:
// when declaring variables:
Engine engine;
// when initializing:
engine = new Engine();
engine.Initialize();
engine.LoadContent();
engine.AddGameScreen(new MainMenuScreen());
// when updating:
engine.Update();
// when drawing:
engine.Draw();
และนี่คือรหัสเริ่มต้นสำหรับเกมของคุณ
จากนั้นสำหรับหน้าจอเมนูหลัก:
class MainMenuScreen : MenuScreen // where MenuScreen derives from the GameScreen class
{
const int ENEMY_COUNT = 10;
StaticBackground background;
Player player;
List<Enemy> enemies;
public override void Initialize()
{
background = new StaticBackground();
player = new Player();
enemies = new List<Enemy>();
base.AddComponent(background); // defined within the GameScreen class
base.AddComponent(player);
for (int i = 0; i < ENEMY_COUNT; ++i)
{
Enemy newEnemy = new Enemy();
enemies.Add(newEnemy);
base.AddComponent(newEnemy);
}
}
}
คุณได้รับความคิดทั่วไป
นอกจากนี้คุณยังจะต้องอ้างอิงการอ้างอิงEngineภายในGameScreenคลาสทั้งหมดของคุณเพื่อให้สามารถเพิ่มหน้าจอใหม่แม้ในGameScreenคลาส (เช่นเมื่อผู้ใช้คลิกที่ปุ่มStartGameในขณะที่อยู่ภายในMainMenuScreenคุณสามารถเปลี่ยนไปใช้GameplayScreen)
ไปที่Componentคลาสเดียวกัน: มันควรเก็บการอ้างอิงของพาGameScreenเรนต์เพื่อให้เข้าถึงEngineคลาสและพาเรนต์GameScreenเพื่อเพิ่มคอมโพเนนต์ใหม่ (เช่นคุณสามารถสร้างคลาสที่เกี่ยวข้องกับ HUD เรียกว่าDrawableButtonซึ่งมี
DrawableTextส่วนประกอบและStaticBackgroundส่วนประกอบ)
คุณสามารถใช้รูปแบบการออกแบบอื่น ๆ หลังจากนั้นเช่น "รูปแบบการออกแบบบริการ" (ไม่แน่ใจเกี่ยวกับชื่อที่แน่นอน) ซึ่งคุณสามารถเก็บบริการที่มีประโยชน์ต่าง ๆ ไว้ในEngineชั้นเรียนของคุณ(คุณเพียงแค่เก็บรายการไว้IServiceและให้ชั้นอื่น ๆ เพิ่มบริการเอง ) เช่นฉันจะเก็บCamera2Dองค์ประกอบเหนือทุกโครงการของฉันเป็นบริการเพื่อใช้การแปลงเมื่อวาดส่วนประกอบอื่น ๆ วิธีนี้จะช่วยหลีกเลี่ยงการผ่านเป็นพารามิเตอร์ได้ทุกที่
โดยสรุปแล้วอาจมีการออกแบบอื่น ๆ ที่ดีกว่าสำหรับเครื่องยนต์ แต่ฉันพบว่าเครื่องยนต์ที่เสนอโดยลิงก์นี้สง่างามมากบำรุงรักษาได้ง่ายและสามารถนำกลับมาใช้ใหม่ได้ ฉันจะแนะนำเป็นการส่วนตัวอย่างน้อยก็ลอง