게임 효과음
현실에서 보드게임을 하다보면 촉각과 시각적인 재미도 있지만
주사위가 떼구르르~ 굴러가고, 그 결과에 따른 환호성과 게임이 끝나고 친구들과 잡담을 나누는 등의
청각적인 재미 또한 즐길 수 있습니다.
앱에서 즐기는 야추 다이스 게임에서도 사용자들이 청각적인 재미를 느낄 수 있도록
몇몇 상황 (주사위를 굴리기 위해 "Roll" 버튼을 누른다거나, 점수를 기록하기 위해 보드판을 클릭하거나, 상대에서 나에게로 턴이 넘어올 때) 에서 효과음이 재생되게끔 구현하기로 결정하였습니다.
게임 효과음 다운로드 및 로컬 파일에 삽입
게임 효과음 다운로드 | 뮤팟 효과음 태그 검색
영상 편집자에게 꼭 필요한 무료 효과음 이걸로 종결! 장면전환, 소리효과와 같은 다양한 효과음들을 획득하세요.
www.mewpot.com
다음 무료 게임 효과음을 다운로드 받을 수 있는 웹사이트에서 몇가지 효과음을 다운받고,
해당 파일들을 프로젝트에 로컬 파일로 넣어주었다. res/raw 경로에 .mp3 파일을 이동.
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를 사용하여 사운드를 재생시켜 주었다.
'개발 > 야추 다이스 (Yacht Dice)' 카테고리의 다른 글
주사위에 Animation 구현해서 굴림 효과 만들기. (0) | 2023.03.13 |
---|---|
게임 보드판 구현하기 (1) | 2023.03.13 |
점수 산출 알고리즘 구현하기 (0) | 2023.03.13 |