본문 바로가기

반응형

전체 글

(118)
1편: users.json이 한계에 온 날 — 신원 키 하나로 정리한 스키마 PlayTalk은 처음부터 DB 없이 시작한 사이드 프로젝트입니다. 회원 정보는 users.json, 게스트 전적은 guestStats.json, 친구 관계는 friends.json, 점수 랭킹은 rankings.json. 파일 네 개에 JSON을 통째로 읽고 통째로 쓰는 방식이었어요. 게임이 두세 개일 때는 이게 제일 빨랐습니다. 스키마 마이그레이션도 없고, 서버 켜면 바로 돌아가니까요.그런데 게임이 열 개를 넘고, 로그인 회원과 게스트가 섞이고, 친구 기능까지 붙으면서 슬슬 이상해지기 시작했습니다.파일 저장소가 아팠던 지점첫째, 같은 사람이 파일마다 다른 이름으로 존재했습니다. 로그인 사용자는 users.json 안의 id, 게스트는 guestStats.json의 uuid. 그래서 "친구 목록을 보여..
6편: "대부분 지고 가끔 크게 이긴다"를 숫자로 만들기 — 차트 모델 삽질기 이 게임의 심장은 차트입니다. 플레이어는 이 차트를 보고 "지금이 바닥이다" 판단해서 매수하니까요. 그래서 차트가 어떻게 움직이느냐가 게임의 재미를 좌우했는데, 여기서 제법 삽질을 했습니다. 문제 → 원인 → 재설계 과정이 꽤 깔끔하게 나와서 정리해봅니다.목표: 대부분 지고, 이길 땐 크게1편에서 말했듯 이 게임의 감성은 "역발상으로 바닥 잡겠다고 덤비지만 대부분 죽는다"입니다. 이걸 차트로 옮기면 이런 요구사항이 됩니다.승률은 낮아야 한다 (대부분 크아악).대신 이길 때는 크게 올라야 한다 (하락분을 만회할 만큼).계속 우하향해서 0에 처박히면 안 된다 (차트가 깨짐).말은 쉬운데, 이걸 숫자로 만드는 게 만만치 않았습니다.1차 시도: 하락 편향 랜덤워크 → 실패처음엔 단순하게 갔습니다. 매 순간 가격..
5편: 페페는 왜 못 쓰고 와작은 되나 — 밈 저작권과 AI 생성물의 오해 이 게임을 만들면서 가장 오래 고민한 주제가 사실 코드가 아니라 저작권이었습니다. 원본 짤은 페페(개구리)인데, 이걸 그대로 쓸 수가 없었거든요. 이 이야기는 밈을 소재로 뭔가 만들려는 분들에게 도움이 될 것 같아 따로 정리합니다.페페는 주인이 있고, 그 주인이 단속한다먼저 팩트부터. 페페 더 프로그(Pepe the Frog)는 명확한 저작권자가 있습니다. 원작자는 맷 퓨리(Matt Furie)라는 만화가고, 이 사람은 자기 캐릭터가 무단으로 상업적으로 쓰이는 걸 실제로 적극적으로 막아온 사람입니다. 경고장을 보내고, 플랫폼에 삭제 요청을 넣고, 소송까지 갑니다.즉 페페는 "인터넷에 굴러다니는 공짜 밈"이 아니라 주인이 있고, 그 주인이 권리를 행사하는 캐릭터입니다. 개인이 SNS에 짤로 공유하는 정도야..
4편: 도메인 사기 부담스러워서, 게임을 기존 사이트에 하위 페이지로 붙였다 게임이 완성됐습니다. 이제 배포할 차례인데, 여기서 아주 현실적인 벽에 부딪혔어요.도메인이 부담스러웠다처음엔 이 게임을 단독 서비스로 배포하려고 했습니다. 그럴듯한 도메인 하나 사서, 거기에 올리고요. 그런데 막상 하려니 마음이 걸렸어요.재미로 만든 밈 게임입니다. 얼마나 많은 사람이 할지도 모르고, 대부분은 한두 번 해보고 말 단발성 콘텐츠일 가능성이 높죠. 그런데 여기에 도메인 값을 매년 내는 게 아깝더군요. 도메인 등록하고, DNS 붙이고, 호스팅 잡고… 배보다 배꼽이 큰 느낌이었습니다.그러다 생각했어요. "어차피 나 플레이톡 운영하고 있잖아?"플레이톡은 제가 만들어서 운영 중인 랜덤 매칭 미니게임 사이트입니다. 이미 도메인도 있고, 배포 환경도 다 갖춰져 있죠. 그러니 이 게임을 굳이 따로 낼 게..
3편: 클로드코드와 SPEC 문서 하나로 게임 만들기 애셋이 준비됐으니 이제 코딩입니다. 그런데 이번엔 제가 직접 짜지 않고 **클로드코드(Claude Code)**에 맡겼습니다. 여기서 제가 나름 정착시킨 워크플로우가 있는데, 꽤 잘 굴러가서 공유해봅니다.프롬프트를 매번 쓰는 건 비효율적이다AI 코딩 도구를 쓰다 보면 흔히 하는 실수가, 매번 "이거 해줘 저거 해줘"를 즉흥적으로 프롬프트로 던지는 겁니다. 이러면 몇 가지 문제가 생겨요.이전에 뭘 요청했는지 기록이 안 남는다.AI가 맥락을 잃어버리면 다시 설명해야 한다.프로젝트가 커질수록 "지금 이게 어떤 상태였지?"가 헷갈린다.그래서 저는 SPEC.md라는 사양 문서 하나를 만들어서 그걸 단일 기준으로 삼았습니다. 게임의 모든 것 — 게임 루프, 상태 머신, 애셋 목록, 차트 로직, 색상 처리 방식, 심..
2편: AI로 게임 애셋 만들기 — 와작 뽑고, 배경 따고, 옷 색 입히기 게임 기획은 섰는데 그림이 문제였습니다. 저는 그림을 못 그리거든요. 그렇다고 외주를 맡기기엔 재미로 하는 프로젝트치고 과하고요. 그래서 AI 이미지 생성을 활용하기로 했습니다.캐릭터: 페페가 아니라 와작으로원본 짤은 페페(개구리)지만, 캐릭터는 **와작(Wojak)**으로 갔습니다. 이유는 저작권인데, 이 이야기는 워낙 중요하고 길어서 따로 한 편(5편)으로 뺐습니다. 여기서는 "와작 스타일의 슬픈 남자 캐릭터로 갔다" 정도로만 하고 넘어갈게요.와작은 그 삐뚤빼뚤한 MS 페인트 그림체에 텅 빈 눈이 특징입니다. 이걸 제미나이(Gemini)로 뽑았는데, 핵심은 일관성이었어요. 관찰·매수·크아악·부자, 이 네 포즈가 전부 같은 얼굴이어야 하거든요.방법은 이렇습니다.먼저 기본 와작 하나를 마음에 들 때까지 ..
1편: 주식 밈을 게임으로 만들어보기로 했다 — 기획 주식·코인 하는 사람이라면 한 번쯤 봤을 그 짤이 있습니다. 시장이 폭락하면 누군가 나타나서 이렇게 말하죠."시장에 피가 낭자하고 공포가 만연하다… 그래, 바로 지금이 타이밍이다!"그리고 자신만만하게 바닥이라며 매수하지만, 결국 그 사람도 말뚝에 묶여 "크아악!" 하며 울부짖습니다. 그 뒤로 또 다른 사람이 나타나 똑같은 소리를 하고, 또 물리고… 이 무한 반복이 이 밈의 핵심입니다. "바닥인 줄 알고 산 개미가 또 물린다"는 그 처절한 자조요.어느 날 이 짤을 다시 보다가, 문득 이걸 게임으로 만들면 재밌겠다는 생각이 들었습니다.왜 이게 게임이 될 수 있다고 생각했나게임으로 만들 소재를 볼 때 저는 "루프가 짧고 명확한가"를 먼저 봅니다. 이 밈은 그 조건이 완벽했어요.차트를 본다 → 바닥이라 판단하고..
대화가 끝났는데 왜 한쪽만 '대화 중'일까 — 진범은 친구 기능이 아니었다 (친구 기능 ③) 친구 기능을 네 조각으로 나눠 꼼꼼히 만들고, 각 조각마다 검증까지 마쳤습니다. 자동 테스트도 통과했고, 실제 브라우저 두 개로 대화 신청까지 돌려봤죠. 자신 있게 배포했습니다.그리고 얼마 뒤, 버그가 터졌습니다.이번 편은 그 버그를 추적한 이야기입니다. 결론부터 말하면, 범인은 친구 기능이 아니었습니다. 친구 기능은 그저, 예전부터 서버에 조용히 숨어 있던 버그를 처음으로 눈에 보이게 만들었을 뿐이었죠. 개인적으로 이번 시리즈에서 가장 인상 깊었던 디버깅입니다.그 전에 — 배포하자마자 발견한 구조 문제 하나진범 이야기 전에, 배포 직후 먼저 드러난 구조 문제를 짧게 짚고 갑니다.원래 친구 목록을 별도 페이지(/friends)로 만들었습니다. 랭킹 페이지처럼 독립된 주소를 갖는 화면으로요. 그런데 여기에..

반응형