【问题标题】:Is there a way to apply sound effects to collisions?有没有办法将声音效果应用于碰撞?
【发布时间】:2020-05-04 12:46:46
【问题描述】:

这是我第一个使用 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

【问题讨论】:

  • 记住它是一个动作(.run),也许你正在删除那个节点的动作。
  • 你指的是'let blipPaddleSound = SKAction.playSoundFileNamed("blipPaddle.mp3", waitForCompletion: false)'吗?如果是这样,它仍然在这里:/
  • 碰撞时会在断点处停止吗?
  • 你的意思是如果我在代码中设置一个断点?不,它不会停止。我认为可能我必须以不同的方式编写碰撞部分
  • 显示您设置类别的代码,或者如果您在场景中设置它们,请截屏并显示它

标签: swift xcode if-statement sprite-kit collision-detection


【解决方案1】:

很可能您没有将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
                    }
                }
            }
        }
    }
}

【讨论】:

  • 所以,我已将场景设置为“SKPhysicsContactDelegate”。我试过你的代码,但它也没有播放效果,但我会记住关于标记的部分,所以声音不会重复。谢谢!也许问题是我在 SpriteKit 场景中设置了碰撞蒙版和接触蒙版,而不是在代码中?不知道会不会有影响,我会试试的。
  • 如果您没有设置 SKPhysicsContactDelegate,它将永远无法到达 didbegin 代码
  • 对不起!我也是这个平台的新手,做到了!再次抱歉,非常感谢您
猜你喜欢
  • 2022-01-19
  • 2021-04-05
  • 2020-03-16
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多