这是一个我没有找到答案的具有挑战性的人。这就是为什么我最终创建一个帐户,停止潜伏并成为社区成员的原因:
我正在编写一个游戏,其中,当您摇动手机时,会给5个SCNNode(带有骰子纹理的盒子)一个冲动,使其在由2个SCNNodes组成的框架内反弹:盒子和地板。它模拟扑克骰子游戏。
我已经编写了一个联系人代表的代码,每次一个骰子碰到另一个骰子或盒子时,我都会在其中播放声音,但只有第一个骰子接触到任何物体,一旦冲动开始,将是一个播放声音。
每次骰子彼此,地板或框架接触时,我都无法同时播放相同的声音。当只能使用nodeA和nodeB进行编码时,我将无法获得令人满意的“声音级联”。许多联系人同时发生,但只有一个会播放声音。
这是我的代码的样子:
extension GameViewController : SCNPhysicsContactDelegate {
func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
if (contact.nodeA.physicsBody?.categoryBitMask == BodyType.die.rawValue && contact.nodeB.physicsBody?.categoryBitMask == BodyType.die.rawValue){
do{
audioPlayer?.play()
}catch{
}
}else if (contact.nodeB.physicsBody?.categoryBitMask == BodyType.box.rawValue && contact.nodeA.physicsBody?.categoryBitMask == BodyType.die.rawValue){
do{
audioPlayer?.play()
}catch{
}
}}}
AVaudioPlayer在ViewLoad中准备。我没有麻烦填写catch实例。
这里我有一个类别位掩码的枚举,所以我可以测试联系方式:
enum BodyType:Int {
case die = 1
case box = 2
case floor = 4
}
我如何在任何骰子碰到另一个骰子,地板或框架时播放声音?
非常感谢!
我解决问题的方式有所不同,但这也许会有所帮助:
意见不一,但我发现SK声音在诸如此类的情况下效果更好,因此我添加了SKOverlay并将其用于声音。当我同时播放100个对象时,添加了几个声音节点以扩展使用范围。创建了一个类似的声音类:
var explosions = [gameTypes: SKAction]()
let vAction = SKAction.playSoundFileName(vName, waitForCompletion: False)
audioNodeAction.run(explosions[soundType]
预加载动作/声音,然后像(enemyMissileHit)一样播放下面的声音
在联系人上,我使用节点名称,但是有几种方法可以做到这一点:
guard let nodeNameA = contact.nodeA.name else { return }
guard let nodeNameB = contact.nodeB.name else { return }
if(nodeNameA.prefix(5) == "Explo" && nodeNameB.prefix(5) == "Missi")
{
gameControl.enemyMissileHit(vIndex: Int(nodeNameB.suffix(4))!)
}
if(nodeNameA.prefix(5) == "Missi" && nodeNameB.prefix(5) == "Explo")
{
gameControl.enemyMissileHit(vIndex: Int(nodeNameA.suffix(4))!)
}
if(nodeNameA.prefix(5) == "Explo" && nodeNameB.prefix(5) == "Hive ")
{
gameControl.enemyHiveHit(vIndex: Int(nodeNameB.suffix(4))!)
}
if(nodeNameA.prefix(5) == "Hive " && nodeNameB.prefix(5) == "Explo")
{
gameControl.enemyHiveHit(vIndex: Int(nodeNameA.suffix(4))!)
}
对于您来说,只需命名所有节点(例如Floor),希望对您有所帮助。我必须输入它,所以请原谅语法错误。