swift - 播放一个声音循环,同时至少有一个同类 Sprite 在舞台上

标签 swift xcode audio sprite-kit

我正在开发一款游戏,其中有一些不同种类的怪物(一种 = SKSpriteNode 的一个子类)穿过场景。 每一种都被赋予特定的声音。

一个例子是我可以在特定的时间点:

  • 5个怪物A
  • 2个怪物B
  • 0个怪物C

我想在任何时候为场景 (A, B) 中的每个类(class)循环播放声音(而不是为每个 Sprite !),并停止为缺席的每个类(class)播放声音场景(C)。

我的第一个想法是将特定的声音存储到每个类别的怪物中,并为每个 Sprite 添加一个 SKAction 以循环播放其类别的声音。 但这会循环播放与场景中的 Sprite 一样多的声音,这与我的预期不符。

您是否知道为此采用的最佳方法? 是否有可能实现一种能够通知类实例何时在现场以及何时不在现场的观察者?

非常感谢您的帮助!

最佳答案

正如@Knight0fDragon 所说,“SKAction 不是为播放循环音乐而设计的”

也许你可以这样做:(我没有测试,现在我在 windows 机器上)

Class MonsterA : SKSpriteNode {

    static var monsterAInScene = Set<Monster>()
    static let audioAction: SKAction = SKAction.playSoundFileNamed("MonsterA-audio") //Change to AVAudio for loop
    static let audioNode: SKNode()

    init (scene:SKScene) {
          //Your init
          if let MonsterA.monsterAInScene.count == 0 {
             //play audio
             scene.addChild(MonsterA.audioNode)
             MonsterA.playAudio()
          }

          MonsterA.monsterAInScene.insert(self)
    }

    static func playAudio() {
         //Play audio code
         if MonsterA.audioNode.actionFroKey("audio") != nil {return}
         MonsterA.audioNode.runaction(MonsterA.audioAction, forKey "audio")

    }
    override removeFromParent() {
        MonsterA.monsterAInScene.remove(self)
        if let MonsterA.monsterAInScene.count == 0 {
            //stop audio code
            MonsterA.audioNode.removeActionWithKey("audio")
            MonsterA.audioNode.removeFromParent()
        }
        super.removeFromParent()
    }
}

@Knight0fDragon 和@Alessandro Ornano 比我更专业,他们可以建议是否是最好的方法。

关于swift - 播放一个声音循环,同时至少有一个同类 Sprite 在舞台上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39267392/

相关文章:

ios - 如何更改 Shake/Shake Gesture 的键盘快捷键?

audio - 将声音集成到网站的最佳方式

ios - Swift:检查用户输入计数以继续

iphone - 反盗版并向Apple提交应用

ios - 将 Xcode 6 beta 6 更新到 beta 7 后获取 'optional error'

ios - 如何仅以编程方式在ios应用中读取设备的当前铃声音量?

iphone - AVAssetExportSession 在 iPhone 3G 上失败 - 但在 iPhone 4 上没有

ios - 为什么我不能通过我的委托(delegate)?

ios - 何时使用 dequeueReusableCellWithIdentifier 与 dequeueReusableCellWithIdentifier : forIndexPath

ios - 将数据从 TableViewController 传递到容器中嵌入的另一个 TableViewController