2014-06-25 121 views
2

我是IOS开发新手,目前在didBeginContact方法中遇到sprite套件冲突问题。Sprite Kit碰撞错误 - Swift

如果碰撞的物理体中的一个被移除,我该如何摆脱或停止运行didBeginContact。 例如: 1颗子弹与2个重叠的敌人相撞。由于子弹击中敌人并被摧毁,所以在第二个敌人上运行的冲突检定会引发异常,因为子弹不再存在。

我试过检查零和NSNULL值没有运气。 我收到的错误代码是“线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOIP,子代码= 0x0)”,并且在尝试检查类别位掩码时发生(因为鱼雷不再存在)。

CODE:

var bodyA:SKPhysicsBody = contact.bodyA 
    var bodyB:SKPhysicsBody = contact.bodyB 


    if(contact.bodyA.categoryBitMask == alienCategory && contact.bodyB.categoryBitMask == alienCategory){ 
     return 
    } 


    if((bodyA.categoryBitMask == alienCategory) && (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

也许你可以推迟去除现场鱼雷,直到下一个场景“更新”。你可以将鱼雷标记为禁用/不活动,这样它不会影响你的第二重叠敌人。这样的事情:

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 && contact.bodyB.categoryBitMask == alienCategory){ 
      return 
     } 


     if((bodyA.categoryBitMask == alienCategory) && (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 

    } 

} 
+0

谢谢,这似乎工作得很好。 – Panno123

+0

这个答案也是相关的:http://stackoverflow.com/a/24627961/1510181 – Jon