개발/야추 다이스 (Yacht Dice)

게임 효과음 구현

란서 2023. 3. 14. 10:17

게임 효과음

현실에서 보드게임을 하다보면 촉각과 시각적인 재미도 있지만
주사위가 떼구르르~ 굴러가고, 그 결과에 따른 환호성과 게임이 끝나고 친구들과 잡담을 나누는 등의
청각적인 재미 또한 즐길 수 있습니다.

앱에서 즐기는 야추 다이스 게임에서도 사용자들이 청각적인 재미를 느낄 수 있도록
몇몇 상황 (주사위를 굴리기 위해 "Roll" 버튼을 누른다거나, 점수를 기록하기 위해 보드판을 클릭하거나, 상대에서 나에게로 턴이 넘어올 때) 에서 효과음이 재생되게끔 구현하기로 결정하였습니다.


게임 효과음 다운로드 및 로컬 파일에 삽입

게임 효과음 다운로드 : 뮤팟

 

게임 효과음 다운로드 | 뮤팟 효과음 태그 검색

영상 편집자에게 꼭 필요한 무료 효과음 이걸로 종결! 장면전환, 소리효과와 같은 다양한 효과음들을 획득하세요.

www.mewpot.com

 

다음 무료 게임 효과음을 다운로드 받을 수 있는 웹사이트에서 몇가지 효과음을 다운받고,

해당 파일들을 프로젝트에 로컬 파일로 넣어주었다. res/raw 경로에 .mp3 파일을 이동.

 

res/raw

 

 

MediaPlayer API 사용

MediaPlayer는 안드로이드에서 오디오 및 비디오 재생을 위한 클래스 중 하나.
해당 API를 사용하면 로컬 파일, 인터넷 스트리밍 및 네트워크 소스에서 오디오 및 비디오를 재생할 수 있다.

 

여러 UI 에서 이러한 게임 효과음이 재생되어야 하기 때문에 다음과 같이
MediaPlayer를 사용하는 "YachtSound" 클래스를 만들어 리팩토링에 용이하게 만들었다.

class YachtSound @Inject constructor() {

    fun initSound(context:Context) {
        mediaPlayerMap = HashMap(6)

        mediaPlayerMap[ROLL_DICE_SOUND] = MediaPlayer.create(context, ROLL_DICE_SOUND)
        mediaPlayerMap[BOARD_CONFIRM_SOUND] = MediaPlayer.create(context, BOARD_CONFIRM_SOUND)
        mediaPlayerMap[KEEP_SOUND] = MediaPlayer.create(context, KEEP_SOUND)
        mediaPlayerMap[MY_TURN_SOUND] = MediaPlayer.create(context, MY_TURN_SOUND)
        mediaPlayerMap[BGM_CHRISMAS] = MediaPlayer.create(context, BGM_CHRISMAS).apply {
            this.isLooping = true
        }
        mediaPlayerMap[YACHT_SOUND] = MediaPlayer.create(context, YACHT_SOUND)

    }

    fun play(raw_id:Int) {
        if(mediaPlayerMap.containsKey(raw_id)) {
            mediaPlayerMap[raw_id]?.start()
        }
    }

    fun release() {
        for(value in mediaPlayerMap.values) {
            value.release()
        }
    }

    fun muteBgm(raw_id:Int) {
        if(mediaPlayerMap.containsKey(raw_id)){
            mediaPlayerMap[BGM_CHRISMAS]?.pause() ?: return
        }
    }

    companion object {
        private lateinit var mediaPlayerMap : HashMap<Int,MediaPlayer>
        const val ROLL_DICE_SOUND = R.raw.roll_dice
        const val BOARD_CONFIRM_SOUND = R.raw.click_sound
        const val KEEP_SOUND = R.raw.keep_sound
        const val MY_TURN_SOUND = R.raw.my_turn_sound
        const val BGM_CHRISMAS = R.raw.chrismas_sound
        const val YACHT_SOUND = R.raw.yacht_sound
    }



}

 

  • initSound(context: Context) : 해당 함수는 MediaPlayer 인스턴스를 초기화하고, mediaPlayerMap이라는 이름의 HashMap에 각각의 사운드 파일을 로드합니다. HashMap의 키 값은 각각의 사운드 파일에 대응되는 Int 타입의 상수로 지정되어 있습니다. 이 함수는 YachtSound 클래스의 인스턴스 생성 시 한번만 호출되어 mediaPlayerMap을 초기화합니다.

  • play(raw_id: Int) : 해당 함수는 raw_id에 해당하는 키 값으로 mediaPlayerMap에서 MediaPlayer 인스턴스를 가져와 start() 메서드를 호출하여 해당 사운드 파일을 재생합니다.

  • release() : 해당 함수는 mediaPlayerMap에 있는 모든 MediaPlayer 인스턴스를 해제합니다.

  • muteBgm(raw_id: Int) : 해당 함수는 BGM_CHRISMAS에 해당하는 키 값으로 mediaPlayerMap에서 MediaPlayer 인스턴스를 가져와 pause() 메서드를 호출하여 BGM을 일시정지합니다. pause() 메서드는 MediaPlayer가 현재 재생 중인 상태에서 호출되었을 때 일시정지하는 역할을 합니다.

 

 

사용

주로 게임 효과음이 사용되는 GamePlayFragment에서 YachtSound를 사용하였다.

 

  • onCreate() 에서 yachtSound.initSound() 를 호출하여 mediaPlayerMap을 초기화.
    lateinit var yachtSound: YachtSound

	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
		...
        yachtSound.initSound(requireContext())
		...
    }

 

  • "Roll" 버튼에 클릭 리스너를 등록. 클릭 리스너에는 yachtSound.play() 를 사용하여 사운드를재생. 
private fun setBtnRollDiceClickListener() {
        binding.btnRoll.setOnClickListener {
        	...
            yachtSound.play(YachtSound.ROLL_DICE_SOUND)
            ...

        }
    }

 

  • 내 턴이 오게될 때, yachtSound.play() 를 사용하여 사운드를 재생
    private fun myTurnObserver() =
        Observer<Boolean> {
            it?.let { myTurn ->
                if (myTurn) {
                    if (gamePlayViewModel.chance == GamePlayViewModel.INIT_CHANCE) {
                    	...
                        yachtSound.play(YachtSound.MY_TURN_SOUND)
                        ...
                    }
                } else {
                    ...
                }
            }
        }

 

이외에도 주사위를 Keep을 할 때 효과음, 점수 기록을 할 때 효과음 등 다양한 부분에서 MediaPlayer를 사용하여 사운드를 재생시켜 주었다.