[Swift+SpriteKit] ゲーム用にBGMクラスを作成

SwiftでBGMを再生するメモです。

Swift2.0対応 AVFoundation AVAudioPlayerの使い方

SKActionでBGMを再生する事もできますが、使い勝手が良くないのでBGM再生はAVFoundationを使います。

AVFoundationの使い方を解説してるサイトはたくさんありますが、Xcode7のSwift2.0を使われている方は書かれている通りにしてもエラーが出てしまいます。
Swift2.0から、try〜catchを使わないとAVAudioPlayerをインスタンス化できなくなってるみたいです。この記事を書いている現在、これについて日本語で解説されているサイトはほとんど無い様です。

まずは、単純にXcode7のSwift2.0環境で、AVFoundationを使ってBGMを再生する方法から。

GameScene.swift

import SpriteKit
import AVFoundation //必ずインポートします

class GameScene: SKScene{
    var player = AVAudioPlayer() //必ず、クラス直下に作ります

    override func didMoveToView(view:SKView){
        let bgm_url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("bgm_sample", ofType:"mp3")!) //bgm_sample.mp3を再生したい場合
        player = try! AVAudioPlayer(contentsOfURL: bgm_url, fileTypeHint: "mp3") //Swift2.0から、try!が無いとエラーが出ます
        player.play() //再生します
    }
}

 

BGMクラスの作成

新規でBGM.swiftという名前のファイルを作成して、AVAudioPlayerクラスを継承したBGMクラスを作ります。
クラスの継承は、既存のクラスの機能に新しい機能を追加したい時などで使います。この場合、AVAudioPlayerの中にBGMリストをあらかじめ設定しておいて、簡単に呼び出せる様にしたかったのでBGMクラスというものを作りました。AVAudoPlayerを改造して、BGMっていう機能を作りますよって事です。

BGM.swift

import Foundation
import AVFoundation

class BGM:AVAudioPlayer{
    //使用するBGMファイルのリスト配列を作っときます
    let bgm_list = [
        0: "title_bgm",
        1: "stage_bgm_01",
        2: "stage_bgm_02",
        3: "boss_bgm"
]
    init (bgm:Int){
        let bgm_url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(bgm_list[bgm], ofType:"mp3")!)
        try! super.init(contentsOfURL: bgm_url, fileTypeHint: "mp3")
    }
}

GameScene.swift

import SpriteKit
import AVFoundation //必ずインポートします

class GameScene: SKScene{
    var player = BGM(bgm: 0) //BGM番号を引数に指定する

    override func didMoveToView(view:SKView){
        player.play() //再生します
    }
}

BGMを停止させたい時は、player.stop()を使います。

※ちなみに、僕はプログラマーじゃないので難しい事聞かれても9割分かりません。
プログラミングについて書いてますが、壮大な間違いを犯している可能性もあるのでご了承ください。