Reddit

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로 만든 레이저 사격 연습 게임: 웹캠이 모니터의 레이저 명중점을 추적합니다

웹캠으로 모니터에 비친 레이저 점을 추적하는 Windows용 건식 사격 게임입니다. 개발자는 무광 모니터와 60fps 카메라를 전제로 아홉 가지 훈련 모드를 만들었고, Claude Code로 구현하며 실제 하드웨어 측정과 테스트 검증에서 겪은 문제도 공개했습니다.

에디터 노트

이 프로젝트의 가장 큰 기술적 성과는 게임 자체보다 실제 하드웨어의 측정값을 에이전트가 확인하도록 만든 데 있습니다. 화면 그리기 예외가 카메라 문제로 오인된 사례와 성공을 잘못 보고한 테스트는 물리 장치와 소프트웨어를 함께 다루는 디버깅의 어려움을 구체적으로 보여줍니다. 변이 테스트와 연속 콜드 스타트 조건도 그 실패에 대응한 조치입니다. 다만 개발자가 검증한 장비는 모니터 한 대와 카메라 한 대뿐입니다. 댓글에서 정확도 비교 질문이 나왔지만 답은 제공되지 않았고, 84~89% 감지율도 개발자가 댓글에서 밝힌 수치입니다. 다른 장비 조합에서 같은 결과가 나오는지는 아직 확인되지 않았습니다.

AI 요약

모니터에 레이저 훈련용 권총이나 레이저 카트리지로 조준하면, 옆에 둔 웹캠이 화면에서 레이저가 닿은 픽셀을 찾아 점수와 명중 효과를 표시합니다. 탄약을 쓰지 않는 건식 사격 연습용 게임이며, Windows에서 무료로 실행할 수 있고 Apache-2.0 라이선스로 소스 코드를 공개했습니다.

게임 구성과 설치

정적 표적, 튀는 공, 반응 훈련, 화면 정리, 팝업 표적 등 아홉 가지 훈련 모드와 점수 링이 그려진 표적 15개를 제공합니다. 한 탄창은 17발이며 빗나가도 탄약을 소모합니다. 한 화면에서 두 명이 각자 탄창과 점수를 따로 관리하며 플레이할 수 있고, 동시에 쏜 두 레이저도 별도 발사로 감지한다고 설명합니다. 메뉴도 표적으로 조작하므로 키보드를 쓰지 않아도 됩니다.

Windows용 배포판은 230MB이며 압축을 푼 뒤 Play.cmd를 실행합니다. Python이나 별도 설치 프로그램은 필요하지 않습니다. Doctor.cmd는 사용 가능한 카메라를 검사하고 결과를 보고서로 저장합니다. 출시판에는 Claude Code에 설치를 맡길 때 쓰는 CLAUDE.md와 .mcp.json도 포함했습니다. macOS 지원은 아직 없으며, 직접 소스에서 실행하려면 Python 가상 환경에 요구 패키지를 설치해야 합니다.

감지 원리와 하드웨어 조건

개발자는 레이저 훈련용 장치가 방아쇠를 당길 때 약 100ms 동안 붉은 빛을 내므로 60fps 카메라가 약 여섯 프레임에서 이를 포착한다고 설명합니다. 한 프레임만 잡힌 빛은 잡음으로 보고, 여러 프레임에서 이어지는 붉은 점을 발사로 판별합니다. 감지기는 단순히 밝은 픽셀을 찾지 않고 빨강에서 녹색과 파랑 중 더 강한 값을 뺀 신호를 봅니다. 그래서 화면은 회색과 어두운 색 위주로 구성했습니다. 화면의 붉은 요소나 레이저 아래의 밝은 부분은 오감지 또는 감지 방해 요인이 될 수 있습니다.

