09 NDS 홈브루(Homebrew) - KKAMAGUI Defence Tower
원문 : http://kkamagui.springnote.com/pages/575344
들어가기 전에...
- 이 글은 kkamagui에 의해 작성된 글입니다.
- 마음껏 인용하시거나 사용하셔도 됩니다. 단 출처(http://kkamagui.tistory.com, http://kkamagui.springnote.com)는 밝혀 주십시오.
- 기타 사항은 mint64os at gmail.com 이나 http://kkamagui.tistory.com으로 보내주시면 반영하겠습니다.
- OS 제작에 대한 상세한 내용은 책 "64비트 멀티코어 OS 구조와 원리"를 참고하기 바랍니다.
0.버전관리
- 2007/11/09 01:26:03 : NDS에서 테스트 결과 세로 16칸은 너무 넓어서 12칸으로 수정함
0.시작하면서...
Defence Tower 스타일의 게임은 인터넷에서 흔히 구할 수 있다. 특히 플레쉬 게임으로 많이 나와있는데, http://www.xgenstudios.com/game.php?keyword=xenotactic 와 같은 게임이 대표적인 Defence Tower 스타일의 게임이라 할 수 있다.
NDS의 홈브루 게임 중에서도 Defence Tower 류의 게임을 몇개 구할 수 있는데, 게임을 하다 흥미가 생겨서 하나 만들어 보기로 했다.
1.지도(Map) 디자인
NDS의 화면은 256 * 192 Pixel의 듀얼로 구성되어있다. 위쪽 화면은 상태를 표시하는 화면으로 사용하고, 아래쪽 화면은 게임 진행 및 타워 설치 등등으로 사용하도록 하자. 그럼 이제 화면을 적절히 나누어서 최소 타일로 설정해야 하는데, 하나의 타일 크기가 적의 크기가 되도록 하자.
일단 최소 단위 블럭은 12 pixel * 12 pixel로 정했고 이것을 NDS의 한 화면으로 나누면 대충 아래와 같은 21 개 * 16 개의 Block이 나온다. 아래는 최외각을 블럭으로 쌓고 그 외의 공간을 중립 공간으로 설정한 맵의 구성이다.
<Map Design>
이제 최소 블럭 하나씩을 할당해서 적(Enemy)와 타워(Tower)를 할당한 후, 각 타워의 공격 범위(Sight)를 표시하면 아래와 같다.
<적과 타워 설치>
위의 그림은 공격범위가 3인 타워와 공격범위가 2인 타워를 나타낸다. 각 타워는 해당 범위내에 있는 적을 검색해서 적절한 타이밍에 총을 발사하면 될 것이다.
2.전체 디자인
게임의 전체적인 구성은 아래와 같이 되어있다.
<클래스 다이어그램>
게임의 주체는 Tower, Bullet, Enemy의 3가지로 구성되어있다.
- Tower : 타워. 유저가 설치하여 적(Enemy)를 막도록 하는 구조물
- Bullet : 타워가 적을 향해 발사하는 총알
- Enemy : 유저를 괴롭히는 적
매 Tick 마다 각각의 주체는 적을 검색하고 총알을 쏘고 타워를 피하는 등등의 각자 맡은 일을 한다. 전략의 경우는 여러가지가 있을 수 있기 때문에 Strategy 패턴을 이용하여 쉽게 교체가 가능하도록 했다(전략부분에 대해서는 아래의 알고리즘 항목을 참고하도록 하자).
MapUtil 클래스를 통해서 Map에 접근함으로써 여기저기 중복될 수 있는 맵 관련 함수를 한 곳에 모았다. 게임의 전체적인 진행은 GameMain 클래스가 맡고 있으며 외부에서 GameMain 클래스를 통해서 게임을 진행하고 현재 진행 상태를 판단하게 된다.
3.알고리즘(Algorithm)
3.1 타워 알고리즘(Tower Algorithm)
타워의 알고리즘은 아주 간단하다. 타워의 발사 속도 및 범위를 이용해서 주변의 적을 검색하고 주변에 적이 있을 경우 총을 발사하면 된다. 발사 한 후에는 일정시간 이상 대기한 후 다시 발사하면 된다.
타워의 종류 또한 여러가지 있을 수 있으나, 일단 지금은 단발식 타워만 고려하고 업그레이드가 가능하도록 구현하였다.
3.2 적 알고리즘(Enemy Algorithm)
적의 알고리즘은 약간 까다롭다. 적의 레벨에 따라서 여러 알고리즘이 존재할 수 있는데, 아래와 같은 요건을 고려하였다.
- 무조건 시작점에서 출구점 방향(왼쪽에서 오른쪽)으로 이동해야 한다.
- 벽 및 타워는 통과할 수 없다.
-
적은 타워의 영향권을 가끔 벗어날 수 있다.
- 저 레벨의 적은 타워의 발사 범위 영향을 거의 고려하지 않는다.
- 고 레벨의 적은 타워의 발사 범위 영향을 많이 고려한다.
글로 쓸려니 약간 추상적인데, 코드로 보면 간단하다. 테스트 방법 및 코드는 아래를 참고하자.
3.3 적 알고리즘 테스트
MFC를 이용해서 간단히 알고리즘을 테스트하는 프로그램을 제작했다. 직접 눈으로 보면서 프로그래밍하면 더 나을 것 같아서 테스트 프로그램을 만들었다.
<알고리즘 테스트 화면>
각 ASCII 값이 나타내는 의미는 아래와 같다.
- "1" : 타워. 실제 NDS로 포팅된 후에는 "T"로 바뀜
- "X" : 적
- "@" : 벽
- 붉은색 점 : 타워에서 발사된 총알
프로그램의 흰 바탕 위에 클릭을 하면 적절히 타워("1")이 설치되고 시작을 누르면 시뮬레이션이 시작된다. 더블 버퍼링을 하지 않았기 때문에 눈이 아프다는 큰 문제가... ㅜ_ㅜ
테스트 프로그램은 알고리즘을 테스트하기 위한 프로그램이고, 추후 알고리즘을 추가하고 싶을 때 먼저 테스트 한 후 NDS로 포팅하면 된다. 테스트 프로그램은 아래 첨부 파일에 올려 놓았다.
3.4 알고리즘 구성 방법
적(Enemy)는 다양한 알고리즘으로 구성되어야 하므로 Strategy 패턴을 이용하여 구성하였다. 아래는 전체 클래스 다이어그램에서 전략 알고리즘 부분을 표시한 부분이다.
<클래스다이어그램-Strategy 패턴>
현재 3가지 타입의 전략이 있는데, 목표를 향해 직선으로 이동하고 중간에 장애물이 있을 때, 아래 위로 살짝 피하는 MoveStraightStrategy를 필두로 하여, 그것을 상속받아서 조금 수정한 AvoidTowerStrategy, 그리고 멍청하게 행동하는 FoolishStrategy가 있다.
전략은 적이 생성될 때 랜덤하게 선택된다.
3.5 알고리즘 추가 및 테스트
알고리즘은 아래의 CStrategy를 상속받아서 DeterminDirection() 함수를 구현해 주기만 하면 끝난다.
- #define DIRECTION_UP 1
#define DIRECTION_DOWN 2
#define DIRECTION_LEFT 3
#define DIRECTION_RIGHT 4 -
- /**
움직임을 결정하는 전략
*/
class CStrategy
{
protected:
bool IsCanGo( int iX, int iY ); - public:
CStrategy( void );
virtual ~CStrategy( void );
virtual int DetermineDirection( int iX, int iY, int iLastDirection ) = 0;
};
리턴값으로 DIRECTION_UP 과 같은 방향 매크로를 넘겨주면 그 방향으로 이동한다. iLastDirection에 이전에 움직였던 방향값이 넘어옴으로 이를 잘 활용하면 여러가지 패턴을 만들 수 있다. 실제 구현 예제는 위를 상속받은 구체 Strategy 클래스를 참고하도록 하자.
3.NDS 포팅
3.1 NDS 개발 환경 및 포팅
NDS에 윈도우 라이브러리가 구현되어있으므로(물론 내가 만들었다. 자세한 내용은 02 NDS 윈도우 시스템(Windows System)을 참고하자) 위에서 설명한 알고리즘 테스트 프로그램의 소스를 크게 수정없이 사용할 수 있다. 차이라면 개인적인 취향 때문에 함수 몇개가 덜 구현되거나 스타일이 조금 다르다는 정도...?
아무것도 없는 허허벌판(??)에서 윈도우 라이브러리를 사용하기가 쉽지 않은데, 그래서 템플릿으로 사용할 수 있는 프로젝트를 올려놓았다. 26 윈도우 라이브러리(Window Library) 사용을 위한 프로젝트(Project) 만들기에서 프로젝트 파일을 찾을 수 있다. libfat도 같이 사용하도록 되어있으니 필요없는 사람은 makefile을 수정해서 빼도록하자(libfat를 빼니 홈브루 크기가 120K 정도 줄어든것 같다. @0@ 이럴수가!!! ).
포팅에 대한 내용은 크게 다루지 않을 것이며 궁금한 사람은 Diff 프로그램으로 위의 테스트 프로그램과 NDS로 포팅된 소스의 내용을 비교해 보면 알 수 있을 것이다. 메인 소스는 거의 바뀌지 않았음을 알 수 있다. 이 얼마나 행복한 일인가... ㅜ_ㅜ
3.2 실행 화면 및 게임 방법
게임 방법은 아주 간단하다. 타워를 클릭하면 설치하는 데, 일단 설치된 타워에 인접해서 설치는 불가능하다는 조건만 명심하면 된다(이 조건으로 인해 게임 난이도가 살짝 올라갔다. ㅜ_ㅜ). 즉 대충 놓으면 결과적으로 화면에 놓을 수 있는 타워의 개수도 적어지고 게임이 일찍 끝날 확률이 높다.
- Select 버튼 : 게임을 처음부터 다시 시작
- Start 버튼 : 펌웨어 화면으로 이동
- 빈곳에 터치 스크린 클릭 : Money가 5 이상 있을 때 타워 설치. 단 인접한 곳에 타워가 없어야 함
- 타워에 터치스크린 클릭 : Money가 20이상 있을 때 타워 업그레이드. 타워는 3단까지 업그레이드 가능
<게임을 실행한 화면>
4.마치면서...
디펜스 타워에 빠져서 개발하게 된 홈브루 치고는 좀 허술한데... 실제로 플레이 해보니 나름 할만해서 만족하고 있다. 추후 업그레이드는 별로 고려하지 않고 있지만, 적의 알고리즘이나 타워 설치 부분은 아쉬운 부분이 많아서 업그레이드 할지도...
매번 프로그램을 작성하면서 느끼는 것이지만 정말 UI에 소질이 없는 것 같다. 프로그램 작성하는 시간보다 그림 그리는데 시간이 더 많이드니... ㅡ_ㅡa... 이거 원 산출이 안맞아서... ㅜ_ㅜ..
심심하다면 한번쯤 다운 받아서 해보자~ @0@)/~
5.첨부
- SmileWar.zip : NDS 용 프로젝트 파일
- DefenceTest.zip : 윈도우용 테스트 프로젝트 파일
- Defence_Tower.ppt : PPT 파일
이 글은 스프링노트에서 작성되었습니다.
'NDS 홈브루(Homebrew) > 기타 NDS 홈브루(Homebrew)' 카테고리의 다른 글
닌텐도 DS( NDS )에서 작동하는 작은 커널( Operating System, OS ) (2) | 2007.11.18 |
---|---|
08 NDS 홈브루(Homebrew) - KKAMAGUI NDS Shell (1) | 2007.11.14 |
07 NDS 홈브루(Homebrew) - KNG(KKAMAGUI NDS Graphic) File 변환 툴 (0) | 2007.11.14 |
06 NDS 홈브루(Homebrew) - 소프트웨어 리셋 라이브러리(Software Reset Library) (0) | 2007.11.14 |
05 NDS 홈브루(Homebrew) - MP3 Player 만들기 (4) | 2007.11.14 |