Проигрывайте аудио файл последовательно в Swift, где второй звук воспроизводится при повторении - PullRequest
0 голосов
/ 28 декабря 2018

Для фоновой музыки в моей игре я бы хотел сыграть два звука.Первый звук воспроизводится только один раз в начале (4 такта вступления).После этого второй звук (основная музыка) воспроизводится в бесконечном цикле.Приведенный ниже код, к сожалению, воспроизводит звуки одновременно, а не последовательно (когда я смотрел в AVQueuePlayer, я не смог понять, как зациклить только второй из двух звуков):

var backgroundMusicPlayer: AVAudioPlayer!
var backgroundMusicPlayerIntro: AVAudioPlayer!

func playBackgroundMusic(filename: String, withIntro intro: String) {
    let resourceUrl = Bundle.main.url(forResource: filename, withExtension: nil)
    let resourceUrlIntro = Bundle.main.url(forResource: intro, withExtension: nil)

    guard let url = resourceUrl, let urlIntro = resourceUrlIntro else {
        print("Could not find files: \(intro) and/or \(filename)")
        return
    }

    //play the intro first before playing the main loop
    do {
        try backgroundMusicPlayerIntro = AVAudioPlayer(contentsOf: urlIntro)
        backgroundMusicPlayerIntro.numberOfLoops = 1
        backgroundMusicPlayerIntro.prepareToPlay()
        backgroundMusicPlayerIntro.play()
    } catch {
        print("Could not create audio player!")
        return
    }

    //main music that gets played on repeat
    do {
        try backgroundMusicPlayer = AVAudioPlayer(contentsOf: url)
        backgroundMusicPlayer.numberOfLoops = -1
        backgroundMusicPlayer.prepareToPlay()
        backgroundMusicPlayer.play()
    } catch {
        print("Could not create audio player!")
        return
    }
}

1 Ответ

0 голосов
/ 28 декабря 2018

Вы начинаете 2 игрока одновременно.Вы можете использовать одно свойство игрока, и оно AVAudioPlayerDelegate может воспроизводить второй звук, когда в конце первого звука вызывается метод audioPlayerDidFinishPlaying.В основном как то так:

class Player: AVAudioPlayerDelegate {

    var audioPlayer: AVAudioPlayer?

    func startPlayingFirstSong() {
        // your 1st do/catch code...
        try audioPlayer = AVAudioPlayer(contentsOf: urlIntro)
        audioPlayer?.delegate = self
    }

    // AVAudioPlayer will call this func when the first song ends:
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        // your 2nd do/catch code...
        try audioPlayer = AVAudioPlayer(contentsOf: url)
        audioPlayer?.delegate = self
    }

}

let player = Player()
player.startPlayingFirstSong()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...