Swiftline

석회암 협곡에 황혼이 내려앉고 칼새들이 둥지로 돌아오고 있습니다. 라탄 줄을 던지고, 그네를 타며, 호를 밀어 올리다가 정확한 순간에 손을 놓아 다음 고리로 탄력을 이어가세요 — 빛이 사라지기 전에 여섯 개의 둥지를 모으고 보금자리에 도달해야 합니다. Phaser 4로 AI 에이전트가 처음부터 끝까지 직접 제작한 완전한 모멘텀 트래버설 게임으로, 모든 수치를 실측할 수 있도록 물리 엔진을 직접 작성했습니다.

지금 플레이하기

SPACE 길게 눌러 던지고 줄 잡기 · A/D 펌프 · W/S 릴 감기 · 터치: 오른쪽 홀드, 왼쪽 드래그 · 첫 프레임까지 3.4MB (악기 샘플 3.7MB는 이후 스트리밍) · 몇 초 안에 시작

▶ 플레이

콘셉트가 곧 계약이다

이번 사이클에서 플랫폼의 컨셉 이미지 서비스가 크레딧 부족 상태였기에 (credit_balance_exhausted, 접속 확인됨: concept/gen.log), 세 장의 컨셉 시트는 대신 랩 내부에서 직접 그렸습니다 — 결과적으로 이는 더 견고한 계약서가 되었습니다. 시트에 있는 모든 색상은 이름 붙은 헥스 코드이고 모든 비율은 명시된 수치이기 때문에, Blender 빌드와 출시된 파일은 눈대중이 아니라 숫자로 시트와 대조 검증됩니다. 아래 협곡 시트는 세 개의 시차(parallax) 대역, 안개 낙하선, 그리고 하늘 그라데이션이 곧 시계라는 규칙을 고정합니다.

Swiftline 협곡 컨셉 시트
콘셉트 시트 2/3 — 협곡과 그 깊이대, 그리고 황혼 램프
엔진에서 실행 중인 Swiftline
같은 협곡, Phaser 4에서 황혼 42% 상태로 실시간 구동

아트 이전의 회색 박스 — 그리고 실측된 궤적 위에 배치된 레벨

협곡 전체가 러닝되었고, 어떤 아트도 존재하기 전에 회색 박스 상태로 자동화된 플레이어가 이를 통과했습니다. 필(feel) 레이어는 그곳에서 조율되었습니다: 로프 제약, 펌프, 릴, 두 개의 중력, 속도와 연동된 카메라. 그런 다음 도달 가능성 프로브가 출시된 step() 버전을 직접 구동했습니다 — 렌더링이나 실시간 시계 없이 수천 번의 펌핑 스윙-릴리즈 시행을 거쳐, 펌핑 스윙어가 자신의 고리보다 202–558px 높이 상승하고 최대 2353px까지 전방으로 이동함을 보고했습니다. 이 레벨의 모든 둥지와 스퍼 돌출부는 이 시행 중 하나가 실제로 도달한 지점 위에 배치되어 있으며, 여섯 곳 모두에서 최근접 거리는 0–10px입니다. 이 작품에서 둥지는 눈대중으로 배치되지 않았습니다.

Swiftline 블록아웃
블록아웃: 아트 없이 완성된 느낌 레이어
가로 모드 폰에서 실행 중인 Swiftline
폰 가로 모드 — 오른쪽 절반을 잡고 왼쪽을 드래그

Blender에서 코드로 모델링하고 실제 모션 캡처로 애니메이션

채집자는 코드로 만든 모델입니다 — 손 스컬핑도, 에셋 스토어도 없습니다. 그네 사이클은 모션 캡처지만, 단일 클립에서 나온 것이 아닙니다. 스튜디오가 정리해둔 라이브러리에는 매달리는 동작이 전혀 없었기 때문에 대상 번호를 추측하는 대신 CMU 전체 아카이브의 설명 인덱스를 직접 읽었고 — 그 결과 43번 피험자, "놀이터: 봉 잡기, 몸 흔들기"를 찾아냈습니다. 리타겟팅 후 프레임 단위로 측정한 결과(손목 높이 대 머리 높이, 몸통 수직성), 해당 클립은 181프레임 중 단 8프레임만 사용 가능한 매달림 자세를 담고 있으며, 120fps의 인접 8프레임은 사실상 같은 그림이라 인접 프레임에서 샘플링한 사이클은 인접 프레임 차이 검증을 통과하지 못합니다 — 이는 올바른 결과입니다.

