초고교급 희망

[게임 프로그래밍 패턴] 2장 명령 패턴 본문

Book

[게임 프로그래밍 패턴] 2장 명령 패턴

연모링 2023. 7. 17. 20:40
728x90

 

1. 명령 패턴이란?

메서드 호출을 실체화(reify)한 것이다.

실체화는 어떤 개념을 변수에 저장하거나 함수에 전달할 수 있도록 데이터, 즉 객체로 바꿀 수 있다는 걸 의미한다.

여기에서 명령 패턴을 '메서드 호출을 실체화한 것'이라고 한 것은 함수 호출을 객체로 감쌌다는 의미다.

 

 

2. 입력키 변경 예시

모든 게임에는  X, Y, A, B 버튼등의 유저 입력을 읽는 코드가 있다.

간단하게 구현하면 다음과 같다.

void InputHandler::handleInput() {
	if (isPressed(BUTTON_X)) jump();
	else if (isPressed(BUTTON_Y)) fireGun();
	else if (isPressed(BUTTON_A)) swapWeapon();
	else if (isPressed(BUTTON_X)) lunchIneffectively();
}

입력 키 변경을 불가능하게 만들겠다면 이렇게 해도 상관 없지만, 많은 게임은 입력키 변경을 지원한다.

 

키 변경을 하려면 jump()같은 함수를 직접 호출하지 말고 교체 가능한 무엇인가로 바꾸어야한다.

이럴 때 사용하는 것이 명령 패턴이다.

 

게임에서 할 수 있는 행동을 실행할 수 있는 공통 상위 클래스 정의하기

class Command {
public:
	virtual ~Command() {}
    virtual void execute() = 0;
};

각 행동별로 하위 클래스 만들기

class JumpCommand : public Command {
public:
	virtukal void execute() { jump(); }
};

class FireCommand : public Command {
public:
	virtukal void execute() { fireGun(); }
};

입력 핸들러 코드에는 각 버튼별로 Command 클래스 포인터를 저장한다.

 

class InputHandler {
public:
	void handleInput();
    // 명령을 바인드(bind)할 메서드들 . . .

private:
	Command* buttonX_;
	Command* buttonY_;
    Command* buttonA_;
    Command* buttonB_;
};

이제 입력처리는 다음 코드로 위임된다.

void InputHandler::handleInput() {
	if(isPressed(BuTTON_X)) buttonX-->execute();
	else if(isPressed(BuTTON_Y)) buttonY-->execute();
    else if(isPressed(BuTTON_A)) buttonA-->execute();
    else if(isPressed(BuTTON_B)) buttonB-->execute();
}

직접 함수를 호출하던 대신에, 한 겹 우회하는 계층이 생겼다.

728x90

'Book' 카테고리의 다른 글

리팩터링 Chapter 01~03  (0) 2023.08.06