2017-03-17 2 views
1

downvotes로 십자가에 못 박히기 전에 나는 이것에 대한 연구를했으며 아직이 오류가 왜 발생하는지 이해할 수 없다고 말합니다.선택적 unwrapping SKPhysics 오류

나는 플레이어가 방어하려고하는 핵심을 가지고 있으며, 유성에 대비하여 작은 레이저를 발사 할 수 있습니다. 글쎄, 나는 모든 것을 설정하고 작업 할 수 있지만 (대부분의 경우 어쨌든), 레이저가 유성을 때리고 충돌 처리 기능이 샷 노드와 유성 노드를 제거하려고 할 때마다이 오류가 발생합니다.

fatal error: unexpectedly found nil while unwrapping an Optional value 

다시 이것에 대해 많은 조사를 했으므로 알아낼 수 없습니다. 여기

내 didBegin입니다 :

func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.node?.name == "shot") { // shot A 
     collisionBetween(first: (contact.bodyA.node)!, second: (contact.bodyB.node)!) 
    } else if (contact.bodyB.node?.name == "shot") { // shot B 
     collisionBetween(first: (contact.bodyB.node)!, second: (contact.bodyA.node)!) 
    } 
    if (contact.bodyA.node?.name == "core") { // core A 
     collisionBetween(first: (contact.bodyA.node)!, second: (contact.bodyB.node)!) 
    } else if (contact.bodyB.node?.name == "core") { // core B 
     collisionBetween(first: (contact.bodyB.node)!, second: (contact.bodyB.node)!) 
    } 

} 

여기 내 collisionBetween 기능입니다 :

func collisionBetween(first: SKNode, second: SKNode) { 

    if first.name == "shot" && second.name == "sMeteor" { 
     first.removeFromParent() // these two only throw the error 
     second.removeFromParent() // every once and a while 
    } else if first.name == "sMeteor" && second.name == "shot" { 
     first.removeFromParent() // these two throw the error also 
     second.removeFromParent() // but only on occasion 
    } else if first.name == "mMeteor" && second.name == "shot" { 
     second.removeFromParent() 
    } else if first.name == "shot" && second.name == "mMeteor" { 
     first.removeFromParent() 
    } 
    if first.name == "core" && second.name == "sMeteor" { 
     second.removeFromParent() //always throws the error 
    } else if first.name == "sMeteor" && second.name == "core" { 
     first.removeFromParent() //always throws the error 
    } 

} 

지금 잠시 동안이 오류를 알아 내기 위해 노력하고 있었고, 나는이 같은 느낌 선택 사항에 대한 기본적인 이해. 이 오류는 부모 노드를 제거하려고 할 때만 발생합니다. self이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 나와 달리 이해할 수는 없습니다. 어떤 도움을 주셔서 감사합니다, 감사합니다!

답변

2

이 문제는 동일한 연락처에 대해 여러 연락처 이벤트를 생성하는 SpriteKit 때문에 발생한다고 생각됩니다. (예 : didBegin()) 2 번 이상 같은 몸체로 & bodyB)

처음으로 호출해도 문제가 없습니다. 두 번째로 상황이 제거되고 일부 노드 및/또는 본문이 0이됩니다. Sprite-Kit registering multiple collisions for single contact

을 당신이 당신의 didBegin() 예를 들어, 일부 인쇄 문을 넣어 줄 경우 도움이된다면

확인이 답변이 볼 수 당신은 아마 로그에서 본 것

func didBegin(_ contact: SKPhysicsContact) { 
    print("Contact between \(contact.bodyA.node?.name) & \(contact.bodyB.node?.name)") 
    if (contact.bodyA.node?.name == "shot") { // shot A 

: 단지 1 접촉이 발생

Contact between shot and sMeteor 
Contact between shot and sMeteor 
Contact between shot and sMeteor 

.

또한, 당신의 didBegin()collisionBetween() 기능이 지나치게 (플러스 collisionBetween 정말 contactBetween()라고한다) 복잡 봐.

나는 didBegin()를 코딩하는 깔끔한 방법입니다 찾을 : 당신의 노드가 확인하는 당신에게 달려 한 번에 하나 개의 범주에 속하는 경우

func didBegin(contact: SKPhysicsContact) { 
      let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

      switch contactMask { 

      case categoryBitMask.shot | categoryBitMask.sMeteor: 
       print("Collision between shot and sMeteor") 
       contact.bodyA.removeFromParent() 
       contact.bodyB.removeFromParent() 

      case categoryBitMask.shot | categoryBitMask.mMeteor: 
       print("Collision between shot and mMeteor") 
       let shot = contact.bodyA.categoryBitMask == categoryBitMask.shot ? contact.bodyA.node! : contact.bodyB.node! 
       shot.removeFromParent() 

      case categoryBitMask.core | categoryBitMask.sMeteor: 
       print("Collision between core and sMeteor") 
       let meteor = contact.bodyA.categoryBitMask == categoryBitMask.sMeteor ? contact.bodyA.node! : contact.bodyB.node! 
       meteor.removeFromParent() 

      default : 
       //Some other contact has occurred 
       print("Some other contact") 
     } 
    } 

이 정말에만 안전합니다.

'core'와 'mMeteor'가 연락하면 어떻게됩니까?

+1

나는 많은 것으로 의심된다! 이 디버깅을 시도 할 때 didBegin 여러 호출을 받고 있지만 그것을 해결하는 방법을 몰랐다. 대단히 감사합니다. 연결 한 답변을 꼭 확인해 보겠습니다. 또한 내 collisionBetween 함수를 청소 해 주셔서 감사합니다. 다소 혼란스럽고 메서드가 무리를 없애줍니다. 정말 고마워! –

관련 문제