Я пробовал несколько разных методов обнаружения столкновений в методе didBeginContact, но я не уверен, какой из них более эффективен - я пытаюсь сократить свои кадры кадров.Эффективное обнаружение столкновений
Метод 1:
if let thisMine = nodeA as? Mine {
if let thisPlayer = nodeB as? Player {
thisMine.explode()
thisPlayer.takeDamage(thisMine.damage)
}
}
else if let thisMine = nodeB as? Mine {
if let thisPlayer = nodeA as? Player {
thisMine.explode()
thisPlayer.takeDamage(thisMine.damage)
}
}
Я делаю это кучу раз, используя различные классы в методе didBeginContact, потому что у меня есть много разных объектов, которые могут взаимодействовать друг с другом.
Способ 2 (Предложенный Steve Ives с изменениями):
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case CollisionCategoryPlayer | CollisionCategoryMine:
let mineNode = contact.bodyA.categoryBitMask == CollisionCategoryMine ? contact.bodyA.node as! Mine : contact.bodyB.node as! Mine
let playerNode = contact.bodyA.categoryBitMask == CollisionCategoryPlayer ? contact.bodyA.node as! Player : contact.bodyB.node as! Player
mineNode.explode()
playerNode.takeDamage(mineNode.damage)
default :
print("Unregistered contact")
}
С помощью этого метода, я должен отбрасывать узлы контакта тела в качестве игрока/мин/другого класса для того, чтобы получить доступ к своим свойствам и функциям , Является ли это еще более эффективным, чем сравнение классов узлов, как в методе 1? Я полагаю, что более эффективно использовать оператор switch, а не кучу операторов if?
Примечание: это прослеживание вопрос Most Efficient Way to Check Collisions in didBeginContact
Вопросы «Лучшая практика» не подходят для переполнения стека, возможно, попробуйте обменяться просмотром кода. http://codereview.stackexchange.com/ Примечание: вам нужно спросить: «Этот код соответствует лучшей практике?», а не «Какая практика?» – Knight0fDragon