크레센도 Phaser + TypeScript TIL 3
스테이지마다 씬을 만들지 않기로 했다
Phaser의 씬(Scene)은 화면 단위다. 타이틀·게임·결과가 각각 씬이고, UE5의 레벨과 같은 개념이다. 씬이 바뀌면 그 안의 오브젝트는 전부 사라지고 새로 만들어진다.
스테이지는 씬과 다르다. S1·S2·S3은 같은 게임 씬인데 맵과 적 구성만 다르다. 스테이지마다 씬을 따로 만들면 파일이 스테이지 수만큼 늘고, 규칙을 하나 바꾸면 전부 고쳐야 한다. 그래서 게임 씬은 하나만 두고, “몇 번째 스테이지인가”와 그 스테이지의 맵 폭·발판·적 배치를 데이터로 넘겨 씬이 읽어 구성하도록 했다.
씬을 넘어서도 남아야 하는 것(현재 스테이지, 합류한 멤버)은 씬 밖의 공유 저장소(registry)에 둔다. UE5의 Game Instance 자리다.
이 결정은 “멤버나 스테이지가 늘 때 시스템 코드를 고치지 않는다”는 프로젝트 원칙에서 나왔다. 뒤에 밸런스와 맵 확장이 전부 데이터 편집으로 끝나는 근거가 여기다.
협동 공격은 “연속 콤보”가 아니라 “같이 눌린 상태”
2인 협동 공격은 Space(하민 공격)와 A(노아 스킬)를 동시에 누르면 나간다. 설계할 때 “순서대로 누르는 콤보”와 “같이 눌린 상태” 중 후자로 정했다.
순서 콤보는 입력을 잠깐 모아 뒀다가 판정해야 해서 일반 공격까지 반응이 늦어진다. 같이 눌린 상태만 보면 일반 공격은 즉시 나가고, 스킬 키를 누르는 순간 Space가 눌려 있으면(또는 아주 잠깐 전에 눌렸으면) 협동으로 인정하면 된다.
조작 규칙을 정할 때 “멋있는 입력”보다 “기본 동작의 반응 속도”를 먼저 지킨다. 협동은 덤이고 일반 공격이 본체다.
DOUBLE, TRIPLE, QUAD가 연달아 떴다
2인·3인·4인 협동을 빠르게 누르면 DOUBLE → TRIPLE → QUAD 텍스트가 차례로 다 떴다. 마지막 단계만 보이면 되는데 중간 단계까지 전부 표시된 것이다.
입력이 들어올 때마다 표시를 잠깐 미루고, 더 이상 입력이 없으면 그때 한 번만 보여주게 했다. 검색창이 글자마다 검색하지 않고 타이핑이 멈추면 검색하는 것과 같은 방식(디바운스)이다.
연속으로 바뀌는 상태를 화면에 보여줄 때는 “바뀔 때마다”가 아니라 “안정된 뒤 한 번”이다. 그 짧은 지연은 눈에 띄지 않고, 중간 값이 사라져 화면이 정리된다.
흰 플래시가 텍스트를 다 덮었다
트리플 이상 협동에는 연출을 넣었다. 히트스톱(물리를 잠깐 멈춰 타격감을 주는 것) + 카메라 줌 + 화면 흔들림이다. 처음엔 흰 플래시도 넣었는데, 플래시가 화면 전체를 하얗게 덮어 그 순간 뜨는 TRIPLE ATTACK 텍스트와 이펙트가 전부 안 보였다.
플래시를 빼고 흔들림으로 대체했다. 연출을 겹칠 때는 각 연출이 화면의 어느 층을 차지하는지 본다. 화면 전체를 덮는 연출은 같은 순간의 다른 정보를 지운다. 강조하려던 것을 강조 연출이 지우는 셈이다.
프레임을 2장마다 한 장씩 뽑았더니 애니가 안 읽혔다
Mixamo에서 받은 애니메이션이 150프레임이라 너무 많아, 2장마다 한 장씩 뽑아 넣었다. 그랬더니 Phaser가 애니메이션을 제대로 읽지 못했다.
파일명이 0001, 0003, 0005처럼 홀수만 남아서였다. 이미지 시퀀스 로더는 파일명이 0001, 0002, 0003처럼 연속 번호여야 순서대로 읽는다. 뽑은 뒤 번호를 다시 매겨야 한다.
에셋을 줄이거나 가공할 때 도구가 요구하는 이름 규칙이 있다. 파일이 많을수록 규칙에서 벗어난 걸 눈으로 찾기 어려우니, 가공 단계에 번호 재정렬을 포함해 둔다.