XcodeでAVFoundationを使いBGMを切り替える方法を教えてください
現在、おみくじのサンプルアプリで勉強をしています。
サンプルコードを参考にBGMの再生はできたのですが、BGMの切り替え方法がわかりません。
画面推移を使わず、同一画面のままBGMを切り替えたいです。
どんなコードをどの部分に入れればBGMが切り替え出来ますか?
わかる方いましたら、ご教授よろしくおねがします。
使用している環境はXcode7 swift2.0です。
ーーGameViewController BGM1を再生ーー
import UIKit
import SpriteKit
import AVFoundation //AVFoundationフレームワークをインポートする。
class GameViewController: UIViewController {
var player:AVAudioPlayer? //BGM を制御するための変数
var soundManager = SEManager() //SEManager でインスタンス化した変数
//BGM再生メソッド
func play(soundName:String){
//サウンドファイルを読み込む
let soundPath = NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent(soundName)
//読み込んだファイルにパスを付ける
let url:NSURL? = NSURL.fileURLWithPath(soundPath)
do {
//↓playerに読み込んだmp3ファイルへのパスを設定する
player = try AVAudioPlayer(contentsOfURL:url!)
} catch _ {
player = nil
}
player?.numberOfLoops = -1 //BGMを無限にループさせる
player?.prepareToPlay() //音声を即時再生させる。
player?.play() //音を再生する
}
override func viewDidLoad() {
super.viewDidLoad()
//bgm
// Do any additional setup after loading the view, typically from a nib.
//playメソッドの呼び出し。引数はファイル名。
play("bgm1.mp3")
let scene = GameScene(size:CGSize(width: 750, height: 1334))
let skView = self.view as! SKView
scene.scaleMode = .AspectFit
skView.presentScene(scene)
}
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
return UIInterfaceOrientationMask.AllButUpsideDown
} else {
return UIInterfaceOrientationMask.All
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
・・・・・GameScene.swift
import SpriteKit
import AVFoundation
class GameScene: SKScene {
// イラスト用スプライトを用意する
let mySprite = SKSpriteNode(imageNamed: "omikuji.png")
// ボタン用スプライトを用意する
let btnSprite = SKSpriteNode(imageNamed: "button.png")
// おみくじ結果用ラベルを用意する
let myLabel = SKLabelNode(fontNamed: "Verdana-bold")
override func didMoveToView(view: SKView) {
// 背景色をつける
self.backgroundColor = SKColor.whiteColor()
// イラストを表示する
mySprite.position = CGPoint(x: 375, y: 900)
addChild(mySprite)
// ボタンを表示する
btnSprite.position = CGPoint(x:375, y:200)
self.addChild(btnSprite)
// おみくじ結果用ラベルを表示する
myLabel.text = "???"
myLabel.fontSize = 65
myLabel.fontColor = SKColor.blackColor()
myLabel.position = CGPoint(x:375, y:500)
self.addChild(myLabel)
}
// タッチしたときの処理
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch: AnyObject in touches {
// タッチされた位置にあるものを調べて
let location = touch.locationInNode(self)
let touchNode = self.nodeAtPoint(location)
// もし、ボタンなら
if touchNode == btnSprite {
//効果音がなった時、BGMは停止しない
// 効果音データの作成.
let mySoundAction: SKAction = SKAction.playSoundFileNamed("hit.wav", waitForCompletion: true)
// 再生アクション.
self.runAction(mySoundAction);
// ???と表示してから、おみくじを振る
myLabel.text = "???"
shakeOmikuji()
}
}
}
// おみくじを振る処理
func shakeOmikuji() {
//BGMサンプル1再生停止
//ここでBGMをサンプル2に切り替えたい
// 【おみくじを振るアクションをつける】
// おみくじを少し右に傾けるアクション
let action1 = SKAction.rotateToAngle(-0.3, duration: 0.2)
// おみくじを少し左に傾けるアクション
let action2 = SKAction.rotateToAngle( 0.3, duration: 0.2)
// おみくじをひっくり返すアクション
let action3 = SKAction.rotateToAngle( 3.14, duration: 0.2)
// action1,action2,action3を指定した順番に行う
let actionS = SKAction.sequence(
[action1, action2, action1, action2, action1, action3])
// おみくじに「左右に振ってひっくり返すアクション」をつけて、最後にkekkaを実行する
mySprite.runAction(actionS, completion: showOmikuji)
}
// 結果を表示する処理
func showOmikuji() {
var omikuji = ["大吉","中吉","吉","凶"]
let r = Int(arc4random_uniform(4))
myLabel.text = omikuji[r]
}
override func update(currentTime: CFTimeInterval) {
}
}