9
물감옥 상태가 되면 이동이 안되던 버그
원인
GameLevel::Tick > ProcessExplosionCollision > player->OnDamaged() > 첫번째엔 TrappedInBubble() > 폭발범위가 1프레임 이상 지속되므로 다시 ProcessExplosionCollision 호출 > player->OnDamaged()(여기서 플레이어 상태를 추적해줘야함) > player->currentState == PlayerState::TRAPPED_IN_BUBBLE이므로 currentState == PlayterState::DEAD 실행됨 > Player::Tick에서 걸러져서 이동이 안됐던 것
ProcessExplosionCollision이 프레임마다 실행된다는 사실을 망각했음
물감옥에서 빠져나오면 이동속도가 튀던 이유
원인
float moveSpeed = 0.5f > moveProgress = 1.0f - (moveTimer.GetRemainingTime() / moveSpeed)
moveProgress가 moveSpeed에 의존적인 값인데 isMoving 중에 moveSpeed가 바뀌면서 moveProgress가 재계산돼 이동속도가 튀었던 것
targetTime = 0.5초remaining = 0.3초moveSpeed = 0.5초에서 갑자기 0.125초로 바뀜moveProgress = 1.0 - (0.3 / 0.125) = 1.0 - 2.4 = -1.4eased = 1.0 - (1.0 - (-1.4)) * (1.0 - (-1.4)) = 1.0 - 5.86 = -4.86moveSpeed를 클램프로 0과 1사이로 보장해줬고, 물감옥 상태에서 Timeout 직후에 isMoving을 false로 명시적으로 바꿔줌으로써 현재 이동 계산을 끊어줌
P@@@ 상황에서 @P@@가 돼버리는 버그
원인
GameLevel::CanMove에서 SetPosition을 수행하고 있었음
CanMove를 이름에 맞게 움직일 수 있는지 여부만 판별하도록 축소하고, 만약 밀 수 있는 오브젝트라면 Push 함수를 실행하게 처리. 미는 작업은 Push 함수가 담당
Push에 다다음칸 확인 조건문 추가해서 해결
-> 선형보간 처리 안되고 있는 것 같은데?
moveSpeed, moveProgress는 정상 동작하고 있음(물감옥)
-> 우선 효과없는 float eased 만 주석처리
물감옥 상태의 플레이어는 밀기 못함
'물감옥 상태의 플레이어'를 어떻게 정의함?
Push조건문에currentState == PlayerState::NORMAL조건만 간단히 추가해서 해결
refactoring
PlayerState바꾸는건 무조건ChangeState으로ChangeState에서 공통으로 처리할거 해주고 상태 바뀌었을 때 실행될OnEnter상태()- 이후 Tick마다 상태에 맞는 로직 수행은
Update상태Tick() - 만약
Update상태Tick()에서 상태를 바꿔줘야한다면ChangeState만 호출하면 됨