이제 부터는 주인공과 열심히 싸워주고 경험치를 주는 몬스터를 만들어 보겠습니다.
몬스터는 각 종 수치와 액션 관점에서 플레이어와 비슷해 보이지만 개발 관점에서 보면 사실 상당히 다른 구조를 가지고 있습니다. 이전 장에서 개발한 플레이어는 프로그램의 시작에서 부터 끝까지 단 하나의 객체밖에 존재할 수 없으며 플레이어가 죽는 순간 게임은 종료 됩니다. 하지만 몬스터는 플레이어와 달리 게임 플레이중에 여러 몬스터들이 동시에 존재 할수 있고, 파괴되었다고 해서 게임이 종료 되지도 않으며, 게임 플레이 중에 지속적으로 생성과 파괴를 반복합니다. 또한 다양한 종류의 몬스터를 표현하기 위해 동일한 클래스에 데이터만 바꿔서 표현해 줄 수도 있있습니다.
위의 요구 사항들을 만족하기 위해서 몬스터 클래스를 '고정 정보' 부분과 '인스턴스 별 고유 데이터' 부분으로 분리 하고, 몬스터 오브젝트들을 생성, 삭제, 검색 할 수 있는 '몬스터 관리' 클래스를 추가 할 것입니다.
- 고정 정보 : 시스템이 구동하면서 변하지 않는 속성 정보들, 예를 들면 시스템 내부적으로 사용되는 몬스터의 아이디, 유저에게 보여지는 몬스터의 이름, 몬스터의 기본 공격력, 방어력, 속도 등등을 나타냅니다. 프로토타입 디자인 패턴을 적용하여 인스턴스별 데이터들을 생성해내는
- 인스턴스별 데이터 : 시스템 구동 동안 지속적으로 변경되는 데이터. 예를 들면 몬스터의 HP, 위치 정보, 상태 등을 의미합니다.
이전에 만들었던 Player 클래스와 크게 다르지 않습니다만, 고정 정보를 참조, 조회하기 위해 사용 되는 info가 추가 되고, 싱글톤 패턴을 위한 부분이 없습니다. 몬스터 시스템 내에 동일한 인스턴스가 2개 이상 존재 할 수 있으므로 싱글톤 패턴은 이에 맞지 않습니다. 대신 몬스터의 기본 상태 값을 미리 지정하고 몬스터 아이디에 따라 기본 상태값에 따른 인스턴스를 계속 생성하도록 만들어 보도록 하죠.
MonsterManager 클래스는 id에 따른 MonsterInfo 인스턴스들을 저장하고 있다가 CreateInstance의 인자로 지정된 Info의 CreateInstance를 호출하여 MonsterData 생성하여 리턴해주는 일종의 팩토리 클래스 입니다. MonsterManager 클래스 또한 플레이어와 동일하게 프로그램 시작 부터 종료 시까지 인스턴스가 유지되어야 하고, 유일한 하나의 인스턴스만 존재해야 하므로 싱글톤을 적용합니다.
Init함수에는 테스트를 위해서 "monster"라는 임시 데이터를 추가하도록 하겠습니다. 이제 부터는 "monster"이라는 이름으로 몬스터 인스턴스를 요청 할 수 있습니다. GameManager에 몬스터 인스턴스를 생성하는 부분을 추가하도록 해보죠.