สิ่งที่เกี่ยวกับเครื่องยนต์ component-based ?
คุณจะได้เรียนหลักชื่อEngine
ซึ่งจะเก็บรายชื่อของที่ตัวเองจะถือรายการGameScreens
Components
เครื่องยนต์มีUpdate
และDraw
วิธีการและการโทรทั้งGameScreen
's Update
และDraw
วิธีการที่ตัวเองไปผ่านทุกองค์ประกอบและการโทรและUpdate
Draw
นำเสนอเช่นนั้นฉันยอมรับว่ามันฟังดูเหมือนการออกแบบที่ไม่ดีและซ้ำซ้อน แต่เชื่อฉันรหัสของฉันกลายเป็นสะอาดกว่ามากโดยใช้วิธีการที่เป็นส่วนประกอบกว่าที่เคยทำกับคลาสผู้จัดการเก่าทั้งหมดของฉัน
มันง่ายกว่ามากในการรักษาโค้ดเช่นนี้เนื่องจากคุณเพิ่งจะผ่านลำดับชั้นของชั้นเรียนขนาดใหญ่และไม่ต้องค้นหา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
องค์ประกอบเหนือทุกโครงการของฉันเป็นบริการเพื่อใช้การแปลงเมื่อวาดส่วนประกอบอื่น ๆ วิธีนี้จะช่วยหลีกเลี่ยงการผ่านเป็นพารามิเตอร์ได้ทุกที่
โดยสรุปแล้วอาจมีการออกแบบอื่น ๆ ที่ดีกว่าสำหรับเครื่องยนต์ แต่ฉันพบว่าเครื่องยนต์ที่เสนอโดยลิงก์นี้สง่างามมากบำรุงรักษาได้ง่ายและสามารถนำกลับมาใช้ใหม่ได้ ฉันจะแนะนำเป็นการส่วนตัวอย่างน้อยก็ลอง