Воспроизведение нескольких звуков при контакте - Xcode Scene Kit - PullRequest
0 голосов
/ 28 мая 2020

вот сложный вопрос, на который я не нашел ответа. Вот почему я создал учетную запись, перестал скрываться и быть частью сообщества:

Я кодирую игру, в которой, когда вы встряхиваете свой телефон, 5 SCN-узлов (коробки с текстурами игральных костей) получают импульс отскока внутри кадра, образованного 2 узлами SCN: бокс и пол. Он имитирует игру в кости в покер.

Я закодировал контактного делегата, в котором я проигрываю звук каждый раз, когда ad ie попадает в другой d ie или коробку, , но только на первый d ie контактируя с любым из тел , как только импульс начнется, будет тем, кто воспроизводит звук .

Я не могу воспроизводить один и тот же звук одновременно каждый раз любой из кубиков контактирует друг с другом, с полом или рамой . Я не могу получить этот удовлетворительный «каскад звуков», когда могу кодировать только с помощью 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 категорий битовых масок, чтобы я мог проверить контакт:

enum BodyType:Int {

case die = 1
case box = 2
case floor = 4

}

Как я могу воспроизвести звук в любое время, когда любой d ie попадает в другой d ie, пол или рамку?

Большое спасибо!

1 Ответ

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

Я решил это немного по-другому, но, возможно, это поможет:

Мнения разнятся, но я обнаружил, что звук SK работает лучше для чего-то вроде этого, поэтому я добавил SKOverlay и просто использовал его для звука. Добавлена ​​пара звуковых узлов, чтобы распространить использование, так как у меня одновременно играли сотни объектов. Создал звуковой класс, например:

var explosions = [gameTypes: SKAction]()
let vAction = SKAction.playSoundFileName(vName, waitForCompletion: False)
audioNodeAction.run(explosions[soundType]

Предварительно загрузите действия / звуки, а затем воспроизведите звуки ниже, например (ownMissileHit)

В контактах я использовал имена узлов, но несколько способов сделать это:

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) и, надеюсь, это поможет. Мне пришлось это ввести, так что простите, пожалуйста, синтаксические ошибки.

...