부트캠프

콘솔앱으로 TextRPG 만들기3

noyyo 2023. 8. 23. 21:51

오늘을 마지막으로 콘솔로 RPG게임을 만드는 개인과제가 마무리됐다.

처음에는 원대한 꿈을 품고 시작했지만 내 능력을 너무 과신한것인지 생각한 기능들을 전부 구현하는데 실패했다.

아쉽긴 하지만 그래도 어느정도 UI 기틀을 잡아서 출력해볼 수 있어서 나름대로 만족하는 부분이 없는 것은 아니다.

 

콘솔에서 Text로 GUI를 구성해보는데에 집중했고 단순히 직접 문자열을 만들어서 출력하는 형식이 아니라 클래스 구조를 짜고 메소드들을 구현해서 최대한 게임 프레임워크처럼 구성해보려고 노력했다.

시작하면 GameManager, ScreenManager라고 이름지은 두 개의 클래스를 기반으로 GameManager는 플레이어 정보와 움직임등을 관리하고 ScreenManager는 맵과 UI를 관리한다.

UI는 UIWindow와 UIComponent로 나뉘고 실제 쓰이는 UI 객체들은 두 클래스를 상속받아서 작성하였다.

 

프로그램을 구현하면서 가장 애먹었던 것은 Console창에 문자열을 올바르게 출력하는 것이었다.

콘솔에 문자열을 출력하는 것은 Point라고 하는 x좌표와 y좌표, 그리고 하나의 string 값을 가지는 클래스를 만들어서 해당 좌표에 Point가 가지고 있는 string값을 출력하는 방식으로 구현했는데 문제는 Console에서 여러가지 문자를 출력할 때 모든 문자가 똑같은 너비를 가지는 것이 아니라 어떤 문자는 한칸을, 한글과 같은 어떤 문자들은 두 칸을 차지한다는 것이다.

때문에 글자에 따라 Point의 좌표가 하나, 혹은 두 칸씩 달라져야 했는데 아무리 찾아봐도 Console에서 문자의 너비를 측정하는 방법은 없었다.

덕분에 고심끝에 꼼수를 사용해서 너비를 측정했는데 한글과 같은 경우는 유니코드를 통해 분별했고 한글이 아닌데 2칸을 차지하는 문자는 직접 콘솔에 Write를 통해 출력한 뒤 콘솔의 커서가 2칸 옮겨졌는지 확인하는 방식으로 체크하게 되었다.

 

이 부분을 해결하고 여러 UI에서 발생하는 null 예외, Point를 통해 Draw()하려고 할 때 자주 발생했던 OutOfIndex 예외, 반복문에서 못 빠져나와 StackOverflow가 되는 등 여러 에러들도 해결하고 겨우겨우 플레이어를 움직이고 인벤토리창을 띄우고 인벤토리 내에서 위아래 방향키로 포커스를 옮기는 부분까지 구현할 수 있었다.

 

생각했던 목표는 여기에서 아이템 장착, 상점 및 구매, 판매, NPC와 대화, 맵 이동, 던전입장 후 몬스터와 실시간 전투, 아이템 드랍과 보상, 그에 필요한 UI들까지 구현하는 것이었는데 지금까지 걸린 시간을 보니 생각한 목표를 다 이루려면 못해도 일주일은 더 매달려야 할 것 같아 포기하기로 했다.

 

구현한 코드는 양이 꽤 되기에 블로그가 아닌 깃허브 링크를 올린다.

https://github.com/noyyo/PracticeProject/tree/main/ConsoleTextRPG

'부트캠프' 카테고리의 다른 글

팀 콘솔RPG 프로젝트  (0) 2023.08.28
콜백함수를 왜 쓰는가?  (0) 2023.08.25
콘솔앱으로 TextRPG 만들기2  (0) 2023.08.21
콘솔앱으로 TextRPG 만들기  (0) 2023.08.18
BlackJack 게임  (0) 2023.08.17