在联系人处播放多种声音-Xcode Scene Kit

问题描述 投票:0回答:1

这是一个我没有找到答案的具有挑战性的人。这就是为什么我最终创建一个帐户,停止潜伏并成为社区成员的原因:

我正在编写一个游戏,其中,当您摇动手机时,会给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

}

我如何在任何骰子碰到另一个骰子,地板或框架时播放声音?

非常感谢!

swift xcode scenekit avaudioplayer contacts
1个回答
0
投票

我解决问题的方式有所不同,但这也许会有所帮助:

意见不一,但我发现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),希望对您有所帮助。我必须输入它,所以请原谅语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.