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