오디오 객체를 10개 미리 생성하고 불러오는 부분이 헷갈려서 추가로 남겨보는 노트.
type AudioType = "A" | "B" | "C" | "D" | "E";
// 오디오 객체 배열 생성 함수
const createAudioArray = (audioSource: string, count: number) => // 파일 경로, 생성할 객체 수
Array.from({ length: count }, () => new Audio(audioSource)); // count만큼의 audioSource경로를 따르는 Audio객체로 이루어진 배열 생성
//유사배열 객체
// 각 오디오 타입별로 미리 10개의 오디오 객체 생성
const audioMap = useRef<{ [audioFileName in AudioType]: HTMLAudioElement[] }>({
A: createAudioArray(AAudio, 10),
B: createAudioArray(BAudio, 10),
C: createAudioArray(CAudio, 10),
D: createAudioArray(DAudio, 10),
E: createAudioArray(EAudio, 10),
});
// 현재 재생할 복제본의 인덱스를 저장할 객체
const audioIndex = useRef<{ [audioFileName in AudioType]: number }>({
A: 0,
B: 0,
C: 0,
D: 0,
E: 0,
});
// 컴포넌트 마운트 시 미리 오디오 파일 로드
useEffect(() => {
Object.values(audioMap.current).forEach((audioArray) =>
audioArray.forEach((audio) => audio.load())
);
}, []);
참고로, 원래 { [ key in AudioType ] : HTMLAudioElement[] } 라고 썼는데, 변수명을 알기 쉽도록 audioFileName으로 바꿨다.
여기서 audioFileName은 "A" | "B" | "C" | "D" | "E";
위를 통해 audioMap은 아래와 같은 형태의 객체를 반환한다.
{
A: [Audio, Audio, Audio, ..., Audio], // 길이 10의 배열
B: [Audio, Audio, Audio, ..., Audio], // 길이 10의 배열
C: [Audio, Audio, Audio, ..., Audio], // 길이 10의 배열
D: [Audio, Audio, Audio, ..., Audio], // 길이 10의 배열
E: [Audio, Audio, Audio, ..., Audio] // 길이 10의 배열
}
'React.ts' 카테고리의 다른 글
리액트 가상 키보드 만들기 - 키보드 매핑 (오류 해결) (1) | 2024.11.02 |
---|---|
리액트 가상 키보드 만들기 - 키보드 매핑하기 2, 키보드 eventHandler, 클래스 동적으로 추가하기, HTML data attribute 활용 (0) | 2024.10.31 |
리액트 가상 키보드 만들기 - 키보드 매핑하기 1 (0) | 2024.10.28 |
리액트 가상 키보드 만들기 - 오디오 재생하기, Audio 객체 (0) | 2024.10.25 |
리액트 가상 키보드 만들기 - 레이아웃 및 디자인, 배열과 map을 활용한 키 매핑 (3) | 2024.10.25 |