2015-07-04 2 views
0
struct PhysicsCategory { 
    static let None  : UInt32 = 0 
    static let All  : UInt32 = UInt32.max 
    static let planet : UInt32 = 0b1  
    static let rocket : UInt32 = 0b10 } 

planet.physicsBody = SKPhysicsBody(circleOfRadius: planet.size.width/2) 
planet.physicsBody?.dynamic = true planet.physicsBody?.categoryBitMask = PhysicsCategory.planet 
planet.physicsBody?.contactTestBitMask = PhysicsCategory.rocket 
planet.physicsBody?.collisionBitMask = PhysicsCategory.None 

func planetCollidedWithRocket(rocket: SKSpriteNode, planet: SKSpriteNode) { 
    println("collision planet") } 



func didBeginContact(contact: SKPhysicsContact) { 
     var firstBody: SKPhysicsBody 
     var secondBody: SKPhysicsBody 
     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
     } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA } 

     if ((firstBody.categoryBitMask & PhysicsCategory.planet != 0) && 
      (secondBody.categoryBitMask & PhysicsCategory.rocket != 0)) { 
      planetCollidedWithRocket(firstBody.node as! SKSpriteNode, planet: secondBody.node as! SKSpriteNode)} 

В настоящее время я использую это, чтобы добавить обнаружение столкновений в мою игру (я взял только извлеченные фрагменты кода, которые, на мой взгляд, актуальны). В первый раз, когда я запускал игру на симуляторе, он работал отлично, и я добавил игру поверх сцены в метод planetCollidedWithRocket. Но я тестировал его снова сегодня, и по какой-то причине игра обнаруживает столкновение между ракетой и планетой, когда они не сталкиваются! Может ли кто-нибудь увидеть, что я сделал неправильно?SKPhysics работает неправильно?

ответ

0

Ваш контакт настроен неправильно. Это то, что вы есть, и то, что он переводит:

if((firstBody.categoryBitMask & PhysicsCategory.planet !=0) 
// This is checking if the firstBody *has* a categoryBitMask, but it is not evaluating what it is. 
// In addition to that, it is requiring that the PhysicsCategory.planet does not equal zero, which it doesn't. 
// This would evaluate to true every time, no matter what. 
// It is also requiring that... 


&& (secondBody.categoryBitMask & PhysicsCategory.rocket != 0)) 
// This is checking if the secondBody *has* a categoryBitMask, but it is not evaluating what it is. 
// In addition to that, it is requiring that the PhysicsCategory.planet does not equal zero, which it doesn't. 
// This would evaluate to true every time, no matter what. 

Что вам нужно сделать, это убедиться, что вы categoryBitMask равно один из ваших переменных PhysicsCategory, таким образом, что, когда планета и ракета контакт, что-то оценивает к истине. Попробуйте это:

if ((firstBody.categoryBitMask == PhysicsCategory.planet) && 
    (secondBody.categoryBitMask == PhysicsCategory.rocket)){ 

// Code Here 

} 

В качестве альтернативы, так как вы знаете жестко закодированные номера в Вашей PhysicsCategory структуры, вы можете оценить, точные цифры:

if ((firstBody.categoryBitMask == 1) && 
    (secondBody.categoryBitMask == 2)){ 

// Code Here 

} 

Что это будет сделать, это проверить, если physicsBody-х categoryBitMask равна определенным числам, когда они контактируют. Если они это делают, что-то происходит, если нет, ничего не происходит.

+0

Это решило мою проблему, большое вам спасибо! – JGrn84

+0

Ты очень рад :) – Phoenix

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