是否可以将声音效果应用于碰撞?

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

这是我与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
swift xcode if-statement sprite-kit collision-detection
1个回答
0
投票

很可能您没有将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
                    }
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.