무엇에 대한 구성 요소 기반의 엔진 ?
당신은라는 메인 클래스 것 Engine목록을 유지하는 것, GameScreens자신의 목록을 보유 것이다 Components.
엔진은이 Update와 Draw방법 모두 호출 GameScreen의 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(예 : 사용자가에서 게임 시작 버튼을 클릭하면으로 MainMenuScreen전환 할 수 있음 GameplayScreen).
Component클래스도 마찬가지입니다. 클래스의 부모에 대한 참조를 보유하고 클래스와 부모 에 GameScreen액세스하여 새 컴포넌트를 추가해야합니다 (예 : 컴포넌트와 컴포넌트 를 보유하는
HUD 관련 클래스를 만들 수 있음 ).EngineGameScreenDrawableButtonDrawableTextStaticBackground
"서비스 디자인 패턴"(정확한 이름은 확실하지 않음)과 같이 Engine클래스 내에 다른 유용한 서비스를 유지할 수있는 다른 디자인 패턴을 적용 할 수도 있습니다 (단순히의 목록을 유지하고 IService다른 클래스가 스스로 서비스를 추가하도록 함) ). 예를 들어 Camera2D다른 컴포넌트를 그릴 때 변환을 적용하는 서비스로 모든 프로젝트 의 컴포넌트를 유지합니다 . 이것은 어디서나 매개 변수로 전달하지 않아도됩니다.
결론적으로 엔진을위한 더 나은 디자인이있을 수 있지만 이 링크에서 제안한 엔진은 매우 우아하고 유지 관리가 쉽고 재사용이 가능 하다는 것을 알았습니다 . 나는 적어도 그것을 시도하는 것이 좋습니다.