gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 07:20:41 25 4
gpt4 key购买 nike

我正在开发一款游戏,其中有一些不同种类的怪物(一种 = 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com