크레센도 Phaser + TypeScript TIL 1
맞는 동작만 방향이 뒤집혀 보였다
AI로 뽑은 하민 스프라이트를 넣었더니 맞는(hurt) 동작에서만 하민이 반대쪽을 봤다. 왼쪽을 보고 맞으면 오른쪽을 보고, 오른쪽을 보고 맞으면 왼쪽을 봤다.
원인은 그림이었다. 다른 동작은 전부 오른쪽을 보는 그림인데 hurt만 왼쪽을 보는 그림으로 나왔다. 게임은 “왼쪽을 볼 때 그림을 좌우 반전한다”는 규칙 하나로 방향을 처리하니, 기본이 왼쪽인 그림은 반전하면 오른쪽이 된다.
코드에서 hurt만 예외로 둘 수도 있지만, 그러면 동작이 늘 때마다 그림 방향을 하나씩 확인해야 한다. 그림 쪽 규칙을 정하는 게 맞다. 이후 모든 스프라이트는 오른쪽을 기본 방향으로 통일해서 만든다. 에셋을 만드는 쪽에서 규칙을 지키면 코드는 규칙 하나로 끝난다.
점프를 10%만 낮추자고 했더니 훨씬 낮아졌다
점프가 조금 높아 보여서 90%로 낮추자고 했다. 점프 속도에 0.9를 곱했더니 점프가 눈에 띄게 낮아졌다.
점프 높이는 속도의 제곱에 비례한다(h = v² / 2g). 속도를 0.9배로 하면 높이는 0.81배가 된다. 높이를 0.9배로 하려면 속도는 √0.9 ≈ 0.95배여야 한다.
“10%만”이라고 말할 때 머릿속에 있는 건 결과(높이)지 조절 값(속도)이 아니다. 그런데 조절 값과 결과가 비례하지 않는 항목이 있다. 손맛을 다듬을 때는 “속도를 얼마로”가 아니라 “높이를 얼마로”처럼 눈에 보이는 결과로 말하고, 그 결과가 나오는 값은 계산해서 잡는다.
팔을 내리는 중에 들어온 적도 맞았다
공격 버튼을 누르면 주먹 애니메이션이 재생된다. 처음엔 애니메이션이 도는 내내 타격 판정을 켜 뒀더니, 주먹을 다 뻗고 팔을 내리는 도중에 다가온 적도 맞았다. 화면으로 보면 팔을 내리는 중인데 적이 튕겨 나가서 어색하다.
실제로 “주먹이 뻗는” 구간은 애니메이션 전체의 가운데 일부다. 시작 후 20%~55% 구간에만 판정을 켜기로 했다. 그 앞은 예비 동작, 그 뒤는 회수 동작이라 판정이 없다.
애니메이션 길이와 타격 판정 길이는 다른 값이다. 격투 게임에서 말하는 선딜·후딜(공격 전후의 판정 없는 구간)이 이것이다. 판정 구간을 따로 두면 나중에 손맛을 조절할 때도 애니메이션은 그대로 두고 구간만 옮길 수 있다.
전체공격인데 맵 반대편에서도 맞았다
보스의 바닥 장판은 “전체공격”으로 설계했다. 그런데 장판이 켜지면 하민이 맵 어디에 있든 피해를 받았다. 보스가 화면에 보이지도 않는데 체력이 깎이니 이유를 알 수 없는 피해가 된다.
전체공격이라도 “보스 근처 전체”여야 한다. 보스와 하민의 가로 거리가 일정 범위 안일 때만 맞도록 제한했다.
피해에는 항상 이유가 화면에 보여야 한다. 플레이어가 “왜 맞았지”를 알 수 없으면 억울함이 되고, 그건 난이도가 아니라 버그로 느껴진다. 범위가 큰 공격일수록 어디까지 맞는지가 화면에 드러나야 한다.