

swift初心者です。現在簡単なゲームアプリ開発に挑戦しており、画面上にボタンを五つ（仮）設置し、当たり外れの概念を設け、外れをタップするとハズレ専用の画像と音声が出力されてゲームオーバーという黒ひげ危機一髪のような仕様のゲームです。

『実装したい機能１：当たりのボタンをタップした時にそのボタンを消したい』  
これにより外れのボタンが残っていくことが視覚的に分かりやすくなり、プレイヤーを焦らせることができると思います。

『実装したい機能２：外れのボタンをタップした直後に起動時からなるBGMを停止したい』  
if文に.stop()を使用しても上手くいきませんどうかご教授願います。

[code]

    import UIKit
    
    import AVFoundation
    class ViewController: UIViewController {
    var player:AVAudioPlayer!
    var doll:AVAudioPlayer!　//dollはボタンです
    
    //ハズレ音用のAVAudioPlayer
    var hazurePlayer: AVAudioPlayer!
    
    //ハズレ時に表示する画像
    
    @IBOutlet weak var hazureImage: UIImageView!
    
    //起動時からなるBGM
    func play(soundName:String){
        let url = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent(soundName)
    
        try! player = AVAudioPlayer(contentsOfURL:url)
        player.numberOfLoops = -1
        player.play()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        play("BGM2.mp3")
    
    //最初のハズレ設定
        setupHazure()
        //サウンドの設定はviewDidLoad()の中でやっておくと再生開始までの遅延が少なくなります
    
    
       //当たりをタップした時になるサウンド
        let url = NSBundle.mainBundle().URLForResource("waraiufufu", withExtension: ".wav")!
        try! doll = AVAudioPlayer(contentsOfURL: url)
        doll.prepareToPlay()
    
    
    //ハズレをタップした時になるサウンド
    let hazureURL = NSBundle.mainBundle().URLForResource("gyaa", withExtension: ".wav")!
        try! hazurePlayer = AVAudioPlayer(contentsOfURL: hazureURL)
        hazurePlayer.prepareToPlay()
    }
    
    private var hazureTag = 0
    func setupHazure() {
        //arc4random_uniform(5)の結果は0...4なので+1して1...5にする
        hazureTag = Int(arc4random_uniform(5)) + 1
    }
    
    @IBAction func dolltapped(sender:UIButton){
        print("日本人形\(sender.tag)")
        if sender.tag != hazureTag {
            doll.play()
    
    
        } else {
            hazurePlayer.play()
            hazureImage.hidden = false
    
        }
    }
    }
    
[/code]


CC BY-SA 3.0
2016-06-06T09:44:52.190
26503
2016-11-14T08:57:26.007
15041
question
swift xcode
『ゲーム』条件を満たした時にボタンを削除する方法


_『実装したい機能１：当たりのボタンをタップした時にそのボタンを消したい』_  
実際に表示中のViewの階層から削除してしまうという手もあるのですが、単に見た目上消してしまえばいいのであれば、(`hazureImage`等と同様に)`hidden`プロパティを操作して、非表示にしてしまってはいかがでしょうか。(一度設定したview階層からUIButtonなどのコントロール部品を含む子viewを削除してしまうと、予期せぬ副作用のせいでアプリが落ちることもあります。そこら辺を十分理解して自分で対処できるようになるまでは「実際に削除」はしない方が良いでしょう。)

_『実装したい機能２：外れのボタンをタップした直後に起動時からなるBGMを停止したい』_  
普通は`stop()`メソッドを呼べば(実際に止まるまで少しだけラグがあります)、演奏中の音は停止するのですが…。ただ、`stop()`で止めてしまうと、次に`play()`を呼んだ時に`prepareToPlay()`相当の処理が再度走るので、少し演奏開始までのラグが大きくなります。`stop()`ではうまくいかなかったというのと合わせて`pause()`を試してみても良いかもしれません。

と言うわけで、上の2点をあなたのコードに入れ込むと、`dolltapped(_:)`メソッドがこんな感じになります。

[code]

        @IBAction func dolltapped(sender:UIButton){
            if sender.tag != hazureTag {
                doll.play()
                sender.hidden = true //正解のボタンは隠す
            } else {
                hazurePlayer.play()
                hazureImage.hidden = false
                player.pause() //外れならBGMを止める
            }
        }
    
[/code]

(同じViewControllerを使い回して次の問題を表示するなら、「すべてのボタンの`hidden`プロパティを`false`に設定する」なんて処理などを、次の問題の表示前に入れる必要がありますが。)

`stop()`がうまく動かないのなら`pause()`でもダメな気もするのですが、試してみてうまくいかない場合はコメント等でご連絡ください。


CC BY-SA 3.0
2016-06-06T11:31:40.463
26506
2016-06-06T11:31:40.463
13972
26503
answer