Claude Code로 레이저 드라이 파이어 사격 게임을 만들었습니다: 웹캠이 모니터를 보고 레이저 적중을 판정합니다 (오픈 소스, 무료)
I built a laser dry-fire shooting game with Claude Code: a webcam watches your monitor and scores laser hits (open source, free)
핵심 요약
Claude Code를 활용해 웹캠으로 레이저 사격 위치를 추적하고 판정하는 오픈 소스 드라이 파이어 사격 게임을 개발했습니다.
- Claude Code 활용 — 개발자가 직접 코딩하지 않고 Claude Code를 통해 게임 로직과 디버깅을 전적으로 수행함
- 작동 원리 — 웹캠이 모니터 화면을 실시간으로 분석하여 레이저가 닿은 픽셀을 추적하고 타격 판정을 내림
- 기술적 특징 — MCP 서버를 통한 실시간 측정값 확인 및 변이 테스트를 통해 신뢰성 높은 사격 판정 구현
- 사용 요구 사항 — 윈도우 환경, 60fps 웹캠, 무광 모니터, 그리고 레이저 트레이너 권총이 필요함

ScreenPlink를 Claude Code로 약 2주 동안 만들었어. 이건 모니터를 표적으로 삼는 레이저 건 사격 게임이야. 레이저 훈련용 권총이나 실제 총에 레이저 카트리지를 끼워서 화면을 쏘면 돼. 모니터 옆에 둔 웹캠이 사람 대신 화면을 지켜보고 있다가, 어느 픽셀을 맞췄는지 계산해서 그 자리에 총구멍을 뚫고 표적을 쓰러뜨리는 방식이지.
9가지 훈련 모드, 점수판이 있는 15가지 표적, 17발 탄창, 그리고 한 화면에서 2인 플레이까지 지원해. 양손에 권총을 들고 혼자서 두 명 몫을 다 할 수도 있어. 카메라 프레임 하나에 레이저 두 개가 들어와도 각각 별개의 사격으로 인식하거든.
90초짜리 트레일러 보면 대충 어떤 느낌인지 알 거야.
카메라를 꼭 화면 정면에 둘 필요도 없어. 비스듬하게 놔도 다 지원해. 앱이 모니터에 띄운 마커를 스스로 찍어서 위치를 보정하니까, 영점 잡느라 총알 낭비할 일도 없지.
Claude Code로 어떻게 만들었나
코드는 사실상 전부 Claude Code가 짰어. 나는 게임을 설계하고 Claude한테 지시 내리고, 모니터에 총 쏘면서 뭐가 문제인지 판단만 했지. 직접 코딩한 건 하나도 없어.
제일 힘들었던 건 게임 로직이 아니었어. 에이전트가 모니터를 직접 볼 수도 없고 방아쇠를 당길 수도 없는 상황에서, 물리 세계를 측정하는 프로그램을 개발하고 디버깅하게 만드는 게 진짜 골치 아팠지.
-
인프로세스(in-process) MCP 서버를 써서 Claude가 실행 중인 앱에 직접 물어보게 함. 최신 카메라 프레임, 감지기가 후보군으로 잡은 모든 블롭(blob)의 계산 결과(왜 탈락했는지까지 포함), 화면과 카메라 좌표계에 각각 뭐가 그려졌는지, 그리고 전체 화면 모드에서도 포커스를 뺏지 않고 키 입력이나 클릭을 주입하는 기능까지 다 노출했어. 앱이 내린 결론이 아니라 측정값 자체를 반환하게 했는데, 앱이 내리는 결론은 맨날 틀렸거든. 한 번은 "측정된 사격의 100%가 기준 통과"라고 찍어놓고, 바로 다음 줄에 자기 테스트 점이 기준치 미달이라는 측정값을 띄우더라고. 이 방식 덕분에 몇 시간 걸릴 디버깅을 90초 만에 끝냈어. 예를 들어, 빌드할 때마다 자꾸 "카메라 연결 해제됨"이라고 뜨는 문제가 있었거든. MCP를 통해 Claude가 0.91mm로 측정된 직전 보정값을 읽고, 셀프 체크를 다시 돌려서 12개 중 12개를 통과시킨 다음, 번들에서 빠진 아트워크 파일 하나 때문에 페인트 핸들러에서 예외가 발생했다는 걸 찾아냈어. "이 프레임은 유리창 위에 있다"는 신호가 뜨기 전에 예외가 터져버리니까, 페인트 대기 시간이 다 끝나버려서 카메라 탓으로 돌렸던 거지. 앱 로그에는 하나도 안 나오는데, 실행 한 번에 트레이스백이 1,722개나 찍히더라고.
-
테스트가 실패할 수 있게 만들기. 전체 실행 하네스가 첫 실행 직후에 바로 종료되면서 무조건 성공으로 보고하는 바람에, "8번 중 8번 콜드 스타트 성공" 같은 수치는 아예 측정조차 안 되고 있었어. 해결책은 뮤테이션 테스트였지. 일부러 알려진 오류들을 다시 집어넣고, 테스트가 빨간불을 띄우는지 확인하는 거야. 처음 돌렸을 때 오류 7개를 넣었는데 3개가 살아남더라. 지금은 6개 러너에 걸쳐서 326번씩 테스트를 돌리고, 326개 오류를 전부 잡아내.

