[나의 앱개발기] 비개발자 네번째 게임 만들기 - 너구리 게임을 클로드와 함께 (Ponpoko 클론)
중2 딸이 폰으로 가볍게 시간 보낼 게임을 만들어주고 싶었거든요. 지금까지 톰골드런 방식 게임이랑 무한의 계단을 만들어서 깃허브 페이지에 올려뒀는데, 딸 반응이 생각보다 괜찮아서 한 발 더 욕심을 부려봤습니다.
이번에 도전한 건 어릴 적 오락실에서 봤던 "너구리(Ponpoko)". 사다리 타고 올라가서 과일 먹고 적 피하는 그 게임이죠. 결과부터 말씀드리면 다섯 번 갈아엎었고, 그래도 끝은 봤습니다. 오늘은 그 과정을 정리해보려고요.
1. 처음엔 피아노 타일을 만들려 했었죠
2. 너구리로 방향을 틀고 첫 번째 벽에 부딪힌 순간
3. 정통 너구리 스타일로 다시 처음부터
4. 모바일 조작이라는 끝나지 않는 숙제
5. 8번째 앱을 만들며 느낀 것들
* 처음엔 피아노 타일을 만들려 했었죠.
딸한테 추천 게임 몇 개 보여줬더니 피아노 타일 스타일이 좋다고 하더라고요. 박자 게임이라 익숙한 곡도 넣을 수 있고, 그래픽도 예쁘게 뽑을 수 있을 것 같아서 일단 만들었거든요.
버전 1까지는 잘 됐어요. 타일이 떨어지면 클릭으로 없애는 단순한 방식이었죠. 그런데 욕심이 발동해서 "원작처럼 하단에 판정 라인을 두고, 라인에 닿을 때 눌러야 점수가 되는 방식"으로 바꿨더니 그때부터 꼬이기 시작했습니다.
PC 크롬 미리보기에서는 마우스 클릭이 안 먹히는 거예요. 모바일 터치는 되는데 말이죠. 알고 보니 클로드 미리보기 창이 iframe 안에서 돌아가는데, 투명한 div에 직접 mousedown 이벤트를 거는 방식이 iframe 환경에서 막히더라고요.
버전 7까지 가도 해결이 안 돼서 결국 "이건 미리보기 환경 자체의 한계라 다른 게임으로 가자"고 결정했습니다. 처음엔 좀 허무했는데, 돌이켜보면 디버깅 과정에서 이벤트 처리, 좌표 변환, 멀티터치 처리 같은 걸 다 한 번씩 다뤄봤거든요. 헛수고는 아니었어요.
* 너구리로 방향을 틀고 첫 번째 벽에 부딪힌 순간.
다음으로 딸한테 "방구차, 갤러그, 너구리 알아?"라고 물어봤더니 다 안다더라고요. 그중에 너구리부터 만들기로 했죠. 캐릭터가 귀엽고 조작도 단순해 보였거든요.
첫 시도는 격자(grid) 기반이었어요. 20×16 칸으로 맵을 짜고, 칸 단위로 한 칸씩 이동하는 방식. 동키콩 같은 느낌이었죠. 그런데 사다리 타고 올라갈 때 위쪽 플랫폼이 막혀서 캐릭터가 못 올라가는 버그가 생겼습니다.
이게 단순한 버그가 아니라 게임 설계 자체의 문제더라고요. 사다리가 플랫폼을 관통해야 하는데, 격자 시스템에서는 그게 자연스럽지가 않아요. '='라는 새 타일을 만들어서 플랫폼이면서 사다리'로 처리해봤는데, 맵의 열(column)들이 정확히 안 맞아서 또 막혔습니다.
여기서 한 가지 배운 게 있어요. AI한테 "사다리 문제 고쳐줘"라고만 하면 자기 마음대로 구조를 바꿔버립니다. 격자 방식이었던 게 어느새 부드럽게 움직이는 캐릭터로 바뀌어 있고, 점프 기능은 사라져 있고. 그래서 그다음부터는 "v2 방식 유지하고 사다리만 고쳐줘"처럼 변경 범위를 명확히 지정하기 시작했어요. 이게 비개발자 입장에서는 정말 중요한 노하우인 것 같습니다.
* 정통 너구리 스타일로 다시 처음부터.
네 번째 버전을 만들었는데 딸이 보더니 "이거 너구리 아닌데?"라고 하더라고요. 그래서 원작 스크린샷을 찾아서 보여줬어요. 시안색 발판, 빨간 너구리 캐릭터, 떨어지는 당근, 노란 호리병, 빨간 세모 덫. 그제서야 "아, 이게 너구리지" 싶었습니다.
제가 만든 건 격자 기반 동키콩 클론이었던 거예요. 너구리는 본질적으로 중력이 있는 플랫포머예요. 점프가 핵심이고, 발판은 공중에 떠있고, 사다리는 발판들을 연결하죠. 이걸 알고 나서 코드를 처음부터 다시 짰습니다.
이번엔 격자 대신 픽셀 단위 좌표를 썼어요. 물리 처리는 이런 식이죠.
공식 : 새 Y 위치 = 현재 Y + 속도 × 시간
공식 : 새 속도 = 현재 속도 + 중력 × 시간
매 프레임마다 캐릭터에 중력을 더해서 떨어지게 하고, 발판과 부딪히면 멈춰서 발판 위에 서 있는 거예요. 점프 버튼을 누르면 위 방향 속도를 한 번 확 줘서 잠시 올라가다가 다시 중력에 의해 내려오고요. 글로 쓰면 단순한데 실제로 구현해보면 "낙하 중일 때만 발판 위에 착지 가능"처럼 작은 조건 하나하나가 다 중요하더라고요.
| 버전 | 방식 | 결과 |
|---|---|---|
| v1 | 격자 + 사다리만 이동 | 너구리 같지 않음 |
| v2-v4 | 격자 + 사다리 통과 처리 | 사다리 막힘 버그 |
| v5+ | 중력 + 점프 + 플랫포머 | 제대로 된 너구리 |
그래픽도 정통 아케이드 느낌으로 다시 잡았어요. 시안색 발판, 빨간 너구리, 도트 스타일. CRT 모니터 스캔라인 효과까지 넣으니까 진짜 오락실 느낌이 살더라고요. 딸도 "이제 좀 너구리 같다"라고 인정해줬습니다.
* 모바일 조작이라는 끝나지 않는 숙제.
PC에서 키보드로 하면 진짜 잘 돌아가요. 그런데 딸이 폰으로 해보더니 "조작이 너무 어렵다"고 하더라고요. 그래서 모바일 UI를 세 가지 방식으로 만들어봤습니다.
1. 화면 하단 버튼 방식.
방향키 4개 + 점프 버튼을 하단에 배치했어요. 멀티터치도 처리해서 이동하면서 점프도 되게요. 그래도 딸은 어렵다고 하더라고요. 화면이 작아서 버튼이 작고, 캐릭터도 잘 안 보이고.
2. 드래그 방식.
화면 어디든 드래그하면 그 방향으로 가게 했죠. 점프는 별도 버튼. 그런데 이건 "엄지로 드래그가 너무 어렵다"고 했어요. 손가락이 화면 위에 계속 있어야 하니까 화면도 가리고요.
3. 화면 절반 분할 방식.
화면을 좌우로 반 나눠서 왼쪽=이동, 오른쪽=점프. 왼쪽 영역에서 누른 위치에 따라 좌/우가 결정되고, 위아래 스와이프로 사다리를 타는 방식이에요. 이게 그나마 제일 나았는데, 솔직히 말하면 정통 너구리는 모바일에서 완벽하게 즐기기 어려운 게임이라는 결론에 도달했어요.
저는 개인적으로 이렇게 생각합니다. 너구리는 PC + 키보드가 정답이에요. 모바일로 옮기려면 자동 점프, 자동 사다리 같은 단순화가 필요한데, 그러면 원작의 맛이 사라지죠. 그래픽과 시스템을 그대로 살리고 싶다면 PC로 즐기는 게 맞다고 봅니다.
또 한 가지 배운 게 있어요. "시작하자마자 사다리 올라가니까 덫에 죽어요"라고 딸이 알려줬는데, 코드만 봐서는 모르는 문제거든요. 첫 사다리(x=60) 도착 지점에 덫이 있었던 거예요. 실제로 플레이해봐야 보이는 문제죠. 테스트는 결국 사용자 손에 쥐여줘야 진짜가 보인다는 걸 다시 한번 느꼈습니다.
* 8번째 앱을 만들며 느낀 것들.
비개발자가 AI랑 같이 앱을 만들기 시작한 지 좀 됐는데, 이번이 8번째 게임 같아요. 톰골드런, 무한의 계단부터 시작해서 테트리스, 양배추 모험, 블록 대시까지 만들어봤거든요. 하나씩 만들 때마다 한 단계씩 어려워지는 게 느껴져요.
첫 번째 - 그냥 따라하기
두 번째 - 뭘 모르는지 알게 됨
여덟 번째 - 방향을 지시할 수 있게 됨!
특히 이번 너구리 만들면서 크게 느낀 게 있어요. AI한테 막연하게 "고쳐줘"라고 하면 다른 데까지 건드려서 더 망가뜨립니다. 대신 "v2 구조를 그대로 유지하고 사다리 통과 로직만 수정"처럼 범위를 좁혀서 지시하면 잘 따라옵니다. 비개발자 입장에서는 이게 가장 중요한 노하우인 것 같아요.
그리고 또 하나, 게임 디자인은 코드보다 어렵다는 것. 사다리 위치 하나, 덫 위치 하나가 게임 경험을 완전히 망칠 수 있더라고요. 코드는 AI가 짜주지만, "어떤 게임이 재밌는지"는 직접 플레이해보고 판단해야 하더라고요.
* 마무리 정리.
다섯 번 다시 만든 너구리 클론. 결과물은 PC에서는 꽤 괜찮게 돌아갑니다. 모바일에서는 조작이 좀 어렵지만 그건 게임 자체의 본질적인 한계라는 걸 받아들였어요.
비개발자가 AI 끼고 게임을 만들면서 느낀 건, 완성도보다 중요한 게 "포기하지 않는 것"이라는 점입니다. 한 번에 잘 안 되더라도 갈아엎고 다시 만들면 됩니다. 그 과정에서 다음번엔 더 잘 만들 수 있는 감각이 쌓이거든요.
딸이 폰에서 가볍게 해볼 수 있는 게임이 하나 더 늘었으니, 그걸로 충분히 의미 있는 작업이었다고 생각합니다. 다음엔 갤러그를 만들어볼까 하는데, 좌우 + 발사만 있어서 모바일 친화적이거든요. 너구리 만들면서 배운 플랫포머 물리 처리 노하우가 갤러그에도 분명 도움이 될 거라 봅니다.
한 줄씩, 한 게임씩, 천천히 가보려고요.