[나의 앱 개발기] AI 코딩으로 갤러그 게임 만들기 — 며칠 만에 모바일 슈팅 게임이 나왔다

주말에 문득 어릴 적 오락실에서 동전 넣고 돌리던 갤러그가 떠올랐습니다. 그 픽셀로 된 우주선, 트랙터 빔에 잡혀가던 비행기, 합체 후 듀얼 파이터로 한풀이하던 그 감각. 요즘은 AI한테 "갤러그 만들어줘" 한 마디면 코드가 나오는 시대니까, 진짜 만들어지나 한번 굴려봤죠.


결론부터 말하면 며칠에 걸쳐 다듬으니 모바일에서 손가락으로 굴러가는 게임이 나왔습니다. 다만 처음 한 번에 완성된 건 절대 아니고, 진짜 게임답게 만들기까지는 여러 번 잡아채서 고쳐야 했어요. 그 과정을 정리해두면 비슷하게 시도하는 분들한테 도움이 될 것 같아 기록으로 남깁니다.

1. 시작은 "갤러그 만들어줘" 한 마디

2. 무기가 빈약해서 파워업 시스템 추가

3. 너무 쉬워서 밸런스 다시 잡기

4. 적이 너무 작아서 크기 2배 확대

5. 트랙터 빔 순간이동 → 거미줄처럼 천천히

6. 만든 게임 4개를 한 화면에 모은 오락실

* 시작은 "갤러그 만들어줘" 한 마디.


처음엔 별 욕심 없이 시작했어요. 갤러그 위키 문서를 통째로 복사해서 던지고 "이거 만들어줘. 모바일에서 할 거야" 정도. 풀버전으로 만들지 짧게 만들지, 터치 조작은 어떻게 할지, 배포는 어디로 할지 — 이 세 가지만 정해주니까 코드가 쏟아져 나오더라고요.

나온 결과물은 단일 HTML 파일 하나. 외부 라이브러리 없이 Canvas 2D로 그리고 Web Audio API로 사운드까지 절차 생성하는 방식이었습니다. 별 배경, 자코·고에이·보스 갤러그 스프라이트, 진입 경로, 포메이션 동작, 트랙터 빔, 듀얼 파이터, 보너스 스테이지까지 한 번에 들어갔죠.

여기까지 만드는 데 걸린 시간은 길지 않았는데, 막상 모바일에서 열어 플레이해보니 "이거 진짜 게임이 굴러가긴 하네" 싶은 동시에 어색한 점이 한두 가지가 아니더라고요. 그때부터가 진짜 시작이었습니다.

* 무기가 빈약해서 파워업 시스템 추가.



원작 갤러그가 사실 무기 종류가 없어요. 그냥 한 발씩 쏘는 게 전부고, 듀얼 파이터로 합체하면 두 발씩 쏘는 정도. 모바일에서 한참 플레이하다 보니 단조롭더라고요. 현대 슈팅 게임 감각이 익숙해진 사람한테는 자극이 부족합니다.

그래서 보스 같은 강한 적을 잡으면 캡슐 아이템이 떨어지고, 그걸 먹으면 무기가 바뀌는 시스템을 넣었습니다. 8종으로 풀버전을 가봤죠.

약자이름효과
T트리플샷3발 동시 발사
W5웨이샷부채꼴 5발
L레이저관통 빔, 5명까지 뚫음
H호밍 미사일가장 가까운 적 추적
O옵션양옆 보조기 부착
S실드1회 피격 방어
B화면 전체 적 제거
+스피드업이동속도 증가

각 아이템마다 색깔과 글자를 다르게 해서 어떤 게 떨어졌는지 한눈에 보이게 했어요. 노랑은 트리플, 주황은 5웨이, 파랑은 레이저, 보라는 호밍. 빨간 캡슐이 봄이라 멀리서도 "오! 봄이다!" 싶게요.

* 너무 쉬워서 밸런스 다시 잡기.

