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()
}
}
Haben Sie dies überprüft: https://stackoverflow.com/questions/38031137/how-to-program-a-delay-in-swift-3? –
Ja, das ist tatsächlich, wo ich den Rat bekam, 'DispatchTime.now() + 2' zu verwenden, ich füge das dem OP hinzu – jacobbullon
Kannst du zeigen, wie du es benutzt? –