Scenekit: запустить действие только при первом контакте - PullRequest
0 голосов
/ 05 января 2020

Я изучаю SceneKit, и у меня есть следующий код, который воспроизводит звук, когда мой мяч ударяется о стену.

if contactNode.physicsBody?.categoryBitMask == CategoryWall {

        let hitSound = sounds["bump"]!
        ballNode.runAction(SCNAction.playAudio(hitSound, waitForCompletion: true))
        }

Это работает, однако я могу воспроизводить звук только тогда, когда sh Первоначально мяч попадает в стену, в настоящее время он катится вдоль стены, и это заставляет звук повторяться и, следовательно, вызывает проблемы.

Я пытался изменить waitForCompletion на false или true, но это не помогло.

Есть ли способ или атрибут, который можно установить для проверки начального контакта, а затем после сброса контакта сбросить?

заранее спасибо.

Кев

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Я решил эту проблему, убедившись, что ударный звук воспроизводится только на контакте, и до завершения, установив уникальную клавишу для звукового действия. Это гарантирует, что к узлу не будет добавлено несколько звуковых воздействий в быстрой последовательности (как правило, при низких углах удара):

  func playSound(node:SCNNode, name:String) {
     //Where [sounds] are pre-loaded SFX
     let sound = sounds[name]
     if (node.action(forKey: "playSFX") != nil) {
       return
     }
     let action = SCNAction.playAudio(sound!, waitForCompletion: true)
     node.runAction(action, forKey: "playSFX")
   }
0 голосов
/ 14 января 2020

Я также сталкиваюсь с этой проблемой во многих моих приложениях, и единственное рабочее решение, которое я нашел до сих пор, использует переменную для создания некоторой задержки между касаниями. Например:

var touched = false

func physicsWorld(){
touched = true
if !touched{
   let hitSound = sounds["bump"]!
      ballNode.runAction(SCNAction.playAudio(hitSound, waitForCompletion: true))
   }
   DispatchQueue.main.asyncAfter(deadline: .now() + 0.1){
      touched = false
   }
}

} 

Да, это ужасное решение, но в случае отсутствия лучшего решения оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...