그런데 첫 버전은 드롭률을 너무 후하게 잡았습니다. 보스 격추 시 40% 확률로 드롭, 도전 적은 25%. 보스 두세 마리 잡으면 항상 풀파워 상태인 셈이죠. 긴장감이 확 빠지더라고요.

그래서 두 가지를 손댔습니다. 하나는 드롭 확률을 절반 이하로 낮추기, 다른 하나는 희귀도를 나누기.

보스 드롭률 40% → 12%
도전 적 드롭률 25% → 8%
같은 적에서 연속 드롭 방지 8초 쿨다운까지 추가!

희귀도는 Common 60%·Uncommon 30%·Rare 10%로 나눴어요. 레이저나 봄 같은 강한 무기는 Rare로 묶어서 정말 가끔 나오게 했습니다. 캡슐이 떨어졌을 때 "이게 뭘까?" 두근거리는 맛이 살아나는 거죠.

* 적이 너무 작아서 크기 2배 확대.

실제 갤러그 화면 캡처를 보면 적 한 마리가 화면 폭의 1/8~1/10 정도를 차지합니다. 굵직굵직한 픽셀 덩어리가 와글와글 모여 있는 게 갤러그의 시그니처거든요. 그런데 제가 만든 건 적 스프라이트가 너무 작아서 휑한 느낌이 들었어요.

그래서 스프라이트 렌더링 픽셀 크기를 1배에서 2배로 키우고, 포메이션 셀 간격도 22×18 → 30×28로 넓혔습니다. 충돌 반경, 총알 크기, 듀얼 파이터 오프셋, 옵션 보조기 위치까지 — 전부 비례해서 손봐야 해서 손이 좀 갔어요.

그리고 또 하나 문제가 있었습니다. 좋은 무기를 든 상태에서 적이 진입 경로를 따라 내려오다 도착도 하기 전에 다 죽어버리는 거예요. 빈 화면에서 멍하니 다음 적 기다리는 상황이 자주 생겼죠.

해결책은 두 가지였습니다. 첫째, 진입 중인 적은 무적으로 만들기. 총알이 닿으면 시안색 X자 스파크가 튀면서 튕기게 했어요. 그래야 "왜 안 죽지?"가 아니라 "아, 아직 보호받는 중이구나" 하고 자연스럽게 인지되거든요.

둘째, 진입 경로를 화면 상단에만 머무르게 다시 그렸습니다. 플레이어가 있는 하단까지 내려오지 않으니까 사격권 밖에서 안전하게 자리를 잡을 수 있게 됐죠.

* 트랙터 빔 순간이동 → 거미줄처럼 천천히.

가장 손이 많이 간 부분이 트랙터 빔이었어요. 원작 갤러그를 기억하시는 분이라면 알겠지만, 보스 갤러그가 빔을 쫙 펼치면서 비행기를 천천히 빨아들이는 그 연출이 명장면이잖아요? 처음 만든 버전은 빔 범위에 들어가는 순간 순간이동처럼 빨려가서 피할 틈이 1도 없었어요.

그래서 단계를 명시적으로 나눠서 다시 만들었습니다.

1. 빔 전개(1.2초). 보스가 제자리에서 멈추고 빔이 천천히 아래로 뻗어나갑니다. 이때는 빔에 닿아도 안 잡혀요. 플레이어가 회피 동선을 결정할 시간을 주는 거죠.

2. 포획 판정(1.5초). 빔이 완전히 펼쳐진 상태. 이 구간 안에 들어가야만 잡힙니다. 빔 안에 거미줄 같은 X자 패턴이 청록색으로 흐르게 해서 "지금 위험하다"는 신호를 시각적으로 강조했어요.

3. 흡수(2.5초). 잡히면 비행기가 천천히 회전하면서 보스 쪽으로 빨려 올라갑니다. 이전엔 1/3초 만에 도착하던 걸 약 2.5초로 늘렸죠. 거미줄에 감기는 벌레 느낌.

