2016-08-28 2 views
-1

나는 다양한 충돌을 가지고 게임을하고있다. 내가categoryBitMask Returning UInt32.max

func didBeginContact(contact: SKPhysicsContact) { 
    print("Body A: " + String(contact.bodyA.categoryBitMask)) 
    print("Body B: " + String (contact.bodyB.categoryBitMask) + "\n") 

} 

그러나 정보를 인쇄 할 경우

다음
let localPlayerCategory: UInt32 = CollisionCategories.localPlayer.rawValue 
let ballCategory: UInt32 = CollisionCategories.ball.rawValue 
let remotePlayerCategory: UInt32 = CollisionCategories.remotePlayer.rawValue 
let sceneCategory: UInt32 = CollisionCategories.scene.rawValue 
let goalCategory: UInt32 = CollisionCategories.goal.rawValue 

이며, 목표와 공 :

enum CollisionCategories: UInt32 { 
    case localPlayer = 1 
    case ball = 2 
    case remotePlayer = 4 
    case scene = 8 
    case goal = 16 
} 

내가 다음 몇 가지 범주 변수를 만들어 다음과 같이 내가 열거를 만들었습니다 충돌하면 다음과 같이 반환됩니다.

Body A: 4294967295 
Body B: 2 

바디 B가 볼 카테고리입니다. 그러나 몸 A는 분명히 꺼져 있습니다. 오히려 단지 섹션보다 있는지 확인하기 위해, 당신은 내가 밖으로 위의 주석 라인에서 볼 수 있듯이, 나는 또한 목표로 전체 물리 본체 설정을 시도

let goal2 = self.newGoal() 
goal2.zRotation = CGFloat(M_PI) 
goal2.position = CGPoint(x: (gameFrame!.frame.width/2), y: 0) 
let bottom2 = SKPhysicsBody(edgeFromPoint: CGPoint(x: -(goal2.frame.width), y:-(goal2.frame.height/2)), toPoint: CGPoint(x: 0, y:-(goal2.frame.height/2))) 
bottom2.categoryBitMask = sceneCategory 
let top2 = SKPhysicsBody(edgeFromPoint: CGPoint(x: -(goal2.frame.width), y:(goal2.frame.height/2)), toPoint: CGPoint(x: 0, y:(goal2.frame.height/2))) 
top2.categoryBitMask = sceneCategory 
let back2 = SKPhysicsBody(edgeFromPoint: CGPoint(x: -(goal2.frame.width), y:(goal2.frame.height/2)), toPoint: CGPoint(x: -(goal2.frame.width), y:-(goal2.frame.height/2))) 
back2.categoryBitMask = goalCategory 
goal2.physicsBody = SKPhysicsBody(bodies: [bottom2,top2,back2]) 
//goal2.physicsBody!.categoryBitMask = goalCategory 
goal2.physicsBody!.usesPreciseCollisionDetection = true 
goal2.physicsBody!.affectedByGravity = false 
goal2.physicsBody!.dynamic = false 

: 여기에 내가 목표 노드를 작성하는 방법입니다 그것이 문제의 원인이었습니다. 그렇지 않았습니다.

그래서
ball.physicsBody!.collisionBitMask = localPlayerCategory | sceneCategory | goalCategory 
ball.physicsBody!.categoryBitMask = ballCategory 
ball.physicsBody!.contactTestBitMask = goalCategory 

가 bodyA의 categoryBitMask가 최대 UINT32을 반환 생각하는 이유, 사람이 설명 할 수 있습니다 : 나는 공의 물리 특성을 만드는 방법은 다음과

은? 목표를 때리는 공을 제외한 모든 충돌은 잘 작동합니다.

또한 빠른 측면 질문 : bodyA 및 bodyB가 선택되는 방법을 아는 사람이 있습니까? 왜 어떤 걸까요? 감사!

+0

왜 값 대신 원시 값을 얻습니까? CollisionCategories.ball.rawValue == CollisionCategories.ball이므로 공이 정확합니다. –

+0

@SimonePistecchia 당신이 의미하는 것이 확실하지 않습니다 ... UInt32 값을 얻으려면 rawValue를 실행해야합니다. 그렇지 않으면 categoryBitMask를 설정할 수 없습니다. – Kendel

+0

목표 2에는 categoryBitMask가 없으므로 기본값은 UInt32.max – Knight0fDragon

답변

0

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/#//apple_ref/occ/clm/SKPhysicsBody/bodyWithBodies에 따르면 : 사용 된 신체의 속성은 무시됩니다. 그들의 모양 만이 새로운 물리 구조를 만드는 데 사용됩니다. 즉, 개별 섹션에는 자체적으로 categoryBitMask을 가질 수 없습니다. 원하는 결과를 얻으려면 별도의 노드를 사용해야합니다.

+0

나는 당신을 건의한다 이진수로 UInt32 변수를 선언하십시오. 따라서 2는 0b10이고 4는 0b100입니다. 이렇게하면 rawValue를 사용할 수 없게됩니다. –

+0

@JozemiteApps 지금 실제로 그렇게하고 있습니다. 나는 그것이 작동하지 않을 수있는 이유에 대해 찾을 수있는 것을 테스트하고있었습니다. 지금은 잘 작동하지만 추가 노드를 추가해야했습니다. 감사! – Kendel