JAVASCRIPT

게임 이펙트 음악 재생

이미사용 2023. 4. 27. 20:13
명언
-
728x90
반응형

 

HTML

JS

const allMusic = [
    {
        name : "1. 저리가라",
        artist : "parrick parrick",
        img: "music_view01",
        audio: "music_audio01"
    },{
        name : "2. 저리가라",
        artist : "parrick parrick",
        img: "music_view02",
        audio: "music_audio02"
    },{
        name : "3. 저리가라",
        artist : "parrick parrick",
        img: "music_view03",
        audio: "music_audio03"
    }
  ];

- 음악에 정보를 allMusic에 배열안 객체로 저장합니다.

//선택자
const musicWrap = document.querySelector(".music__wrap");
const musicName = musicWrap.querySelector(".music__control .title h3");
const musicArtist = musicWrap.querySelector(".music__control .title p");
const musicView = musicWrap.querySelector(".music__view .image img");
const musicAudio = musicWrap.querySelector("#main-audio");
const musicPlay = musicWrap.querySelector("#control-play");
const musicPrevbtn = musicWrap.querySelector("#control-prev");
const musicNextbtn = musicWrap.querySelector("#control-next");
const musicProgress = musicWrap.querySelector(".progress");
const musicProgressBar = musicWrap.querySelector(".progress .bar");
const musicProgressCurrent = musicWrap.querySelector(".progress .timer .current");
const musicProgressDuration = musicWrap.querySelector(".progress .timer .duration");

let musicIndex = 1; //현재 음악 인덱스

- 필요한 선택자의 class를 html에서 가져와 만들어 준후, 현재 음악의 인덱스를 저장해줍니다.

 

※윈도우 로드시 실행

window.addEventListener("load", () => {
    loadMusic(musicIndex);
});

- 윈도우에 load 이벤트 가 발생하면 다음 loadMusic함수에 현재음악의 인덱스 값을 넣어 실행합니다.

load 웹 페이지의 모든 리소스(이미지, 스타일 시트 등)가 완전히 로드되고 렌더링될 때 발생하는 이벤트입니다. 

 

※음악 재생 파일 가져오기

//음악 재생 파일
const loadMusic = (num) => {
    musicName.innerText = allMusic[num-1].name;             //뮤직 이름
    musicArtist.innerText = allMusic[num-1].artist;         //뮤직 아티스트
    musicView.src = `img/${allMusic[num-1].img}.png`;       //뮤직 이미지
    musicView.alt = allMusic[num-1].name;                   //뮤직 이미지 alt
    musicAudio.src = `audio/${allMusic[num-1].audio}.mp3`;   //뮤직 파일
};

- 받아온 현재 음악의 인덱스 값을 num으로 저장고 음악 저장 해놓은 allMusic에서 정보를 가져옵니다.