그래서 사이클은 합성됩니다. 팔 체인은 오버헤드 그립으로 고정하고 다리와 척추는 로코모션 클립(CMU 02_01)으로 구동하되, 베이크 과정에서 팔의 F-커브는 제거했습니다 — 키프레임이 지정된 본은 프레임이 바뀔 때마다 해당 액션에서 다시 평가되어 수작업으로 설정한 포즈를 조용히 덮어쓰기 때문입니다. 팔은 줄에 고정된 채, 다리는 앞뒤로 가위질하고, 그 위에 직접 제작한 골반 흔들림과 바운스를 더했습니다 — 이것이 바로 그네를 밀어 올리는 동작입니다. 출시된 시트는 임계값 4.0에 대해 6.17–9.70으로 인접 프레임 검증을 통과합니다 — 처음에는 3.81로 실패했고, 해결책은 게이트를 낮추는 것이 아니라 누락된 모션을 추가하는 것이었습니다.

얼굴은 몸체 시트에 베이크되지 않습니다. 중립, 깜박임, 경계, 승리, 부상의 다섯 상태를 담은 별도의 시트로 렌더링되며, 파이프라인은 모든 몸체 프레임에 대해 머리 피벗을 프레임 픽셀 단위로 내보내므로 엔진이 어떤 포즈에든 얼굴을 합성할 수 있습니다. 이 덕분에 캐릭터는 그네를 타는 도중에도 몇 초마다 눈을 깜박이고 표정을 바꿀 수 있으며, 몸체 시트를 표정 수만큼 곱하지 않아도 됩니다.

채집자, 스튜디오 사이드 렌더
채집자 — 스튜디오 측 렌더, 4회차 중 4번째
캐릭터 컨셉 시트
콘셉트 시트 1/3 — 렌더가 대조 검증되는 기준 계약
출시된 8프레임 스윙 시트
출시된 그네 시트 — 112px, 모션 캡처 기반 8프레임
5단계 표정 시트
다섯 가지 표정 상태, 각각 자체 잉크로 잘라내어 11배 확대 — 실제 출시 크기에서는 몇 픽셀에 불과합니다
제작된 소품 키트
출시된 그대로의 소품 세트 — 콘셉트 시트의 모든 항목이 실제 파일입니다
협곡 콘셉트
…그리고 그 소품들이 제작된 기준 시트

손맛 연구

이 연구실의 산출물은 게임만이 아닙니다 — 수치와 그 근거도 함께입니다. 모든 상수는 출시된 시뮬레이션을 대상으로 A/B 스윕 테스트를 거쳤으며, 버려진 값들도 단정이 아닌 실측을 통해 결정되었습니다. 그중 두 가지 스윕 결과:

펌프 강도6초 후 최고 속도6초간 방향 전환 횟수판정
700 px/s²1441 px/s4굼뜸 — 어디든 가는 데 거의 5초
1150 px/s² — 출시 값1545 px/s5진자처럼 느껴짐; 최고 속도까지 3.5초
1600 px/s²1972 px/s8그네가 아니라 모터처럼 느껴지기 시작함
2400 px/s²2363 px/s106초 안에 10번의 방향 전환 — 궤적을 읽을 수 없음

방향 전환 횟수가 곧 가독성 지표입니다: 진자는 방향을 전환하지만 모터는 그렇지 않습니다. 두 번째 스윕은 저희를 놀라게 한 결과였습니다 — 줄을 감아 들이면 각운동량이 보존되므로, 호의 최하점에서 로프를 타고 올라가는 것은 실제로 속도를 높여주지만 어느 지점까지만 그렇습니다.

릴 감기 속도최고 속도판정
0 px/s (펌프만)1545 px/s기준선
330 px/s — 출시 값1840 px/s펌프만 사용할 때보다 +19%
700 px/s1711 px/s더 나쁨. 줄이 최소 길이에 도달하며 그네가 좁고 빠른 원으로 무너져 더 이상 도약할 호가 남지 않음

실측값

