Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- react native picker
- react native
- 리액트 네이티브 에러
- error
- react native font
- fire base
- 에러
- react native CLI
- aws bucket 정책
- img upload
- Access Key 생성
- 문자열 대소문자
- 백준
- 리액트
- 문자열 대소문자 구별
- AWS
- Project
- firebase 라이브러리
- react native 개발
- Next.js
- AWS Access Key
- 리엑트 네이티브 아이콘
- babel.config.js
- React
- GIT
- s3 upload
- js
- PongWorld
- react native 세팅
- 리액트 네이티브
Archives
- Today
- Total
밝을희 클태
<Canvas> 애니메이션 중단 시 requestAnimationFrame()의 비동기 문제 해결 본문
사이드 프로젝트/도라에몽 잡기 [React]
<Canvas> 애니메이션 중단 시 requestAnimationFrame()의 비동기 문제 해결
huipark 2024. 11. 3. 00:03Canvas로 도라에몽을 움직이는 애니메이션을 구현하던 중, 도라에몽을 잡으면 게임이 종료되고 ‘클리어’ 표시가 나오는 기능을 추가하려고 했다. 그러나 이 과정에서 다음과 같은 문제가 발생했다
문제
게임 종료 조건이 충족되면 setIsSuccess(true)가 호출되어 isSuccess 상태가 true로 변경되고, Canvas를 담당하는 useEffect의 리렌더링이 발생한다.
리렌더링 후 useEffect의 clean-up 함수에서 clearRect()로 Canvas를 지우도록 구현했지만, 이전 애니메이션 프레임들이 남아 있어 피격 효과와 이미지가 전부 지워지지 않아 Canvas가 멈춘 듯 보인다.
원인
requestAnimationFrame을 사용하여 애니메이션을 구현할 때는 브라우저 렌더링 스케줄에 따라 애니메이션 프레임이 예약된다. 문제가 발생한 이유는 useEffect의 clean-up 함수가 실행될 때 이미 예약된 애니메이션 프레임이 남아 있어, clearRect() 호출 이후에도 애니메이션이 계속 실행되기 때문이다.
해결법
- useRef로 애니메이션 상태 관리: isSuccess 상태는 useState가 아닌 useRef로 관리하여, 리렌더링 없이도 현재 게임 종료 상태를 바로 감지할 수 있도록 했다.
- 조건부 애니메이션 실행: requestAnimationFrame을 호출할 때 isSuccessRef.current를 확인해 게임 종료 시 애니메이션이 중단되도록 처리했다.
- clean-up 함수에서 애니메이션 요청 취소: 리렌더링이 발생하면 useEffect의 clean-up 함수가 cancelAnimationFrame을 호출해 모든 애니메이션 프레임 요청을 취소하도록 했다.
'사이드 프로젝트 > 도라에몽 잡기 [React]' 카테고리의 다른 글
<Canvas> 캐릭터 그리기 도라에몽 (0) | 2024.11.06 |
---|---|
requestAnimationFrame API 주사율 동기화 하기 (0) | 2024.11.06 |
<Canvas> 총알 자국 그리기(사라지는 애니메이션, 회전해서 그리기) (0) | 2024.11.03 |
React에서 Canvas 태그로 구현한 애니메이션: Lerp와 벡터 활용 (5) | 2024.10.23 |