무엇에 대한 구성 요소 기반의 엔진 ?
당신은라는 메인 클래스 것 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 관련 클래스를 만들 수 있음 ).Engine
GameScreen
DrawableButton
DrawableText
StaticBackground
"서비스 디자인 패턴"(정확한 이름은 확실하지 않음)과 같이 Engine
클래스 내에 다른 유용한 서비스를 유지할 수있는 다른 디자인 패턴을 적용 할 수도 있습니다 (단순히의 목록을 유지하고 IService
다른 클래스가 스스로 서비스를 추가하도록 함) ). 예를 들어 Camera2D
다른 컴포넌트를 그릴 때 변환을 적용하는 서비스로 모든 프로젝트 의 컴포넌트를 유지합니다 . 이것은 어디서나 매개 변수로 전달하지 않아도됩니다.
결론적으로 엔진을위한 더 나은 디자인이있을 수 있지만 이 링크에서 제안한 엔진은 매우 우아하고 유지 관리가 쉽고 재사용이 가능 하다는 것을 알았습니다 . 나는 적어도 그것을 시도하는 것이 좋습니다.