2016-08-17 1 views
2

3 개의 몸체가 동시에 충돌하여 내 앱이 충돌 할 때 드물게 발생하는 문제가 있습니다. 세 개의 시체가 한 번에 충돌하지 않는 한 body1과 body2 또는 body1과 body3 사이의 충돌 감지가 잘 작동합니다 (body2와 body3 충돌은 중요하지 않으며 서로 통과 할 수 있습니다). 그렇게되면 나는 이러한 오류를 얻을 :xcode에서 3 개의 신체 충돌 감지 문제가 발생했습니다.

fatal error: unexpectedly found nil while unwrapping an optional value

thread1: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP,subcode=0x0

어떤 도움이 많이 감사합니다. 관련 코드는 다음과 같습니다.

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody! 
    var secondBody: SKPhysicsBody! 
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.Star != 0)) { 
     starDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode) 
    } 

    if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.Flyer != 0)) { 
     flyerDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode) 
    } 

제 3 자 본문을 추가하는 방법이 있습니까? 또는 다른 신체의 경우에 접촉하는 신체의 2 가지 경우를 탐지하는 어떤 방법?

더 많은 것을 가지고 놀아 나는 충돌하는 객체 중 하나를 제거하지 않으면 문제가 해결된다는 것을 알게되었습니다. 이것은 게임에 이상적이 아니기 때문에이 충돌을 없애고 여전히 충돌하는 모든 객체를 제거 할 수 있기를 바랍니다. 어쩌면 부모에게서 완전히 제거 된 것이 있을까요?

답변

0

그래서 나는 이것이 무엇인지 생각합니다.

표시되는 런타임 오류는 nil을 포함하는 선택 사항을 강제로 제거 할 때 발생합니다. 그리고, 당신의 발췌 문장에서, 첫 번째 본디와 두 번째 본문은 정의에 의해 풀려나게됩니다 (왜냐하면 그들의 타입 주석에 '!'이 있기 때문입니다).

저는 starDidCollideWithEnemy가 scene에서 firstBody 또는 secondBody를 제거한다고 가정합니다. 그렇지 않으면 그들을 밖으로 nils.

그러면 이중 충돌의 경우 다음 if 블록이 평가됩니다. 그러나 firstBody 또는 secondBody는 이미 무효입니다. 따라서 모든 것이 폭발합니다.

아마도 가장 간단한 것은 첫 번째 테스트의 else 블록 내부에서 두 번째 테스트를 평가하는 것입니다.

if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.Star != 0)) { 
     starDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode) 
    } 

    else if ((firstBody.categoryBitMask & PhysicsCategory.Enemy != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.Flyer != 0)) { 
     flyerDidCollideWithEnemy(firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode) 
    } 
+0

답변을 주셔서 감사합니다. 추가로 시도했지만 다른 신체가 한 번에 충돌 할 때 충돌이 발생합니다. 당신은 starDidCollideWithEnemy가 관련된 2 개의 충돌 몸체를 제거했다는 점에서 정확했습니다. 그래서 flyerDidCollideWithEnemy도 마찬가지입니다. 어쩌면 3 가지 신체 충돌을 모두 테스트 할 수있는 방법이있을 수 있습니다. 그렇다면 충돌에 관련된 모든 신체를 제거 할 수 있습니까? – spapp

관련 문제