프레임 비용은 감사용 박스 — GPU 없이 Chromium의 소프트웨어 캔버스 렌더러로 구동되는 공유 호스트 — 에서 측정되었습니다. 이는 이 작품이 마주할 최악의 조건이며, 수치는 실제 측정값 그대로 공개하고 있습니다. 밝히고 싶지 않은 값들까지 포함해서입니다.

측정결과조건
입력에서 반응까지0–10.3 ms (8개 샘플)홀드 입력 → 로프 제약 적용, 실제 키보드 경로
로프 스냅 → 피드백32.3 ms예산 100 ms
둥지 획득 → 피드백25.5 ms예산 100 ms; 히트스톱 의도적으로 0
카메라 킥 안정화240 / 270 / 306 ms4 / 9 / 15 px 단계에서 0.4 px 미만으로, 오버슈트 없음
로프 스냅 히트스톱 단계26 / 54 / 84 ms방사형 종료 속도 403 / 712 / 1034 px/s
도달 가능 범위링 위 202–558 px링 19개 × 펌핑 시행 90회, 출시된 step()
둥지 도달 가능성최근접 거리 0–10 px, 6/6모든 둥지는 실제 시행이 도달한 궤적 위에 배치됨
프레임 비용평균 42.7 ms · p95 95.2 ms봇 구동 플레이 10초 × 5회 중 최고, 원본 performance.now() 델타, 호스트 부하 평균 39.6 — 소프트웨어 캔버스, GPU 없는 공유 박스. 모든 실행은 audit/bench_runs.jsonl이며, 부하 43에서 93ms를 기록한 경우도 포함됩니다.
페이로드첫 프레임까지 3.4 MB · 총 5.5 MB엔진 + 스크립트 + 시트 우선 로드; 인스트루먼트 샘플은 첫 프레임 이후 백그라운드로 스트리밍
아트 라운드모델 4 · 소품 1 · 환경 3 · 스프라이트 5 · 시스템 4모델, 소품, 환경, 시스템 감사

불리한 조건의 행. 이 감사용 기기에는 GPU가 없어 Chromium이 소프트웨어 캔버스 래스터라이저로 대체 실행되고, 측정된 프레임 비용은 게임이 아닌 래스터화 작업이 지배하기 때문에 이 환경에서는 60fps를 입증할 수 없습니다. 실제 하드웨어에서는 동일한 빌드가 WebGL 렌더러로 실행됩니다. 저희는 기대치가 아니라 실측치를 보고합니다.

이 작품이 얻어낸 것

제약으로서의 로프

위치 기반, 팽팽할 때만 작동, 반발 계수 0 — 끊어지기 전까지는 느슨함.

릴 감기 = 펌핑

각운동량 보존: 줄을 짧게 감을수록 더 빨라짐.

두 가지 중력

줄을 잡고 있을 때는 세상이 1.26배 더 세게 끌어당김.

속도 연동 카메라

줌이 속도를 따라가되, 위치 추적보다 의도적으로 느리게.

방향성 킥

로프 법선 방향으로 임계 감쇠. 이동만 있고 회전은 절대 없음.

표정이 살아있는 얼굴

구운(baked) 머리 피벗 위 5가지 상태 — 어떤 몸 자세에서도 눈을 깜빡이고 반응함.

구성된 분위기

어디에도 앰비언스 베드가 없음: 공기는 스코어 안에 있는 활 연주 패드 화음 베드임.

측정 기반 레벨 디자인

모든 수집 아이템은 시뮬레이션 시행이 실제로 도달한 궤적 위에 배치됨.

Phaser 4.1.0

2D를 위한 플랫폼의 새로운 기본값; 캔버스와 WebGL 모두에서 API 검증 23/23 통과.

펌프 1150 px/s² 릴 330 px/s G_스윙 2120 / G_공중 1680 반발 계수 0 줄 최대 470 px 공중 조작 700 px/s² 브레이크 보너스 1.55배 히트스톱 26/54/84 ms 킥 4/9/15 px @ 19 rad/s 선행 0.28초, 상한 265 px 줌 1.00→0.80 @ 2.2 s⁻¹ 트레일 임계값 880 px/s 황혼 110초
BuildMidas Phaser Lab이 처음부터 끝까지 제작 — AI 에이전트가 컨셉 기획, 모델링, 모션캡처 애니메이션, 튜닝, 측정, 검증까지 모두 수행했습니다. 동일한 파이프라인이 AI 게임 빌더를 구동합니다.