강께르의 개발일지
[Project] 발표를 마치며 본문
- 마지막 WINAPI 2D C++ 프로젝트를 마쳤다.
- 3주라는 시간을 통해 새롭게 시도한 장르인 턴제 전략 게임을 만들게 됐다.
- 일단 발표를 마친 오늘, 3주라는 시간을 돌아보면 3주는 게임을 만들기에 시간이 모자르다는 생각이 들었다.
- 8월24일에 본격적인 프로그래밍이 시작된 그날부터 30일까지 맵툴 기능을 하나를 구현하기 위해 많은 시간이 소비된 것도 있고, 구조적인 문제를 다시 생각해보고 구현하려고 했던 것도 있어서 시간이라는 면에서 부족하다는 느낌을 항상 느꼈다.
- 물론 목적한 기능을 대부분 구현했고 시작과 끝이 있는 하나의 게임이라고 부를 수 있는 것을 완성했다.
- 이보다 앞서 진행한 두 프로젝트는 미니게임 형식의 보스전 하나만 있거나, 시스템은 구현되어있지만 컨텐츠면에서 빈약하다고 느껴지기에 완성은 했지만 완성하지 않은 듯한, 포트폴리오로 내용으로 쓸만한 게 없을 것 같은 결과였다.
- 첫 프로젝트가 유독 그랬기에 그 이후 프로젝트는 알고리즘, 디자인 패턴 등 프로그래밍 부분에 나에게 새롭게 도전해볼 동기를 부여했고 저번 팀프로젝트가 그런 발판을 다졌던 시간이라면 이번엔 많은 것을 이야기하고픈 프로젝트 하나가 완성된 것 같다.
- 물론 원하는 모든 기능을 구현한 것은 아니다. 맨 처음 기획했던 사령관 캐릭터를 만들어 게임의 볼륨을 풍성하게 하고팠으나 중간에 있던 구조적인 변화가 시간을 더 잡게 되었기에 시도하지 못했다.
- 초기 기획이 아니더라도 중간에 강사님께 추천받은 시도들도 하지 못한 것들이 있다.
- 메시지 매니저를 만들어 메시지 기반으로 동작하는 게임 시스템을 만들 수 있었으나 기능 구현에 시간이 부족해 퍼사드 패턴 클래스의 멤버 함수로 서브 시스템을 관리하는 느낌을 메시지 함수라 칭하며 구조를 구축해보는 정도만 해봤다.
- 그리고 커맨드 패턴을 이용한 리플레이 기능도 하고 싶었다. 커맨드 클래스를 저장하는 히스토리라는 싱글톤 클래스를 만들어 그곳에 있는 컨테이너를 접근하여 커맨드 클래스를 하나씩 excute한다면 그것이 플레이 내용을 불러올 수 있었을텐데 그것을 시도조차 할 시간이 없었다는 건 너무 아쉬운 부분이다.
- 개발 중에 아쉬운 부분은 없지는 않았다. 일정 관리, 구조적인 큰 그림 그리기 등 아직 아마추어 개발자로서 미숙한 부분도 있었다.
- 개발 초기 시작은 좋았으나 약 7일을 맵툴 기능을 구현하는데에만 시간을 할애했다는 것은 스스로에게 마이너스 요소라고 생각된다. 지금 생각하면 이전의 맵툴 구현을 떠올려 시간을 단축할 수 있었음에도 불구하고 새로운 구조적 시도나 시스템을 구축하는 것보다 더 많은 시간을 할애된 것은 구현 하지 못한 개발 사항들을 떠올려봤을 때 매우 아쉬운 점이다.
- 맵툴에 대해서는 이야기할 게 많다. 4방향 타일 검사를 이용한 도로 및 강 타일 렌더 결정하는 것, 8방향 검사를 이용한 바다 타일 결정하는 것에 시간이 많이 들어가긴 했다. 4방향은 16가지에 대한 상황을 특정하여 렌더를 결정하면 되지만 8방향은 2진수로 따졌을 때, 2의 8승 가지의 상황이어서 255가지에 대한 상황을 고려하고 바다 타일 렌더를 결정했어야 하기에 이를 모두 고려하고 타일을 결정해주는 것은 시간이 많이 가는 일이었다.
- 파일 핸들을 이용한 저장과 불러오기도 쉽지 않았다. 처음 실수로 포인터로 선언된 클래스를 저장하려는 시도 때문에 몇 시간을 날리기도 했고 포인터를 포기하고 여러 개의 클래스를 저장하는 것을 포기하고 단 한 종류의 클래스만 저장하는 시도를 했던 끝에 맵 정보를 저장한 파일을 만들 수 있었다.
- 그 이후 맵 위에서 턴제 개념을 구현하는 일련의 과정은 어려웠다. 어떻게 턴제 느낌을 낼 것이며, 여러 클래스의 데이터 흐름을 전방선언으로 참조하여 해야하는지, 코드를 보는 입장에서 더러워질 것 같은 느낌에 막막한 느낌이 들었다.
- 강사님의 조언으로 게임 씬에서 필요한 클래스를 일괄적으로 관리하는 클래스를 만드는 시도를 해봤다. 이 시도가 퍼사드 패턴을 이용한 게임 매니저 구축이었다. 게임 매니저를 중심으로 데이터의 흐름을 관리하는 이 방법은 이전에 복잡한 데이터 참조를 하지않고 게임 매니저를 통한 데이터 참조와 기능 수행으로 프로그래밍하는 입장에서 편한 느낌을 받았다.
- 그래서 플레이어와 UI의 기능을 확실히 구분지을 수 있었고, 멤버 변수로 선언된 클래스인 서브 시스템에도 막대한 코드량을 부여할 필요 없이 하나의 시스템을 굴리기 위한 함수가 호출하면 그에 관련된 모든 서브시스템에 정보를 전달하는 식으로 굴러가기에 유용했다.
- 그 외에 이동 관련해서 알고리즘 시도가 있어서 좋았다. 에이스타는 복습하는 느낌으로 다시 파악하면서 내 게임에 어떤 식으로 적용할지 고민하는 시간이 길어서 어려웠지만 이를 통해 유닛이 특정한 조건에 의해 경로를 선택해 이동하는 모습을 구현할 수 있어 보기 좋았다.
- 이동 범위, 공격 범위를 구현하기 위해 찾았던 Floodfill 알고리즘은 검색 중에 발견한 행운인 것 같다. 이것이 제대로 적용될지 모르고 소스 코드를 보고 시험삼아 적용해봤는데 이동력과 지형를 고려한 적절한 이동범위를 출력해 내게 필요했던 알고리즘이었다.
- 커맨드 패턴이 리플레이 기능을 잃으며 낙동강 오리알 신세될 뻔 했지만, 커맨드 패턴만이 할 수 있는 이미 한 행동을 취소할 수 있는 기능인 undo를 구현하여 사용해볼 수 있었다. 이미 이동 기능을 수행했지만 취소 명령으로 undo함수를 호출해 사용했는데 이것 또한 잘 작동했다.
- 그렇게 발표 준비를 하고 오늘 발표를 했다. 특별하게 기획팀과 함께 한 발표여서 긴장되기도 했지만 그간 만든 내 것을 보여주는 자부심이었는지 쫄리지는 않았다.
- 발표 중에 내 스스로를 돌아보는 피드백을 한다면, 청중을 고려하지 않은 발표 내용이었던 것 같다. 설명이 친절하지 않고, 표현이 왔다갔다 했으며, 생각한 분량을 임의로 늘리거나 줄이는 등 발표를 어떻게 진행할지 준비가 덜 된 느낌을 스스로 받았다.
- 그래서 발표를 했고 말할 것을 말했지만 듣는 사람에게 제대로 내 것을 어필하지 못했다는 생각에 너무 아쉬웠다. 설명을 더 쉽게 할 걸, 플레이 시연을 더 다양하게 보여줄 걸 이라는 아쉬움이 끝나자마자 드는 발표였다.
- 그리고 기획팀의 투표 결과에 대해서 생각을 하게 됐다. 내 이름이 없다는 것에는 조금 맴찢..? 할 수 있어도 그 의미가 무엇인지 여기에 남기고 팠다. 아무래도 게임은 게임인 듯하다는 생각이 들었다.
- 첫번째 프로젝트 컵헤드는 겉으로 보이는 게임플레이가 돌아가는 것에 치중했다. 그래서 스프라이트 렌더를 하는데 프레임이 20개~40개 정도 되지만 아랑곳 않고 무조건 그 부드러운 프레임이 들어가야한다는 욕심에 기술적인 부분보다 플레이로 보여지는 것에 신경썼다.
- 그리고 다른 사람들의 결과물을 봤을 때, 장기적으로 기술적인 부분을 알아보고 적용해보는 것이 도움 될 것이라는 판단에 팀 프로젝트와 이번 개인 프로젝트는 구조적인 부분과 기술적인 부분을 치중했다.
- 그리고 발표했는데 기획팀에게는 선택받지 못한 게임이 됐다. 여기서 게임은 게임이다 라는 생각이 들었다.
- 기획팀은 아무래도 게임성에 중심을 두지 않았을까? 직관적으로 재밌어 보이는 게임과 기술적인 시도가 결합된 것을 선택한 것 같다.
- 물론 내것도 재미있는 게임이다. 하지만 기획팀을 배려해 플레이 시연을 더 설명하면서 보여줬어야했을텐데 라는 아쉬움이 있다.
- 이후 내 게임 개발에도 적용해야한다. 게임은 게임이다. 컵헤드 때 내가 느낀 것은 그건 공부하는 이 시기에 해당되는 것이고 점점 기업 연계나 실제 현업에서는 아무리 기술이 좋아도 재밌게 만들어내지 못하면 게임이 아니다. 물론 기획의 부분도 크게 작용할테지만...
- 그렇기에 앞으로의 개발에서 이런 밸런스를 잘 유지하고 개발도 하고 누군가에게 어필할 수 있으면 좋겠다. 내가 이걸 언제 다시 모르겠지만 도움이 되는 글이 됐으면 좋겠다.
- 기술문서와 영상을 제작하고 피드백을 받아서 다시 이 프로젝트의 마무리로 업로드를 하는 시간을 가져야겠다.
'프로젝트 > 210823~210910_개인프로젝트' 카테고리의 다른 글
[Project] 20210908_17일차 (0) | 2021.09.09 |
---|---|
[Project] 20210907_16일차 (0) | 2021.09.08 |
[Project] 20210906_15일차 (0) | 2021.09.07 |
[Project] 20210905_14일차 (0) | 2021.09.06 |
[Project] 20210904_13일차 (0) | 2021.09.05 |