크레센도 Phaser + TypeScript TIL 4
보스 능력은 스테이지마다 하나씩 쌓기로 했다
스테이지가 올라갈수록 보스가 강해져야 한다. S1 장판 → S2 가시 → S3 순간이동 돌격 → S4 빔 → S5 공중전(구슬)으로, 앞 단계 능력을 유지한 채 하나씩 더하는 누적 구조로 정했다.
이걸 코드에 “3스테이지 이상이면 빔”처럼 조건으로 적는 대신, 앞선 TIL 3에서 정한 대로 스테이지 데이터에 능력 목록을 적고 코드는 그 목록을 읽기만 한다. S2 데이터에 “가시” 한 단어를 추가하면 가시 패턴이 나온다.
능력을 누적하는 이유는 플레이어가 배운 것을 버리지 않게 하려는 것이다. 새 스테이지에서 새 패턴 하나만 익히면 되고, 이전 패턴은 이미 안다. 난이도는 “전부 새로”가 아니라 “하나 더”로 올린다.
배율만 데이터에 적고 기준값은 한 곳에
스테이지마다 보스 체력과 잡몹 공격력도 달라야 한다. 숫자를 스테이지마다 직접 적으면 밸런스를 만질 때 여러 곳을 뒤져야 한다. 기준값은 한 곳에 두고, 스테이지 데이터에는 “기준의 몇 배”라는 배율만 적기로 했다.
체력 배율을 올리면 보스가 더 많이 맞아야 죽으니 방어력 스탯을 따로 두지 않아도 단단해진다. 스탯 종류를 늘리지 않고 배율 하나로 역할을 만든 셈이다.
밸런스 숫자는 흩어지는 순간 관리가 안 된다. 어디를 고치면 되는지 한 곳으로 모으는 게 값을 정하는 것보다 먼저다.
예고를 보고 움직였는데도 맞았다
순간이동 돌격은 “예고 → 발동” 구조다. 보스가 번쩍이며 예고하고 잠시 뒤 하민 자리로 돌격한다. 그런데 예고를 보고 아무리 움직여도 맞았다. 발동 순간에 하민의 현재 위치를 다시 계산하니, 어디로 도망가든 그 자리로 오는 것이다.
예고가 시작되는 시점의 위치를 기억해 두고 발동 때 그 자리를 노리게 바꿨다. 예고 동안 벗어나면 피한 것이 된다. 빔과 구슬도 같은 원리로 발사 순간 방향을 고정했다.
예고는 “피할 기회”라는 약속이다. 약속을 지키려면 예고 시점에 목표가 고정되어야 한다. 예고를 보여주면서 발동 때 다시 조준하면 예고가 장식이 되고, 플레이어는 “피할 수 없는 공격”이라고 느낀다. 그건 어렵다가 아니라 불공정하다.
보스가 공중에 뜨는 중에 바닥 장판이 깔렸다
S5 보스는 지상과 공중을 오간다. 올라가거나 내려오는 도중에 바닥 장판이 깔리거나, 착지 전에 근접 공격이 나갔다. 공중에 뜬 보스가 바닥을 치는 셈이라 어색했다.
전환 중에는 진행 중인 패턴을 취소하고 새 패턴도 잠갔다. 전환이 끝나야 그 페이즈의 패턴이 나간다. 지상 패턴(장판·가시)은 보스가 바닥에 있을 때만, 공중 패턴은 떠 있을 때만이다.
상태가 바뀌는 “사이” 시간에는 어느 상태의 규칙도 적용되면 안 된다. 사이를 별도 상태로 두지 않으면 두 상태의 규칙이 섞여 나온다.
프레임을 절반으로 줄였더니 애니가 두 배 빨라졌다
예준 idle 애니메이션이 145장이라 2장마다 한 장씩 뽑아 73장으로 줄였다. 넣었더니 애니메이션이 두 배 빠르게 돌았다. 장 수가 절반인데 초당 재생 장 수는 그대로니 절반 시간에 끝난다.
재생 속도(fps)도 절반으로 낮춰야 원래 템포가 된다. 24에서 12로 맞췄다.
에셋을 줄이는 작업은 재생 설정과 짝이다. 장 수만 줄이고 속도를 안 맞추면 “가벼워졌는데 동작이 이상하다”가 된다. 앞선 TIL 3의 번호 재정렬과 함께, 프레임을 뽑을 때 챙길 두 가지다.