Я работаю над игрой с множеством столкновений. Я создал Перечень следующим образом: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? Почему именно это? Благодаря!
Почему вы получаете исходное значение вместо значения? Ваш мяч правильный, потому что CollisionCategories.ball.rawValue == CollisionCategories.ball. –
@SimonePistecchia Я не уверен, что вы имеете в виду ... Чтобы получить значение UInt32, вам нужно запустить rawValue. Вы не можете установить categoryBitMask в противном случае. – Kendel
Цель 2 не имеет категорииBitMask, поэтому по умолчанию UInt32.max – Knight0fDragon