#ios #exception-handling #sprite-kit #collision-detection
#iOS #обработка исключений #sprite-kit #обнаружение столкновения
Вопрос:
Я новичок в разработке IOS, и в настоящее время у меня возникают некоторые проблемы с столкновениями наборов спрайтов в методе didBeginContact.
Как мне выйти из или остановить запуск didBeginContact, если одно из сталкивающихся физических тел удалено. например: 1 пуля сталкивается с 2 перекрывающимися врагами. Поскольку пуля попадает в первого врага и уничтожается, проверка столкновения, выполняемая на втором враге, выдает исключение, поскольку пуля больше не существует.
Я безуспешно пытался проверить значения nil и NSNULL. Код ошибки, который я получаю, — «Поток 1: EXC_BAD_INSTRUCTION(code= EXC_I386_INVOIP, subcode = 0x0)» и возникает при попытке проверить битовую маску категории (поскольку торпеда больше не существует).
код:
var bodyA:SKPhysicsBody = contact.bodyA
var bodyB:SKPhysicsBody = contact.bodyB
if(contact.bodyA.categoryBitMask == alienCategory amp;amp; contact.bodyB.categoryBitMask == alienCategory){
return
}
if((bodyA.categoryBitMask == alienCategory) amp;amp; (bodyB.categoryBitMask == photonTorpedoCategory)){
torpedoDidCollideWithAlien(bodyA.node as SKSpriteNode)
}
var currTorpedo:SKSpriteNode = contact.bodyB.node as SKSpriteNode
var currAlien:SKSpriteNode = contact.bodyA.node as SKSpriteNode
currTorpedo.removeFromParent()
currAlien.removeFromParent()
}
func torpedoDidCollideWithAlien(alien:SKSpriteNode){
aliensDestroyed
label.text = ("Current Score: " String(aliensDestroyed))
}
Ответ №1:
Возможно, вы могли бы отложить удаление торпеды со сцены до следующего обновления сцены. Вы можете пометить торпеду как отключенную / неактивную, чтобы она не влияла на вашего 2-го перекрывающегося врага. Что-то вроде этого:
class YourScene: SkScene {
// Array of disabled torpedos
var disabledTorpedos = SKSpriteNode()[]
func didBeginContact(contact: SKPhysicsContact) {
var bodyA:SKPhysicsBody = contact.bodyA
var bodyB:SKPhysicsBody = contact.bodyB
if(contact.bodyA.categoryBitMask == alienCategory amp;amp; contact.bodyB.categoryBitMask == alienCategory){
return
}
if((bodyA.categoryBitMask == alienCategory) amp;amp; (bodyB.categoryBitMask == photonTorpedoCategory)){
torpedoDidCollideWithAlien(bodyA.node as SKSpriteNode)
}
var currTorpedo:SKSpriteNode = contact.bodyB.node as SKSpriteNode
var currAlien:SKSpriteNode = contact.bodyA.node as SKSpriteNode
// Created a new photonTorpedoDisabledCategory so the torpedo cannot hit a 2nd alien
currTorpedo.physicsBody.categoryBitMask = photonTorpedoDisabledCategory
disabledTorpedoes.append(currTorpedo)
// Hide torpedo from scene
currTorpedo.hidden = true
currAlien.removeFromParent()
}
override func update(currentTime: NSTimeInterval) {
// loop through disabledTorpedos array and removeFromParent
}
}