2017-12-17 5 views
1

Ich arbeite an einem Würfelspiel, das 4 Würfel mit Zufallszahlen für jeden von ihnen würfelt. Wenn ich den Roll-Button drücke, wird der Sound-Effekt wie beabsichtigt abgespielt und die Bilder werden ersetzt, aber ich suche nach einer Möglichkeit, den Benutzer daran zu hindern, die Rolle zu drücken, bis der Sound-Effekt beendet ist (vielleicht 2 Sekunden).Legen Sie eine Verzögerung nach UIButton Aktivierung

Dies ist meine Funktion, die Würfel Bilder aktualisiert, wo ich durch das Hinzufügen DispatchTime.now() + 2 zum if-Anweisungen und vor arc4random_uniform dieses Problem getestet haben, aber ohne Erfolg:

func updateDiceImages() { 
    randomDiceIndex1 = Int(arc4random_uniform(6)) 
    randomDiceIndex2 = Int(arc4random_uniform(6)) 
    randomDiceIndex3 = Int(arc4random_uniform(6)) 
    randomDiceIndex4 = Int(arc4random_uniform(6)) 
    randomMultiplier = Int(arc4random_uniform(4)) 

    // determine the operator dice at random 
    if randomMultiplier == 0 { 
     addDice() 
    } 
    if randomMultiplier == 1 { 
     subDice() 
    } 
    if randomMultiplier == 2 { 
     divDice() 
    } 
    if randomMultiplier == 3 { 
     multDice() 
    } 

    // image changes to random dice index 
    diceImageView1.image = UIImage(named: diceArray[randomDiceIndex1]) 

    diceImageView2.image = UIImage(named: diceArray[randomDiceIndex2]) 

    diceImageView3.image = UIImage(named: diceArray[randomDiceIndex3]) 

    diceImageView4.image = UIImage(named: diceArray[randomDiceIndex4]) 

    multImageView1.image = UIImage(named: multArray[randomMultiplier]) 
}  

Falls nötig, hier ist auch mein Funktion, die den Sound-Effekt spielt, wo ich auch DispatchTime.now() + 2 versuchte Umsetzung:

func rollSound() { 
    // Set the sound file name & extension 
    let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: "diceRoll", ofType: "mp3")!) 

    do { 
     // Preparation 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    } catch _ { 
    } 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
    } catch _ { 
    } 

    // Play the sound 
    do { 
     audioPlayer = try AVAudioPlayer(contentsOf: alertSound) 
    } catch _{ 
    } 

    audioPlayer.prepareToPlay() 
    audioPlayer.play() 
}  

Hier ist die Implementierung, die ich fühle, ist in der Nähe, aber ich viele Fehler bekommen:

func rollSound() { 
    // Set the sound file name & extension 
    let when = DispatchTime.now() + 2 // change 2 to desired number of seconds 
    DispatchQueue.main.asyncAfter(deadline: when) { 
     let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: "diceRoll", ofType: "mp3")!) 

     do { 
      // Preparation 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     } catch _ { 
     } 
     do { 
      try AVAudioSession.sharedInstance().setActive(true) 
     } catch _ { 
     } 

     // Play the sound 
     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: alertSound) 
     } catch _{ 
     } 

     audioPlayer.prepareToPlay() 
     audioPlayer.play() 
    } 
} 
+0

Haben Sie dies überprüft: https://stackoverflow.com/questions/38031137/how-to-program-a-delay-in-swift-3? –

+0

Ja, das ist tatsächlich, wo ich den Rat bekam, 'DispatchTime.now() + 2' zu verwenden, ich füge das dem OP hinzu – jacobbullon

+0

Kannst du zeigen, wie du es benutzt? –

Antwort

1

Ich habe Code für Ihren Fehler aktualisiert.

func rollSound() { 
    // Set the sound file name & extension 
    let when = DispatchTime.now() + 2 // change 2 to desired number of seconds 
    DispatchQueue.main.asyncAfter(deadline: when) { 
     let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: "diceRoll", ofType: "mp3")!) 

     do { 
      // Preparation 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     } catch _ { 
     } 
     do { 
      try AVAudioSession.sharedInstance().setActive(true) 
     } catch _ { 
     } 

     // Play the sound 
     do { 
      self.audioPlayer = try AVAudioPlayer(contentsOf: alertSound) 
     } catch _{ 
     } 

     self.audioPlayer?.prepareToPlay() 
     self.audioPlayer?.play() 
    } 
} 

Sie müssen self auf die Eigenschaft hinzufügen, wenn Sie Klasseninstanz in DispatchQueue näher verwenden möchten. und gleich für updateDiceImages()

+0

Ich freue mich, Ihnen zu helfen .. :) –

Verwandte Themen