Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 유니티
- 안드로이드
- BFS
- 구현
- UI 자동화
- binary_search
- unity
- 게임개발공모전
- 인프런
- 프로그래머스
- 백준
- 이분탐색
- upper_bound
- 너비우선탐색
- 재귀
- 개발일지
- unreal
- 언리얼
- c#
- 운영체제
- 이득우
- c++
- lower_bound
- fsm
- 게임개발
- 시리얼라이제이션
- 웅진씽크빅
- DFS
- 유한상태기계
- 알고리즘
Archives
- Today
- Total
초고교급 희망
[게임 프로그래밍 패턴] 2장 명령 패턴 본문
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 |
---|