- src의 정보를 가져올때는 문자열과 불러올 배열을 따로 구분을 지어 주어야하기 때문에 쌍따움표 대신 `백틱을 사용하며 

문자열을 적고 배열식을 적을 때에는 $를 써서 {}안에 배열식을 넣어 주어여 합니다.

 

※음악 재생/정지 하기

// 플레이 버튼
musicPlay.addEventListener("click", () => {
    const isMUsicPaused = musicWrap.classList.contains("paused");//클라스가 있는지 확인하는contains 음악재생중

    isMUsicPaused ?  pauseMusic() : palyMusic();
});

- 플레이 버튼을 누르면 음악이 실행 되게 해주기 위해 musicWrap에 클라스에 paused 가 있는지 확인하는 메서드 contains 를 isMUsicPaused에 저장하고 삼항연산자로 있으면 pauseMusic()을 실행하고 없으면 palyMusic()을 실행합니다. 지금은 클라스에 paused 가 없으므로 palyMusic()가 실행됩니다.

//재생
const palyMusic = () => {
    musicWrap.classList.add("paused");
    musicPlay.setAttribute("title", "정지");
    musicPlay.setAttribute("class", "stop");
    musicAudio.play();
};

- 음악을 재생하기전에 musicWrap에 paused 클라스를 넣어주고 musicPlay에 있는 속성값을 setAttribute로 바꾸어 줍니다. 그러면 플레이 버튼이 정지 버튼으로 바뀌게 되며, play()를 실행하며 음악이 재생됩니다.

 

//정지
const pauseMusic = () => {
    musicWrap.classList.remove("paused");
    musicPlay.setAttribute("title", "재생");
    musicPlay.setAttribute("class", "play");
    musicAudio.pause();

};

- 다시 한번 플레이가 있던 버튼을 누르게 되면 musicWrap에 있던 paused 클라스를 지워 주고 setAttribute로 musicPlay에 있는 속성값을 바꾸어준후 pause()를 실행하여 음악을 멈춰줍니다.

contains DOM 요소의 자식 요소 중에서 특정 요소가 포함되어 있는지 여부를 확인하는 메서드입니다.
setAttribute  DOM 요소의 속성을 설정하는 메서드입니다. 이 메서드를 사용하여 JavaScript로 HTML 요소의 속성 값을 동적으로 변경할 수 있습니다.
play() 오디오나 비디오 등의 매체를 재생하는 메소드입니다.
pause()  오디오를 일시 정지하는 메소드입니다.

 

※이전곡 듣기

//이전곡 듣기 버튼
musicPrevbtn.addEventListener("click", () => {
    prevMusic();
});

- musicPrevbtn를 클릭 햇을때   prevMusic()를 실행합니다.

//이전곡 듣기 
const prevMusic = () => {
    musicIndex == 1 ? musicIndex = allMusic.length : musicIndex--;

    loadMusic(musicIndex);
    palyMusic();
    
};

- 삼항연산자로 현재 재생중인 음악의 순서가 1과 같을때 현재 재생중인 음악의 순서는 모든음악의 갯수로 가게되고 아닐경우 musicIndex-- 를 해줍니다.

-적용된값을  loadMusic(musicIndex) 에 실행시키고 보낸후 palyMusic() 함수를 실행 시킵니다.

 

※다음곡 듣기

//다음곡 듣기 버튼
musicNextbtn.addEventListener("click", () => {
    nextMusic();
});

- musicNextbtn를 클릭 햇을때  nextMusic()를 실행합니다.

//다음곡 듣기 
const nextMusic = () => {
    musicIndex == allMusic.length ? musicIndex = 1 : musicIndex++;

    console.log(musicIndex)
    loadMusic(musicIndex);
    palyMusic();
};

- 삼항연산자로 현재 재생중인 음악의 순서가 allMusic.length와 같을때 musicIndex = 1이 되고 아닐경우 musicIndex++ 해줍니다.

-적용된값을  loadMusic(musicIndex) 에 실행시키고 보낸후 palyMusic() 함수를 실행 시킵니다.

 

※ 뮤직 진행바 설정 해주기

//뮤직 진행바
musicAudio.addEventListener("timeupdate", e => {
    const currentTime = e.target.currentTime;           //재생되는시간
    const duration = e.target.duration;                 //오디오의 총길이
    let progressWidth = (currentTime/duration) * 100 ;  //전체길이에서 현재 진행되는 시간을 백분위 단위로 나누면 그값의 width값을 알수 있다.

    musicProgressBar.style.width = `${progressWidth}%`

    //전체 시간
    musicAudio.addEventListener("loadeddata", () => {
        let audioDuration = musicAudio.duration;
        let totalMin = Math.floor(audioDuration / 60);
        let totalSec = Math.floor(audioDuration % 60);
        if(totalSec < 10) totalSec = `0${totalSec}`;
        musicProgressDuration.innerText = `${totalMin}:${totalSec}`;
    });

    //진행 시간
    let currenMin = Math.floor(currentTime / 60);
    let currenSec = Math.floor(currentTime % 60);

    if(currenSec < 10) currenSec = `0${currenSec}`;
    musicProgressCurrent.innerText = `${currenMin}:${currenSec}`;
});

// 뮤직바 진행

- musicAudio에  timeupdate이벤트가 발생 할때마다 그값을 e에 저장하여 가져 옵니다.

- e의 값에서 재생되는 시간인 currentTime 값을 currentTime에 저장하고,오디오의 총길이인 duration값을 duration에 저장합니다.

- 현재 진행되는 뮤직바의 width값을 알기위해(currentTime/duration) * 100을 하여 progressWidth저장합니다.

- 그후musicProgressBar에 width값을 progressWidth의% 만큼 값이 변경 될때마다 반복합니다.

 

//전체시간

현재 음악의 전체 시간을 구하기위해 loadeddata 이벤트가 실행 될때 musicAudio의duration값을 가져와 audioDuration에 저장해 줍니다. 그후 분과 초를 구하기 위해 audioDuration에 나누기60을 하여 분을 구하고 audioDuration에%60의 나머지값으로 초를 구합니다.

이때 초가 10보다 낮을때 앞에 0을 붙여줍니다.

 

//진행 시간

현재 음악의 진행 시간을 알기위해 뮤직진행 바에서 currentTime을 가져와 나누기60을 하여 분을 가져오고 %60을 하여 초를 가져옵니다 이때 초가 10보다 낮을때 앞에 0을 붙여 줍니다.

timeupdate <audio> 또는 <video> 요소에서 발생하는 이벤트 중 하나입니다. 이 이벤트는 재생 중인 미디어의 재생 위치가 변경될 때마다 발생합니다.
loadeddata <audio> 또는 <video> 요소에서 발생하는 이벤트 중 하나입니다. 이 이벤트는 미디어의 재생이 가능한 상태가 되었을 때(즉, 미디어가 로드되어 재생할 수 있는 상태가 되었을 때) 발생합니다.
duration <audio> 또는 <video> 요소에서 제공되는 속성 중 하나입니다. 이 속성은 현재 재생 중인 미디어의 전체 길이(총 재생 시간)를 초 단위로 나타냅니다

//진행 버튼 클릭

// 진행 버튼 클릭 
musicProgress.addEventListener("click", (e) => {
    let progressWidth = musicProgress.clientWidth; //진행바 전체 길이
    let clickedOffsetX = e.offsetX;                //진행바를 기준으로 측정되는 X좌표 값
    let songDuration = musicAudio.duration;        //오디오 전체길이
    // console.log(songDuration);

    //백분위로 나눈 숫자에 다시 전체 길이를 곱해서 현재 재생값으로 바꿈
    musicAudio.currentTime = (clickedOffsetX / progressWidth) * songDuration;
    
});

뮤직바를 클릭했을때 그곳으로 이동하기위해 musicProgress를 클릭했을때 progressWidth에 진행바의 전체길이를 가져오고, clickedOffsetX 으로 진행바를 기준으로 측정되는 x을 좌표 값을 저장합니다.그후 songDuration 에 오디오의 전체길이를 가져오고 (clickedOffsetX / progressWidth) * songDuration;을 하여 musicAudio.currentTime을 클릭한위치로 바꿔줍니다.