Bullseye Rush
움직이는 조준점을 눌러 과녁을 맞히는 게임 제작기. 마지막 화살의 판정을 기다리는 종료 조건과 작은 캔버스에서 흐려진 그림을 고친 과정을 담았습니다.
AI Tools Lab · 소개 글 작성 · 수정

조준 위치보다 누르는 순간을 고르게 했다
Bullseye Rush에서는 조준점이 움직이고 플레이어가 탭으로 화살을 발사합니다. 저는 궁수를 자유롭게 이동시키는 대신, 과녁과 조준점이 만나는 순간을 고르는 게임으로 만들었습니다. 드래그로 원하는 위치를 잡는 사격과 달리 입력 횟수는 적지만 기다리는 시간이 선택이 됩니다.
중심을 맞히면 불스아이와 콤보를 주고, 중심 밖에서 맞히면 일반 명중으로 처리합니다. 라운드가 올라가면 과녁 이동과 바운스가 들어갑니다. 같은 탭을 쓰면서도 과녁과 조준점의 상대 움직임을 읽어야 하는 구조입니다. 보너스 별을 맞히면 화살을 한 발 더 얻을 수 있어, 남은 과녁과 별 중 어느 쪽에 발사할지도 갈립니다.
이때 화면에 남은 화살과 미스 수를 함께 표시했습니다. 점수만 보여 주면 지금 신중히 기다려야 하는 이유가 잘 드러나지 않습니다. 저는 타이밍 판단에 쓰는 정보와 한 라운드를 계속할 수 있는 조건을 나란히 두었습니다.
화살이 0이어도 마지막 한 발은 날고 있다
라운드의 실패 조건을 정할 때는 발사와 명중을 같은 순간으로 처리할 수 없었습니다. 발사하면 남은 화살이 줄어들지만 화살이 과녁에 닿기까지 시간이 걸립니다. 숫자가 0이 된 순간 실패시키면 마지막 화살의 결과가 사라집니다.
그래서 화살 소진을 확인할 때 남은 발사 수뿐 아니라 공중에 활성 화살이 있는지, 남아 있는 과녁이 있는지를 함께 봅니다. 화살이 0이고 날아가는 화살도 없으며 과녁이 남은 상태에서 소진 실패를 확정합니다. 마지막 한 발로 끝낼 수 있는 기회와 더 이상 맞힐 수 없는 상태를 구분한 것입니다.
보너스 별도 이 경계에 연결됩니다. 날아가는 화살이 별을 맞혀 발사 수를 늘릴 수 있으므로 결과가 정리되기 전에 종료를 결정하면 보상의 의미가 없어집니다. 저는 화면의 숫자 하나보다 아직 해결되지 않은 동작이 있는지를 종료 조건에 포함했습니다.
라운드 배너는 입력 잠금과 같이 움직인다
모든 과녁을 없애면 남은 화살 보너스를 계산하고 다음 라운드로 넘어갑니다. 새 라운드 배너가 표시되는 동안 발사를 잠그고, 배너가 끝난 뒤 다시 입력을 받도록 연결했습니다. 화면 전환 중의 탭이 다음 라운드의 첫 화살을 소비하지 않게 한 선택입니다.
이 구조에서는 라운드가 바뀌는 예약 동작도 종료 상태를 확인해야 합니다. 클리어 뒤 잠깐 기다리는 사이에 게임이 끝났다면 새 라운드를 시작하지 않습니다. 명중 처리에서는 화살과 과녁이 아직 활성 상태인지 먼저 확인합니다. 하나의 충돌이 이미 처리된 대상에 다시 적용되지 않도록 판정의 입구를 좁혔습니다.
타이밍 게임에서는 탭에 대한 반응이 빨라야 하지만 모든 상태에서 입력을 받아야 하는 것은 아닙니다. 과녁을 조준하는 시간과 새 목표를 보여 주는 시간을 나누고, 잠금이 언제 풀리는지 화면의 배너와 맞췄습니다.
큰 그림을 넣어도 캔버스가 작으면 흐려졌다
2026년 7월에는 캐릭터와 과녁의 외곽이 흐리거나 깨져 보이는 문제를 고쳤습니다. 당시 논리 캔버스는 390×844였고 큰 배경과 그림이 이 캔버스에 한 번 축소된 뒤 다시 화면에 확대됐습니다. 원본 이미지가 크다는 사실만으로 최종 표시의 선명도가 보장되지 않았습니다.
저는 기본 캔버스를 1080×1920으로 올리고 기존 좌표, 글자 크기, 속도와 버튼 크기를 스케일 도구로 변환했습니다. 해상도만 바꾸면 조준점이 지나가는 속도와 타이밍도 달라질 수 있으므로 게임 수치를 함께 변환해야 했습니다. 넓은 데스크톱에서는 세로 화면을 무작정 늘리지 않고 9:16 영역 안에 두었습니다.
캐릭터 시트의 투명 외곽도 손봤습니다. 키 색상과 낮은 알파의 잔여 색을 정리하고 각 프레임의 내용을 중앙에 두어 여백을 확보했습니다. 그림 파일 전체가 멀쩡해 보여도 프레임 경계에 다른 조각이 남거나 활 끝이 붙어 있으면 애니메이션에서 깨진 가장자리로 보입니다.
시작 전에 필요한 그림이 준비돼 있어야 한다
그다음에는 실제 과녁, 별, 화살 그림을 로딩 화면에서 모두 먼저 읽도록 옮겼습니다. 전투 화면이 열린 뒤에 일부 이미지를 뒤늦게 읽는 구조를 없앴습니다. 이미 교체한 그림이 있어도 예전 임시 그림을 계속 불러오는 경로가 남으면 화면마다 사용하는 자산이 달라질 수 있습니다.
배포 파일도 로딩 목록과 맞춰 필요한 파일만 포함하도록 정리했습니다. 제작용 원본과 런타임 파일을 구분한 뒤, 표시 크기를 유지하면서 스프라이트 시트와 효과의 크기를 조정했습니다. 큰 원본을 전부 보내는 것보다 게임이 실제로 읽는 파일과 그림의 프레임 규격이 맞아야 했습니다.
마지막 화살의 결과가 나올 때까지 종료를 기다리고, 배너가 끝난 뒤 입력을 풀며, 그림이 준비된 뒤 게임을 시작하도록 맞췄습니다. 다음 타이밍 게임에서도 마지막 입력이 아직 진행 중인지 먼저 확인하려고 합니다. 해상도를 바꿀 때는 이동 속도와 입력 영역도 함께 보겠습니다.
개발 자료
게임 프로젝트
타이밍 사격의 마지막 화살 판정과 모바일 그림의 표시 해상도를 다듬은 제작 과정입니다.
GitHub 게임 저장소 · coreline-ai ↗ · 문의·정정 요청