랜덤 몬스터 스폰

2020. 4. 4. 23:24개발일지

이번에는 랜덤하게 생성된 방에 몬스터를 스폰하는 작업을 진행했다.

네크로댄서는 방마다 랜덤하게 3~5마리의 몬스터가 스폰된다. 어떻게 랜덤하게 몬스터를 스폰할 수 있을까?

 

먼저 이 코드를 보자.

 

가장 간단하지만 확장하기 어려워 보인다.

가장 간단하지만 확장하기 힘든 코드이다.

몬스터의 종류만큼 rand() % (몬스터 수)로 랜덤한 번호를 뽑아서 switch문에 그 값에 따른 몬스터 생산 코드를 하나 하나 써준다. 몬스터의 종류가 많아지면 많아질수록 switch문은 한눈에 보기 힘들정도로 길어질 것이다.

enum으로 바꿔준다 하더라도 코드가 길어지고 보기 힘들다는 점은 비슷할 것이다.

 

프로토타입

랜덤 몬스터의 종류 추가가 쉽고 확장하기 괜찮은 방법이 없을까 고민하다 '게임 프로그래밍 패턴'이란 책을 집어들고 찾아 보던중, 5장 프로토타입 장에서 내 프로젝트에 적용할 수 있는 좋은 코드를 발견했다.

Spawner 클래스를 만들어 상속받는 자식들이 SpawnMonster() 함수를 구현하도록 순수 가상함수를 사용하고, 클래스 템플릿을 이용해 몬스터마다 Spawner 클래스를 새로 생성해주는 방법이었다.

코드를 한번 보자.

여기서 주목해야 할 부분은 CreateObject<T>() 이다. AMONSTER를 상속받는 하위 클래스를 템플릿 타입 매개변수로 전달할때마다 새로운 SpawnerFor 클래스의 객체를 만들 수 있다.

이제 객체를 생성하고 호출하는 부분을 보자.

몬스터의 스포너를 추가

헤더파일에 원하는 종류만큼 Spawner을 저장할 수 있도록 vector을 선언하고

랜덤하게 뽑을 몬스터에 추가할 새로운 SpawnerFor 객체들을 생성했다.

그다음 랜덤하게 생성만 해주면 끝이다!

 

이 부분이 참 놀라운데 몬스터의 종류가 아무리 늘어나도 이 코드를 수정할 필요가 없어진다.

그저 SpawnerFor 객체를 만들어 vector에 추가해주기만 하면 된다.

 

마지막으로, 랜덤하게 생성된 방에 몬스터들을 뿌려주는 작업을 했다.

지난번 랜덤맵 생성때 MAP 클래스에서 방의 위치와 크기, 좌표들을 저장해둔 map이 유용하게 활용되었다.

MAP 클래스에 방의 위치와 정보를 map의 key와 value로 사용했었다.

이를 이용해 각 방에 랜덤하게 몬스터를 스폰하였다. 시작방은 몬스터 스폰에서 제외시켰으며 겹치는 좌표에 생성되는 것을 방지하기 위해 set을 사용하였다. (개인적으로 set을 자주 사용하는 것 같다)

최종적으로 구현한 SpawnMonster() 함수

실행시마다 방마다 랜덤한 위치에 랜덤한 몬스터가 스폰되는 것을 확인했다.

이제 좀 게임같아 보이기 시작해서 기쁜 하루였다 ^_^

'개발일지' 카테고리의 다른 글

아이템 상자 스폰  (1) 2020.04.14
플레이어 공격 1  (0) 2020.04.07
랜덤맵 제작 3  (0) 2020.04.03
랜덤맵 제작 2  (0) 2020.04.03
랜덤맵 제작 1  (0) 2020.04.01