有没有办法将声音效果应用于碰撞?

Is there a way to apply sound effects to collisions?

这是我与 Swift 的第一个项目,我正在努力学习,但我被卡住了,无法在线找到解决方案。基本上,它是 pong 的克隆,一切都很顺利,直到现在。 我的问题是,一旦我的球击中球拍,我就无法理解如何播放音效。 碰撞的其他一切都很好,其他听起来像目标一样玩得很好。只是不知道当两个精灵碰撞时我怎么能播放声音。 这是我写的:

func didBegin(_ contact: SKPhysicsContact) {
if contact.bodyA.node?.name == "main" && contact.bodyB.node?.name == "ball" || contact.bodyB.node?.name == "main" && contact.bodyA.node?.name == "ball" || contact.bodyA.node?.name == "enemy" && contact.bodyB.node?.name == "ball" || contact.bodyB.node?.name == "enemy" && contact.bodyA.node?.name == "ball" {
ball.run(blipPaddleSound)
}
}

都错了吗?

我已经尝试打破 if 语句,并且已经尝试使用我的节点之一 运行 音效 (ball.run('nameofthesound')。我想也许可能是文件有问题,但其他效果在这部分代码中播放效果不佳。我认为碰撞没有问题,因为球在球拍和墙上弹跳而没有问题

这是我放置所有碰撞和接触遮罩的代码部分:

ball.physicsBody?.contactTestBitMask = 1
ball.physicsBody?.collisionBitMask = 3
ball.physicsBody?.categoryBitMask = 1

main.physicsBody?.contactTestBitMask = 3
main.physicsBody?.collisionBitMask = 1
main.physicsBody?.categoryBitMask = 2

enemy.physicsBody?.contactTestBitMask = 3
enemy.physicsBody?.collisionBitMask = 1
enemy.physicsBody?.categoryBitMask = 2

很可能您没有将 SKPhysicsContactDelegate 设置到场景

您还会发现单次碰撞可以在游戏循环中触发多个触发器,因此您可能想要放置一个变量来控制声音播放,这样它就不会在每次碰撞中播放多次

class GameScene: SKScene, SKPhysicsContactDelegate {

    private var didCollide = false

    func didBegin(_ contact: SKPhysicsContact) {

        let object1 = contact.bodyA.node?.name
        let object2 = contact.bodyB.node?.name

        if object1 == "ball" || object2 == "ball" {
            if object1 == "main" || object2 == "main" || object1 == "enemy"|| object2 == "enemy" {

                //check if we have just collided within the last 0.3 seconds
                if !didCollide {

                    //set the marker to true so that the sound doesn't repeatedly fire
                    didCollide = true
                    //play the sound
                    ball.run(blipPaddleSound)

                    //wait 0.3 seconds (give the ball a chance to move away from the object) 
                    self.run(.wait(forDuration: 0.3) {
                        self.didCollide = false
                    }
                }
            }
        }
    }
}