Есть ли способ применить звуковые эффекты к столкновениям? - PullRequest
0 голосов
/ 04 мая 2020

Это мой первый проект со Swift, и я пытаюсь учиться, но я застрял и не могу найти решение онлайн. По сути, это клон понга, и все идет хорошо, до сих пор. Моя проблема в том, что я не могу понять, как заставить играть звуковой эффект, как только мой мяч попал в ракетку. Все остальное со столкновениями в порядке, а другие звучат как цель, в которой играешь хорошо. Просто не могу понять, как я могу заставить звук играть, когда два спрайта сталкиваются. Вот что я написал:

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

1 Ответ

0 голосов
/ 04 мая 2020

Скорее всего, вы не устанавливаете 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
                    }
                }
            }
        }
    }
}
...