カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

swift spritekit で音楽を鳴らすサンプルコード

スポンサードリンク

ゲーム中に音楽はつきもの。

swift+ spritekit でBGMや効果音を鳴らす方法まとめです。

ただBGMを鳴らすだけならば

  • 音楽ファイルをプロジェクトフォルダにコピペする(xcodeを開いてドラッグすれば良い)
  • ここでは music.mp3 というファイルを用意したとして、 SKScene ファイルのどこかに下記を記述
        var action : SKAction = SKAction.playSoundFileNamed("music.mp3", waitForCompletion: true)
        self.runAction(action)

攻撃が敵に当たった時の効果音とか、短い音を鳴らす場合はこれでいいと思います。

ただし、このコードだと一度曲が流れたら終わるまで明示的にストップができない。
二重に音楽が起動してしまったら酷い事になるので注意が必要

BGMを鳴らしたり止めたりしたい

その場合はAVFoundation の機能を使ったほうが良いです

import AVFoundation

class HogeScene: BaseScene, AVAudioPlayerDelegate {

    override func didMoveToView(view: SKView) {
       // 通常の処理
       prepareBGM()
    }

    func prepareBGM(){
        let bgm_path = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("music", ofType: "mp3")!)
        var audioError:NSError?
        _audioPlayer = AVAudioPlayer(contentsOfURL: bgm_path, error:&audioError)
        if let error = audioError {
            println("Error \(error.localizedDescription)")
        }
        _audioPlayer.delegate = self
        _audioPlayer.prepareToPlay()
    }

    func playBGM(){
        if ( !_audioPlayer.playing ){
            _audioPlayer.play()
        }
    }

    func stopBGM(){
        if ( _audioPlayer.playing ){
            _audioPlayer.stop()
        }
    }
}

ポイントは以下の通り

  • AVFoundationをimportする
  • AVAudioPlayerDelegate をセット
  • クラス変数に _audioPlayer を用意
  • prepareBGM() を一度だけ呼び、音楽再生の準備をする
  • 音楽を鳴らしたいところで playBGM() を呼ぶ
  • 音楽を止めたいところで stopBGM() を呼ぶ