여기에 사운드도 손봤습니다. 150Hz에서 900Hz까지 천천히 올라가는 2초짜리 스윕음을 깔고, 흡수 끝에는 떨어지는 음을 하나 더 넣어서 빨려들어가는 무게감을 살렸어요.

* 만든 게임 4개를 한 화면에 모은 오락실.

이왕 이렇게까지 다듬은 김에, 그동안 만들어둔 다른 게임들도 같이 모아보고 싶더라고요. 너구리 아이템 수집 게임, 무한의 계단, 블록 대시까지. 게임마다 따로 URL이 있긴 한데 한 화면에서 골라 들어가는 게 더 좋잖아요.

이걸 한 HTML 파일에 다 통합하는 건 현실적이지 않아요. 각 게임이 이미 GitHub Pages에 배포돼 있으니까 iframe으로 불러오는 허브 페이지를 만드는 게 훨씬 깔끔합니다.

검정 배경 + 핑크 네온 간판
4개 게임이 캐비닛 카드로 나열
탭하면 iframe으로 게임 로드!

각 캐비닛마다 다른 네온 컬러를 줬어요. 갤러그는 핑크, 너구리는 노랑, 계단은 시안, 블록 대시는 초록. 상단엔 깜빡이는 "INSERT COIN TO PLAY" 문구를 넣고 별 배경을 깔아서 90년대 오락실 들어간 느낌을 냈죠. 모바일에선 2×2 그리드, 가로 모드에선 1×4로 자동 재배치되게 했고요.

* AI 코딩으로 게임 만들면서 느낀 점.

사실 처음엔 AI가 한 번에 완성품을 뽑아낼 줄 알았어요. 그런데 한 번에 나오는 건 "굴러가는 프로토타입"이지 "재미있는 게임"이 아니더라고요. 밸런스, 연출의 호흡, 시각적 피드백 같은 건 결국 사람이 플레이하면서 잡아내야 합니다.

대신 AI가 잘하는 건 명확하게 있어요. 스프라이트 그리기 코드, 충돌 판정, 포메이션 알고리즘, 사운드 절차 생성처럼 정형화된 부분은 정말 빠르게 뽑아냅니다. 제가 한 일은 주로 "이게 너무 쉬워" "이건 안 보여" "이건 너무 빨라" 같은 감각적인 피드백을 주고 다시 조정하는 거였어요.

1번 만에 완성하려고 하지 말고, 5번 10번 잡아채서 고쳐가는 마음으로 시작하면 됩니다. 그게 실제로 게임 디자이너들이 일하는 방식이기도 하고요.

* 마무리 정리.

코드 한 줄 안 써본 사람도 AI 코딩 도구만 잘 쓰면 모바일에서 굴러가는 슈팅 게임 정도는 만들 수 있는 시대입니다. 단, 한 번에 완성품을 기대하지는 말고 자기가 직접 플레이하면서 어색한 곳을 지적해주는 디렉터 역할을 해야 한다는 게 핵심.

저는 이번에 갤러그 하나 다듬으면서 게임 디자인이 얼마나 섬세한 작업인지 새삼 느꼈어요. 적이 진입하는 1초의 경로, 트랙터 빔이 펼쳐지는 1.2초의 시간, 무기 캡슐이 떨어지는 12% 확률 — 이런 숫자 하나하나가 재미를 만든다는 걸 직접 만지면서 알게 됐죠.

주말에 한 번씩 끄적이면서 만든 결과물이 GitHub Pages에 올라가서 핸드폰으로 굴러가는 모습을 보면, 묘하게 뿌듯합니다. AI가 코드를 써주는 시대에도 결국 "뭘 만들고 싶은가"는 사람 몫이라는 걸 다시 한 번.

이 글에 나온 코드와 게임은 개인 학습용으로 만든 것입니다.

이 블로그의 인기 게시물

[나의 앱 개발기] 코딩 모르는 직장인이 AI 문제출제 앱 혼자 만든 이야기 (feat. Claude, Next.js, Vercel)