posted by REDFORCE 2017. 5. 5. 01:42


명령 패턴 두 번째글 입니다. 혹시나 첫 번째 글을 보시지 않은 분들이 계시다면

다음 링크를 눌러서 바로 가실 수 있습니다. (명령 패턴 : 입력 키 변경)


2. 액터에게 지시하기


명령 패턴을 활용한 방법 두 번째 내용은 액터에게 지시하기 입니다.


이전 글에서 정리한 내용은 순전히 Command 클래스로 만든 Jump() 나 FireGun() 과 같은 전역 함수가 플레이어 캐릭터 객체가 사용할 것임을 암시적으로 찾아서 활용해야 한다는 점이 가정에 깔려 있기 때문에, 플레이어만 사용할 수 있다라는 제한이 있습니다.



그러나 꼭 플레이어만 아닌 어떤 몬스터나 캐릭터나 AI가 움직이는 NPC들도 

Jump() 나 FireGun() 과 같은 동작을 한다면??


일일이 모든 캐릭터에게 위와같은 Command 클래스를 넣어줘야 한다면 그건 그것나름대로 동작은 가능하지만 불편할 것 같습니다.


그래서 행동 자체를 실체화 시킨 것에서 행동할 액터를 받아오게끔 만드는 방법이 있습니다.



위에서 GameActor는 게임 월드를 돌아다니는 캐릭터를 대표하는 '게임 객체' 클래스라 보시면 됩니다. 이제 Command를 상속받은 클래스는 execute()가 호출될 때 GameActor 객체를 인수로 받기 때문에 원하는 액터의 메서드를 호출 할 수 있습니다.


위 말은 이제 원하는 액터의 메서드를 호출 하게끔 다음과 같이 Command 클래스가 이용가능해진다는 뜻 입니다.



코드를 보는것처럼 이제 JumpCommand 클래스 하나로 게임에 등장하는 어떤 캐릭터라도 점프를 할 수 있게끔 가능해졌습니다.


이제 입력 핸들러에서 입력을 받아 적당한 객체의 메서드를 호출하는 명령 객체를 연결하는 것을 만들 차례입니다. 먼저 InputHandler()에서 명령 객체를 반환하도록 변경합니다.



다음으로 명령 객체를 받아서 플레이어를 대표하는 GameActor 객체에 적용하는 코드가 필요합니다.



이렇게 하면 액터(actor)가 플레이어 캐릭터라면 유저 입력에 따라 동작하기 때문에 이전 글에서 다룬 내용과 기능상 다를 게 없지만, 명령을 실행할 때 액터만 바꾸면 플레이어가 게임에 있는 어떤 액터라도 제어 할 수 있게 됩니다.


일반적으로 플레이어가 AI를 제어하는 일은 많이 없지만, 꼭 AI를 제어하는 기능이 아니더라도 위와 같이 액터를 제어하기 위한 AI를 만드는 상황에서도 많은 활용이 되도록 설계가 가능합니다.