모니터는 무광이어야 합니다. 무광 코팅은 레이저 점을 여러 방향으로 산란시켜 화면 옆쪽에 둔 카메라도 볼 수 있지만, 유광 표면은 반사를 한 방향으로 보내므로 발사 위치에 따라 반사 방향이 달라집니다. 개발자는 Dell U4320Q 42.5인치 4K 무광 모니터와 Razer Kiyo Pro, LaserLyte LT-TTL 훈련용 레이저 두 개로만 프로그램을 측정했습니다. 카메라와 방의 조건을 실행 중 측정하도록 만들었지만 다른 장비 조합의 동작은 확인하지 못했다고 밝혔습니다. 카메라 위치와 조명을 포함한 문제 해결 문서에는 정상 동작 때의 수치와 로그 확인 방법을 적었습니다.

Claude Code 개발과 검증

개발자는 약 2주 동안 Claude Code가 구현한 코드를 바탕으로 게임을 만들었습니다. 직접 코드를 작성하지 않고 게임을 설계하고 실행해 보며 허용할 동작을 판단했다고 합니다. 에이전트가 화면을 보거나 방아쇠를 당길 수 없는 상황에서 하드웨어 측정 결과를 확인하도록, 실행 중인 앱의 프레임과 표적 감지 계산, 화면 좌표, 키 입력 등을 제공하는 MCP 서버를 만들었습니다. 앱의 결론 대신 측정값을 돌려주게 했으며, 앱이 틀린 판정을 내린 사례를 추적하는 데 이 도구를 활용했습니다.

예를 들어 앱은 카메라를 뽑으라고 안내했지만, MCP로 확인하자 몇 초 전 보정 오차는 0.91mm였고 자체 점검도 12회 중 12회 통과했습니다. 원인은 배포판에서 빠진 이미지 파일이 화면 그리기 과정에서 예외를 일으킨 일이었습니다. 그 뒤 화면 그리기 완료 신호가 나오지 않아 대기 작업이 시간 초과됐고 카메라가 원인으로 지목됐습니다. 개발자는 한 번의 성공으로 준비 완료를 선언하지 않고, 깨끗한 콜드 스타트 다섯 번을 연속 통과해야 동작한다고 정했습니다.

전체 실행 테스트가 첫 실행 뒤 끝나면서 성공을 잘못 보고한 문제도 있었습니다. 알려진 결함을 일부러 다시 넣고 검사기가 실패를 잡아내는지 확인하는 변이 테스트를 도입했습니다. 개발자는 여섯 실행기에서 326개 결함을 넣어 검사했고 모두 탐지했다고 적었습니다. 별도로 작성한 댓글에서는 독립 마이크로 방아쇠 소리를 세어 비교했을 때 실제 발사음의 84~89%가 감지된 발사로 기록됐다고 밝혔습니다.

Reddit 반응

  • @peensmith_ — 취미로 자신이 하고 싶은 게임을 만들 수 있다는 점이 멋집니다.
    • @vkorost — 100% 동의합니다.
  • @RecursiveReboot — Time Crisis가 생각나네요. 좋은 시절이었죠. 이 총으로 다시 플레이하도록 누군가 그 게임을 개조해 주면 좋겠습니다.
  • @The-SadShaman — 닌텐도도 20년쯤 전에 이런 걸 만들지 않았나요?
    • @sublimeisgood8 — 이 프로젝트는 웹캠으로 화면의 레이저를 추적합니다. Duck Hunt와는 다른 방식입니다. Duck Hunt는 총 안쪽의 광센서를 썼고 CRT에서만 동작했습니다. 여기서는 실제 레이저 위치를 추적하는 점이 멋집니다.
    • @vkorost — 고맙습니다. 그렇게 봐주셔서 기쁩니다.
  • @ClemensLode — 방아쇠를 누르면 화면을 검게 바꾸는 고전 방식이나 리볼버에 카메라를 넣는 방식과 비교해 정확도가 어느 정도인지 궁금합니다.
  • @Spunge14 — 그런 방식도 요즘은 나와 있고 잘 작동합니다.
    • @Spire_Citron — 추가 하드웨어 없이 그 방식으로 할 수 있나요?
  • @AgitAngst — 정말 멋지네요. 이걸 해보려고 총과 카메라를 사고 싶어졌습니다.
  • @thongjesus — 취미를 어떻게 돈으로 바꿀 수 있을까요?
    • @vkorost — 알면 좋겠네요.

원문: Reddit / 번역·요약: Trawling