iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
1
自我挑戰組

一天一蘋果,Bug 遠離我。系列 第 29

Day 29: Soda Shake -給玩家一點回饋感吧!

透過播放音效以及震動給玩家一些回饋吧!

https://ithelp.ithome.com.tw/upload/images/20181113/20107701Bj6sFxIIHQ.png

前言:

首先我們做到這邊已經約莫 80% 左右了(應該吧 ?), 所以其實也沒有什麼特別能做的,所以我們最後在這邊想為我們的 Shake Soda 加上一點特別的點綴,也就是透過系統音效以及震動回饋來給使用者特殊的感覺。


#實作

#播放系統提示音效

我們想要播放系統音效時,可以使用 AudioServicesPlayAlertSound 方式來給特定的系統,關於詳細的 SystemSoundID 可以由下列 Github 連結查看:

iOS System Sounds Library

所以我們想要播放編號 1107 的音效,我們只需要一段程式碼就能夠播放:

AudioServicesPlayAlertSound(1107)

#播放專案內的音訊檔

我們想要處理關於播放影音功能時,首先我們需要導入 AVFoundation 這個框架:

import AVFoundation

並且我們宣告一個變數,類型為 AVAudioPlayer ,之後做為我們的播放音樂的播放器:

var audioPlayer: AVAudioPlayer!

假如我們想要播放我們專案內的音訊檔,我們可以使用兩種方式來取得我們檔案的路徑,假這我們今天專案中有一個叫做 Music.mp3 的檔案的話:

// String
let path = Bundle.main.path(forResource: "Music", ofType: "mp3")
// URL
let url = Bundle.main.url(forResource: "Music", withExtension: "mp3")

所以我們設定我們 audioPlayer 的程式碼如下:

func settingAudioPlayer() {
    // 取得檔案路徑的 Url
    let url = Bundle.main.url(forResource: "Sad music", withExtension: "m4a")!
    do {
        // 透過檔案的 url 初始化 AVAudioPlayer
        audioPlayer = try AVAudioPlayer(contentsOf: url)
        // 將 audioPlayer 設為準備播放
        audioPlayer.prepareToPlay()
    } catch {
        print("Error:", error.localizedDescription)
    }
}

#震動回饋

想要讓手機震動的方式類似於上面播放系統音效的方式一樣,只是這邊我們換成透過 AudioServicesPlaySystemSound 來播放我們的震動的 SystemSoundID

// 透過 kSystemSoundID_Vibrate 產生一個震動的 SystemSoundID
let soundID = SystemSoundID(kSystemSoundID_Vibrate)
// 播放震動效果
AudioServicesPlaySystemSound(soundID)

#觸碰回饋

在這個 App 中,我們還加入一個觸碰回饋,觸動回饋的感覺有點類似於比較小的震動,就是 Tableview 在編輯模式下的移動 Cell 時的回饋感,我們會透過 UIImpactFeedbackGenerator 來初始化它:

// 初始化 UIImpactFeedbackGenerator
let generator = UIImpactFeedbackGenerator(style: .heavy)
// 觸發回饋
generator.impactOccurred()

後記:

本次教學文的操作可能除了播放音訊其他都需要使用手機測試,各位讀者也可以試著實作看看,體驗一下原生的震動或是觸碰回饋的感覺,未來開發專案的時候也可以添加在其中,給使用者更多的回饋。


上一篇
Day 28: Soda Shake - 裁判,可以這樣換了又換嗎?
下一篇
Day 30: 鐵人賽完賽 &總結!
系列文
一天一蘋果,Bug 遠離我。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言