728x90
1. 명령 패턴 ( Command Pattern ) 정의
- 함수 호출을 객체로 감싸는 것이다.
2. 함수를 직접 호출하는 코드
// Jump(), FireGun() 등 함수를 직접 호출하는 방식의 코드
void InputHanler::HandleInput()
{
if ( IsPressed( ButtonX ) ) Jump();
else if ( IsPressed( ButtonY ) ) FireGun();
}
- 함수를 직접 호출하는 경우 코드를 이해하기는 쉽지만, 입력 키 변경이 불가능하다.
3. 명령 패턴을 이용하여 객체화
// 공통 상위 클래스 정의
class Command
{
public:
virtual ~Command() {}
virtual void Execute() = 0;
};
// Jump() 함수 호출을 객체화
class JumpCommand : public Command
{
public:
virtual void Execute() { Jump(); }
};
// FireGun() 함수 호출을 객체화
class FireGunCommand : public Command
{
public:
virtual void Execute() override { FireGun(); }
};
4. 함수를 직접 호출하는 코드 대신, 객체화된 소스 호출
class InputHandler
{
public:
void HandleInput();
private:
Command* ButtonX;
Command* ButtonY;
};
void InputHandler::HandleInput()
{
if ( IsPressed( BUTTON_X ) ) ButtonX->Execute();
else if ( IsPressed( BUTTON_Y ) ) ButtonY->Execute();
}
- ButtonX, ButtonY에 어떤 버튼을 할당하느냐에 따라 호출되는 함수가 변경된다.
- 함수를 직접 호출하는 코드와 달리, 입력 키 변경이 가능하다.
- 전역 함수만 호출하도록 된 소스이므로, 액터 지시를 통해 단점 보완이 필요하다.
5. 액터에게 지시하기
// 공통 상위 클래스 정의
class Command
{
public:
virtual ~Command() {}
virtual void Execute( GameActor& InActor ) = 0;
};
// Jump() 함수 호출을 객체화
class JumpCommand : public Command
{
public:
virtual void Execute( GameActor& InActor ) { InActor.Jump(); }
};
// FireGun() 함수 호출을 객체화
class FireGunCommand : public Command
{
public:
virtual void Execute( GameActor& InActor ) override { InActor.FireGun(); }
};
// 입력한 버튼에 대한 명령 객체 반환.
Command* InputHandler::HandleInput()
{
if ( IsPressed( BUTTON_X ) ) return ButtonX;
else if ( IsPressed( BUTTON_Y ) ) return ButtonY;
// 키 입력이 없는 경우
return nullptr;
}
// 명령 객체를 반환받아 액터에게 행동을 지시한다.
Command* command = inputHandler.HandleInput();
if ( command )
command->Execute( actor );
- HandleInput() 함수를 통해 명령 객체를 반환받아, 특정 액터가 명령을 실행할 수 있도록 한다.
반응형
'Design Pattern > 게임 프로그래밍 패턴' 카테고리의 다른 글
| [Design Pattern] 상태 패턴 (0) | 2022.07.31 |
|---|---|
| [Design Pattern] 싱글턴 패턴 (0) | 2022.07.30 |
| [Design Pattern] 프로토타입 패턴 (0) | 2022.07.30 |
| [Design Pattern] 관찰자 패턴 (0) | 2022.07.30 |
| [Design Pattern] 경량 패턴 (0) | 2022.07.29 |