2016-08-28 3 views
-1

Я работаю над игрой с множеством столкновений. Я создал Перечень следующим образом:categoryBitMask Возврат UInt32.max

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

Затем я создал некоторые переменные категории:

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 

Вот где я вывести информацию

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

} 

Однако, когда цель и мяч он возвращает следующее:

Body A: 4294967295 
Body B: 2 

Тело B - это правильная категория мяча; однако Тело А явно выключено. Вот как я создаю узел цели:

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 

Так, может кто-нибудь может объяснить, почему они думают, что categoryBitMask Боде является возвращение максимального UInt32? Обратите внимание, что КАЖДЫЙ столкновение за исключением мяча, попавшего в цель, отлично работает.

Также, быстрый вопрос стороны: Кто-нибудь знает, как выбираются bodyA и bodyB? Почему именно это? Благодаря!

+0

Почему вы получаете исходное значение вместо значения? Ваш мяч правильный, потому что CollisionCategories.ball.rawValue == CollisionCategories.ball. –

+0

@SimonePistecchia Я не уверен, что вы имеете в виду ... Чтобы получить значение UInt32, вам нужно запустить rawValue. Вы не можете установить categoryBitMask в противном случае. – Kendel

+0

Цель 2 не имеет категорииBitMask, поэтому по умолчанию 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

@JozemiteAppsI действительно сделав это сейчас. Я просто тестировал все, что мог найти, почему это может не работать. Сейчас работает отлично, мне просто нужно добавить дополнительный узел. Благодаря! – Kendel

Смежные вопросы