토이프로젝트/Pokemon Card Flip

Pokemon Card Flip - 10.framer-motion으로 타이머 바 만들기

hoj0806 2025. 3. 20. 20:47

 

 

카드 맞추기 게임에 타이머를 추가해 시간이 모두 흘렀을 경우 게임이 종료되는 기능을 만들어보자

 

import { motion } from "framer-motion";

const GameTimer: React.FC<{
  duration: number;
  setIsTimeOut: React.Dispatch<React.SetStateAction<boolean>>;
}> = ({ setIsTimeOut, duration }) => {
  return (
    <div className='mx-auto w-[1200px]'>
      <motion.div
        className='h-[20px] bg-red-500'
        initial={{ width: "100%" }}
        animate={{ width: "0%" }}
        transition={{ duration, ease: "linear" }}
        onAnimationComplete={() => {
          setIsTimeOut(true);
        }}
      />
    </div>
  );
};

export default GameTimer;

 

framer-motion 라이브러리를 통해 번거롭게 setTimeOut을 사용하지 않고 타이머바를 만들수 있었다

 

animate를 통해 initial 상태에서 어떻게 애니메이션이 진행될것인지 정의할수 있다

 

그리고 transition의 duration 값을 통해 몇초동안 해당 애니메이션이 진행될지 설정해줄수 있다

 

duration에 60을 넣는다면 타이머 바의 크기가 100% 에서 0%가지 줄어드는게 60초동안 진행된다는것이다

 

또한 onAnimationComplete를 통해 애니메이션이 종료된 후 동작할 코드를 작성해줄수 있다

 

나는 state를 이용해 타이머가 끝났는지 여부를 확인했다 애니메이션이 끝나면 isTimeOut값을 true로 변경시킨다

 

  const [isTimeOut, setIsTimeOut] = useState(false);
 
 <GameTimer setIsTimeOut={setIsTimeOut} duration={60} />

 

부모 컴포넌트에 GameTimer 컴포넌트를 작성한뒤 duration에 60, istimeOut를 변경하는 함수를 props로 보내줬다

 

타이머를 10초로 설정하고 적용한 모습