diff --git a/public/assets/bg-site.png b/public/assets/bg-site.png deleted file mode 100644 index d3a1e36..0000000 --- a/public/assets/bg-site.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e32d667a6e17ca75437f7fde9bad637bfd691543f14e48d7bca82f95f993414 -size 1469658 diff --git a/public/assets/bg-site.webp b/public/assets/bg-site.webp new file mode 100644 index 0000000..a27f461 --- /dev/null +++ b/public/assets/bg-site.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2912bc92d3b01717b1a93858bd954cb444ecd093c64b1bd1bafe839171b45fa6 +size 1191438 diff --git a/public/assets/loader/Loader-1.png b/public/assets/loader/Loader-1.png new file mode 100644 index 0000000..230a82b --- /dev/null +++ b/public/assets/loader/Loader-1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9875b1b71938be5a41dd743d08f290bcebd755ad9d8b1f30189b445de2c5ab5 +size 77691 diff --git a/public/assets/loader/Loader-2.png b/public/assets/loader/Loader-2.png new file mode 100644 index 0000000..c9e3d91 --- /dev/null +++ b/public/assets/loader/Loader-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0445d5c70a7bc7d4f3715e8df6646cce4dc5050206dfdaacaa4144b5d350ab5 +size 83303 diff --git a/public/assets/loader/Loader-3.png b/public/assets/loader/Loader-3.png new file mode 100644 index 0000000..65874cc --- /dev/null +++ b/public/assets/loader/Loader-3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01f28aa675ae13b6081f71a10a50d4b0f2093df1e81bd1b6c84bcdc1043c3534 +size 79654 diff --git a/public/assets/loader/Loader-4.png b/public/assets/loader/Loader-4.png new file mode 100644 index 0000000..8f2c746 --- /dev/null +++ b/public/assets/loader/Loader-4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f4b883c1990257a044ede34d13f21364f2f80fac5921b1d5587ccc818566712 +size 78050 diff --git a/src/components/ui/SceneLoadingOverlay.tsx b/src/components/ui/SceneLoadingOverlay.tsx index f55e5b0..c219cce 100644 --- a/src/components/ui/SceneLoadingOverlay.tsx +++ b/src/components/ui/SceneLoadingOverlay.tsx @@ -1,10 +1,18 @@ +import { useEffect, useState } from "react"; import { AppLoadingIndicator } from "@/components/ui/AppLoadingIndicator"; import type { SceneLoadingState } from "@/types/world/sceneLoading"; -const LOADING_BACKGROUND_PATH = "/assets/bg-site.png"; -const LOADING_LOGO_PATH = "/assets/logo.png"; +const LOADING_BACKGROUND_PATH = "/assets/bg-site.webp"; +const LOADING_FRAME_RATE = 12; +const LOADING_FRAME_INTERVAL_MS = 1000 / LOADING_FRAME_RATE; +const LOADING_LOGO_FRAMES = [ + "/assets/loader/Loader-1.png", + "/assets/loader/Loader-2.png", + "/assets/loader/Loader-3.png", + "/assets/loader/Loader-4.png", +] as const; -for (const path of [LOADING_BACKGROUND_PATH, LOADING_LOGO_PATH]) { +for (const path of [LOADING_BACKGROUND_PATH, ...LOADING_LOGO_FRAMES]) { const image = new Image(); image.src = path; } @@ -16,8 +24,25 @@ interface SceneLoadingOverlayProps { export function SceneLoadingOverlay({ state, }: SceneLoadingOverlayProps): React.JSX.Element | null { + const [logoFrameIndex, setLogoFrameIndex] = useState(0); const isReady = state.status === "ready"; const progress = Math.round(Math.max(0, Math.min(1, state.progress)) * 100); + const logoFramePath = + LOADING_LOGO_FRAMES[logoFrameIndex] ?? LOADING_LOGO_FRAMES[0]; + + useEffect(() => { + if (isReady) return undefined; + + const intervalId = window.setInterval(() => { + setLogoFrameIndex( + (currentIndex) => (currentIndex + 1) % LOADING_LOGO_FRAMES.length, + ); + }, LOADING_FRAME_INTERVAL_MS); + + return () => { + window.clearInterval(intervalId); + }; + }, [isReady]); return (