import React, { useEffect, useState, useRef } from "react"; import { assetsPath } from "./Common"; import "./Bird.css"; const birdAngles = 12; const frames = [0, 0, 1, 2, 3, 3, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; const useAnimationFrame = (callback: (t: number) => void) => { const requestRef = useRef(null); const animate = (time: number) => { callback(time); requestRef.current = requestAnimationFrame(animate); }; useEffect(() => { requestRef.current = requestAnimationFrame(animate); return () => { if (requestRef.current !== null) { cancelAnimationFrame(requestRef.current); } }; }, []); }; const Bird: React.FC<{ radius: number; speed: number; size: number; style?: React.CSSProperties }> = ({ radius, speed, size, style, }) => { const [time, setTime] = useState(0); const [angle, setAngle] = useState(Math.random() * 360); const [rotation] = useState((Math.PI * 2 * radius) / 5); const [direction, setDirection] = useState(Math.floor((birdAngles * (angle ? angle : 0)) / 360)); const [cell, setCell] = useState(0); const previousTimeRef = useRef(); useAnimationFrame((t) => { if (previousTimeRef.current !== undefined) { const deltaTime = t - previousTimeRef.current; setTime(deltaTime); } else { previousTimeRef.current = t; } }); useEffect(() => { const alpha = (time % speed) / speed; const frame = Math.floor(frames.length * alpha); const newAngle = (angle + rotation) % 360; setAngle(newAngle); setCell(frames[Math.floor(frame)]); setDirection(Math.floor((birdAngles * newAngle) / 360)); }, [time, speed, rotation]); return (
); }; const Flock: React.FC<{ count: number; style?: React.CSSProperties }> = ({ count, style }) => { const [birds, setBirds] = useState([]); useEffect(() => { const tmp: React.ReactNode[] = []; for (let i = 0; i < count; i++) { const scalar = Math.random(); tmp.push(); } setBirds(tmp); }, [count]); return (
{birds}
); }; export { Bird, Flock };