Swift Playgrounds开发:如何实现每次调用播放不同随机音调
问题解决方案
你现有代码始终播放同一音调的核心原因是:你在代码初始化阶段就通过单次随机索引创建了固定的SKAudioNode实例tone,后续循环执行序列时,调用indexNum()生成的新随机数并没有关联更新tone对应的音频资源,相当于反复播放同一个预先加载好的音频。
以下是适配Swift 5.3 + iPadOS 14 + Swift Playgrounds环境的修改后代码,可实现每次循环切换不同随机音调的需求:
//Swift5.3, iPadOS14 let tones = ["C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5"] // 1~2秒时长的aiff格式音频 func indexNum()->Int { let randInt = Int.random(in: 1...7) // 按需求跳过C4 return randInt } // 仅保留固定的C4音频节点初始化逻辑 let c4URL = Bundle.main.url(forResource: tones[0], withExtension: "aiff")! let c4 = SKAudioNode(url: c4URL) c4.autoplayLooped = false self.addChild(c4) let tonePlayAction = SKAction.run { [weak self] in guard let self = self else { return } // 每次执行时重新生成随机索引、创建对应音频节点 let randomToneURL = Bundle.main.url(forResource: tones[indexNum()], withExtension: "aiff")! let randomTone = SKAudioNode(url: randomToneURL) randomTone.autoplayLooped = false self.addChild(randomTone) // 播放完成后自动移除当前随机音调节点 randomTone.run(SKAction.sequence([ SKAction.play(), SKAction.wait(forDuration: 1.5), SKAction.removeFromParent() ])) } let c4PlayAction = SKAction.run { c4.run(SKAction.play()) } let wait = SKAction.wait(forDuration: 1.5) let seq = SKAction.sequence([wait, tonePlayAction, wait, c4PlayAction]) let rep = SKAction.repeat(seq, count: 5) self.run(rep)
本次修改的核心调整点:
- 取消了提前创建固定随机音调节点的逻辑,将随机音频节点的创建逻辑移到动作执行块中,每次循环都会生成新的随机音调音频
- 移除了无实际作用的随机数生成空动作,将随机逻辑直接和音频创建绑定
- 保留了你原有播放时序、C4固定播放、节点自动移除的逻辑,不需要调整你的资源配置
内容的提问来源于stack exchange,提问作者kyorokarasu
相关产品推荐
相关产品推荐

