2017-10-04 5 views
0

두 개의 노드, 하나의 "고양이"와 하나의 "쥐"가 있지만 어떤 이유로 인해 충돌이 감지되지 않습니다. 나는 마스크이 방법을 사용하고 있습니다 :SpriteKit 충돌이 감지되지 않습니다.

// Cat physics body, the node's name is "cat"  
    public func initializeAt(position: CGPoint) { 

    sprite.position = position 
    sprite.zPosition = 5 
    sprite.name = "cat" 
    sprite.alpha = 0.7 
    scene.sceneContent.addChild(sprite) 

    sprite.physicsBody = SKPhysicsBody(rectangleOf: sprite.size) 
    sprite.physicsBody!.isDynamic = false 
    sprite.physicsBody!.categoryBitMask = CollisionTypes.cat.rawValue 
    sprite.physicsBody!.contactTestBitMask = CollisionTypes.rat.rawValue 
    sprite.physicsBody!.collisionBitMask = CollisionTypes.rat.rawValue 


    // Rat physics body, the nodes name is "rat" 
    init() { 
    node.name = "rat" 
    node.zPosition = 5 

    node.physicsBody = SKPhysicsBody(rectangleOf: node.size) 
    node.physicsBody!.isDynamic = false 
    node.physicsBody!.categoryBitMask = CollisionTypes.rat.rawValue 
    node.physicsBody!.contactTestBitMask = CollisionTypes.cat.rawValue 
    node.physicsBody!.collisionBitMask = CollisionTypes.cat.rawValue 

    setupFrames() 
    } 

가 여기 내 didBegin() 방법이다 : 나는 그들의 물리학 몸을 초기화 곳

다음
enum CollisionTypes: UInt32 { 
    case holder  = 1 
    case chef  = 2 
    case powerups = 4 
    case ingredients = 8 
    case utensils = 16 
    case floor  = 32 
    case bag   = 64 
    case table  = 128 
    case tip   = 256 
    case rat   = 512 
    case cat   = 1024 
    } 

입니다. 그러나 if 문 중 하나도 실행되지 않고 왜이 프로젝트를 다른 방법으로 사용했는지 알 수 없습니다. 나는 contactTestBitMasks 놀아 그들에게 "재료"와 같은 다른 일을하려고하면

func didBegin(_ contact: SKPhysicsContact) { 
    if let node1 = contact.bodyA.node as? SKSpriteNode, 
     let node2 = contact.bodyB.node as? SKSpriteNode { 

     if node1.name == "rat" && node2.name == "cat" { 

      for rat in rats { 
       if node1 == rat.node { 
        rat.die() 
       } 
      } 

      Cat.shared.resetPosition() 
      return 
     } 
     else if node1.name == "cat" && node2.name == "rat" { 

      for rat in rats { 
       if node2 == rat.node { 
        rat.die() 
       } 
      } 

      Cat.shared.resetPosition() 
      return 
     } 

, 나는 고양이와 쥐 재료와 상호 작용하지만, 그들은 단지 못해 서로와 상호 작용하는 것처럼 보이는 것을 볼 수 있습니다.

+0

노드 이름을 지정하지 않아도된다고 주장 할 수 있지만 제공된 코드에서 이름을 지정하지 마십시오. – Knight0fDragon

+0

노드 이름의 출처는 어디입니까? –

+0

나는 내 노드의 이름을 짓는다. 미안하지 않았다. 나는 나의 질문을 편집했다. 하지만 다른 physicsbodies와 상호 작용하는지 테스트하기 위해 이름을 올바르게 사용했음을 알고 있습니다. – Brejuro

답변

1

ratscats은 둘 다 isDynamicfalse으로 설정되어 있기 때문에 서로 접촉을 트리거하지 않습니다. 연락처가 트리거되기 전에 적어도 하나는 동적이어야합니다. https://developer.apple.com/documentation/spritekit/skphysicsbody 볼륨 기반의 몸이 중력, 마찰, 다른 개체, 그리고 힘과 충돌에 의해 영향을하거나 직접 객체에 적용 충동 isDynamic 속성 여부를 제어

에서

.

+0

나는'ingredients' 스프라이트가 동적이라고 가정합니다. 그래서'cat'이나'rat'가'ingredients'에 닿으면, 충돌과/또는 접촉이 생성됩니다. –

+0

위대한 그것이어야합니다! @ 스티브 당신이 여기있는 100 % 감사합니다. – Brejuro