Pixi JS를 사용한 로직의 본체

const imageCache: Record<string, HTMLImageElement> = {};
export enum AnimationState {
  IDLE = "idle",
  MOVING = "moving",
  HIT = "hit",
  DEAD = "dead",
  VICTORY = "victory",
  GAME_OVER = "gameOver",
  ATTACK = "attack",
}
// 이미지 사전 로딩 함수 (단일 이미지)
const preloadImage = (src: string): Promise<HTMLImageElement> => {
  return new Promise((resolve, reject) => {
    // 이미 캐시에 있으면 바로 반환
    if (imageCache[src]) {
      resolve(imageCache[src]);
      return;
    }

    const img = new Image();
    img.crossOrigin = "anonymous"; // CORS 문제 해결
    img.onload = () => {
      imageCache[src] = img;
      resolve(img);
    };
    img.onerror = (e) => {
      console.error(`이미지 로드 실패: ${src}`, e);
      reject(e);
    };
    img.src = src;
  });
};

// 이미지 사전 로딩 함수 (여러 이미지)
const preloadImages = (sources: string[]): Promise<HTMLImageElement[]> => {
  const promises = sources.map((src) => preloadImage(src));
  return Promise.all(promises);
};
export interface ... // 정의된 인터페이스들
// 애니메이션 훅 반환 타입
export interface UseGameAnimationReturn {
  isLoaded: boolean;
  initializeApp: (container: HTMLDivElement) => PIXI.Application | null;
  playAnimation: (play: boolean) => void;
  cleanup: () => void;
  appRef: React.MutableRefObject<PIXI.Application | null>;
  changeAnimationState: (state: AnimationState) => void;
  currentState: AnimationState;
  setHP: (hp: number) => void;
  setTimeRemaining: (seconds: number) => void;
}