# 게임필·주스 치트시트 (AI 지시용)

웹 JS(canvas 2D / three.js) · 60fps. 상세판: https://echoplayroom.com/guide/game-feel.html

## ① 프레임 독립
감쇠는 전부 `v *= Math.pow(f, dt*60)`. 맨 `v *= 0.85` 금지.
`dt = rawDt * slowMo * hitStop`. UI·입력·잔여시간 차감은 `rawDt`.

## ② 레이어
`sprOffsetX`(그림만, 0.8) / `vBump`(충격·넉백, 0.93) / `vBase`(입력·AI, 0.9).
이동 = vBase+vBump, 렌더 = 이동+sprOffsetX. **히트박스는 연출을 따라가지 않는다.**

## ③ 기준값

| 요소 | 값 | 상한 |
|---|---|---|
| 히트스톱 | 67ms(4f) ×0.1. 약 30~50 / 보통 60~80 / 처형 120~150ms | 연사 20ms↓·제외 |
| 셰이크 | 2.5px×pow×남은비율, 선형. `cos(f*1.1)`·`sin(0.3+f*1.7)`, f=초×60 | 발사 0.1s/pow 0.2=0.5px, 동시 2개 금지 |
| 카메라 범프 | 발사 3 / 대시 6 / 착지 10×pow / 발걸음 0.5 px, `0.85^tmod` | 발사 3px |
| 줌 범프 | +0.03 (착지 ×pow), `0.9^tmod` | 0.03. 픽셀아트 제외 |
| 스쿼시 | 점프 0.55 / 더블 0.66 / 대시 1.3 / 발사 1.2 / 피격 0.6, `sqY=2-sqX`, 복원 `+=(1-sq)*min(1,0.2*tmod)` | 0.4~1.6. 3D는 0.85~1.15 |
| 블링크 | 0.06s 유지 → `r*.60 g*.55 b*.50`/f, additive | 플레이어 0.1s |
| 코요테 | 150ms 관대 / 80~120 통상 / 60 정밀 | 200ms |
| 입력 버퍼 | 100~150ms, 소비 즉시 비움 | 300ms |
| 중력 완화 | `0.1+0.9*(1-ratio)`, 점프 0.1s / 더블 0.3s / 대시 0.2s | — |
| 착지 | `pow=clamp((낙하셀-2)/6,0,1)`. 2셀↓ 무반응, 먼지 3셀↑ | 잠금 0.3s + 버퍼 필수 |
| 반동 | 시각 `sprOffsetX += -dir*rnd(1,3)`px / 실제 `vBase.x += -dir*rnd(0,0.01)`셀 | 실제 10px/s |
| 넉백 | 첫 타 `vBump += (dir*rnd(.040,.060), -.05)` ≈ 38~58px/s | 연타(0.4s)는 1/6 |
| 슬로모 | 대시 0.4s×0.8. 보간 감속 0.6 / 복귀 0.2. 최종 `0.2+0.8*cur` | 연출용 0.3~0.5배 × 0.5~1s |
| 파티클 수명 | 순간 0.03~0.12s / 중간 0.3~2s / 흔적 2~15s | 풀 2048 고정, 넘치면 버림 |
| 트윈 | 카운트업 0.3~0.5s, easeOutBack 등장 0.25~0.35s, 순차 지연 30~50ms | 변한 것만 |
| 터치 | `pointerdown` 즉시, 버튼 스쿼시 0.92→1(0.1s), 탭 44px↑ | `vibrate([10])` 은 Android 만 |
| 사운드 | 피치 ±8%, 같은 프레임 1개, 슬로모 시 BGM `playbackRate` 0.9 | 볼륨 `setTargetAtTime` |
| 3D | 셰이크·범프는 부모 Group, FOV +2~3°, emissive(재질 분리) | 카메라 직접 금지 |

## ④ 장르별

| 장르 | 먼저 3개 | 금지 |
|---|---|---|
| 슈팅·액션 | 히트스톱 · 범프 3px · 피격 블링크 | 큰 셰이크(10px+), 연사 히트스톱 |
| 물리·발사 | 발사 전 당김 0.15~0.3s · 궤적 잔상 · 착탄 슬로모 | 비행 중 셰이크(궤적 예측 방해) |
| 방치·경영·건설 | 숫자 트윈 · 획득 팝 · 버튼 스쿼시 0.92 | 셰이크, 히트스톱 |
| 3D 디펜스·탐험 | 부모 Group 셰이크 · emissive 플래시 · FOV +2~3° | `camera.position` 직접 셰이크, scale 0.85 미만 |
| 파티·미니게임·리듬 | 입력 반응 <50ms · 판정 등급 연출 · 카운트인 | 조작 잠금, 히트스톱 |
| 오디오·감각 | 피치 · 좌우 팬 · 잔향(거리) 3채널 | 정답을 흘리는 시각 연출 |
| 시뮬·카메라·서사 | 이징(easeOutCubic) · 페이드 · 타이포 타이밍 | 파티클, 셰이크 |
| XR | 시선·컨트롤러 즉시 반응 · 햅틱 · 공간 음향 | 셰이크, FOV 범프 (멀미) |

## ⑤ 과잉 증상

| 증상 | 원인 | 조치 |
|---|---|---|
| 조준 불가·멀미 | 셰이크 10px+ | 발사 0.5px, 강한 이벤트만 |
| 화면 펌프질 | 줌 범프 과다, 비정수 스케일 | 0.03 이하, 픽셀은 제거 |
| 조작이 늪 | 연사에 히트스톱 | 단발·처치만, 연사는 범프+파티클 |
| 「렉이 걸렸다」 | 잠금 0.3s 초과, 버퍼 없음 | 0.3s 이하 + 버퍼 세트 |
| 적이 안 보임 | 블링크 과다, 파티클이 실루엣 덮음 | 블링크 0.06s, 파티클 뒤로 |
| 프레임 저하 | 긴 수명 파티클 누적, 풀 없음 | 풀 2048 + 넘치면 버림 |
| 흰색으로 탐 | Add 남용 | 빛·화염만 Add, 연기·피는 Normal |
| 벽 끼임·판정 어긋남 | 연출을 물리에 섞음 | ② 레이어 분리 복구 |
| 고무 인형 | 스쿼시 과다, 복원 과소 | 0.6~1.4, 복원 0.2 |
| 허공 점프 | 코요테 200ms 초과 | 80~150ms |

## ⑥ 지시 틀

> 이 치트시트 기준으로 **<대상 행동>**의 게임필을 개선해줘. 장르는 **<장르>** — ④의 「먼저 3개」만, 「금지」는 빼.
> 값은 ③ 그대로. 감쇠 `Math.pow(f, dt*60)`, 시간 배율 ①, 레이어 ②.
> 하나씩 넣고 토글로 남겨. ⑤ 증상이 보이면 되돌려.
