본문 바로가기

로그라이크

몬스터 만들기

이제 부터는 주인공과 열심히 싸워주고 경험치를 주는 몬스터를 만들어 보겠습니다.

몬스터는 각 종 수치와 액션 관점에서 플레이어와 비슷해 보이지만 개발 관점에서 보면 사실 상당히 다른 구조를 가지고 있습니다. 이전 장에서 개발한 플레이어는 프로그램의 시작에서 부터 끝까지 단 하나의 객체밖에 존재할 수 없으며 플레이어가 죽는 순간 게임은 종료 됩니다. 하지만 몬스터는 플레이어와 달리 게임 플레이중에 여러 몬스터들이 동시에 존재 할수 있고, 파괴되었다고 해서 게임이 종료 되지도 않으며, 게임 플레이 중에 지속적으로 생성과 파괴를 반복합니다. 또한 다양한 종류의 몬스터를 표현하기 위해 동일한 클래스에 데이터만 바꿔서 표현해 줄 수도 있있습니다. 


위의 요구 사항들을 만족하기 위해서 몬스터 클래스를 '고정 정보' 부분과 '인스턴스 별 고유 데이터' 부분으로 분리 하고, 몬스터 오브젝트들을 생성, 삭제, 검색 할 수 있는 '몬스터 관리' 클래스를 추가 할 것입니다.

  • 고정 정보 : 시스템이 구동하면서 변하지 않는 속성 정보들, 예를 들면 시스템 내부적으로 사용되는 몬스터의 아이디, 유저에게 보여지는 몬스터의 이름, 몬스터의 기본 공격력, 방어력, 속도 등등을 나타냅니다. 프로토타입 디자인 패턴을 적용하여 인스턴스별 데이터들을 생성해내는 
  • 인스턴스별 데이터 : 시스템 구동 동안 지속적으로 변경되는 데이터. 예를 들면 몬스터의 HP, 위치 정보, 상태 등을 의미합니다.


먼저 인스턴스 데이터를 표현하는 MonsterData 클래스를 살펴 보도록 하겠습니다(앞으로 각 인스턴스의 개별적인 데이터를 표현하는 클래스에는 'Data' 포스트 픽스를 붙이도록 하겠습니다). 

이전에 만들었던 Player 클래스와 크게 다르지 않습니다만, 고정 정보를 참조, 조회하기 위해 사용 되는 info가 추가 되고, 싱글톤 패턴을 위한 부분이 없습니다. 몬스터 시스템 내에 동일한 인스턴스가 2개 이상 존재 할 수 있으므로 싱글톤 패턴은 이에 맞지 않습니다. 대신 몬스터의 기본 상태 값을 미리 지정하고 몬스터 아이디에 따라 기본 상태값에 따른 인스턴스를 계속 생성하도록 만들어 보도록 하죠.


기본 상태값을 저장하고 있을 MonsterInfo(앞으로 이 책에서 고정 정보를 의미하는 클래스는 Info라는 포스트 픽스를 붙이도록 하겠습니다) 클래스를 만들고, 필요한 몬스터가 있다면 이 MonsterInfo 인스턴스에게 MonsterData 인스턴스를 생성해 달라고 요청할 수 있는 CreateInstance() 함수를 추가하였습니다. 

이제 위의 몬스터 오브젝트를 생성하고 관리해 줄수 있는 매니저 클래스(MonsterManager)를 추가 해보도록 하죠.

MonsterManager 클래스는 id에 따른 MonsterInfo 인스턴스들을 저장하고 있다가 CreateInstance의 인자로 지정된 Info의 CreateInstance를 호출하여 MonsterData 생성하여 리턴해주는 일종의 팩토리 클래스 입니다. MonsterManager 클래스 또한 플레이어와 동일하게 프로그램 시작 부터 종료 시까지 인스턴스가 유지되어야 하고, 유일한 하나의 인스턴스만 존재해야 하므로 싱글톤을 적용합니다.


Init함수에는 테스트를 위해서 "monster"라는 임시 데이터를 추가하도록 하겠습니다. 이제 부터는 "monster"이라는 이름으로 몬스터 인스턴스를 요청 할 수 있습니다. GameManager에 몬스터 인스턴스를 생성하는 부분을 추가하도록 해보죠.

이상으로 몬스터 인스턴스를 생성하는 부분까지 완료했습니다. 하지만 아직 플레이모드를 실행한다고 하더라도 화면에는 플레이어 오브젝트 외에는 아무것도 표시되는 것이 없습니다. 다음 장에는 몬스터와 플레이어를 디스플레이하는 공통 코드를 개발하는 것에 대해서 살펴 보도록 하겠습니다.


유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!