2017-02-04 17 views
0

У меня есть 4 физических тела, которые хорошо обнаруживают столкновения. Однако есть два физических тела, которые не будут обнаруживать, когда они сталкиваются друг с другом. Однако они обнаруживают, когда сталкиваются с другими физическими телами. У меня есть контактные маски для всех, поэтому я не понимаю, почему возникает проблема. Вот код: Вот где я насторить физик тела:столкновение физики spritekit не обнаружено

struct PhysicsCategory{ 
    static let None  : UInt32 = 0 
    static let All  : UInt32 = UInt32.max 
    static let player : UInt32 = 0b1 
    static let bounce : UInt32 = 0b10 
    static let blueball : UInt32 = 0b100 
    static let redball : UInt32 = 0b1000 
    static let coin  : UInt32 = 0b10000 
} 

Вот код, где я использовал для создания тела физики игрока, который является одной из проблем физико тел:

 player.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: player.size.width-40, height: player.size.height-40)) 
    player.physicsBody?.isDynamic = true 
    player.physicsBody?.categoryBitMask = PhysicsCategory.player 
    player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball 
    player.physicsBody?.contactTestBitMask = PhysicsCategory.redball 
    player.physicsBody?.collisionBitMask = PhysicsCategory.None 

Вот FUNC для обнаружения столкновений:

func didBegin(_ 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.player != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.redball != 0)) { 
     RedballDidCollideWithPlayer(player: firstBody.node as! SKSpriteNode, redball: secondBody.node as! SKSpriteNode) 
    } 
    if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.blueball != 0)) { 
     BlueballDidCollideWithPlayer(player: firstBody.node as! SKSpriteNode, blueball: secondBody.node as! SKSpriteNode) 
    } 
    if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.redball != 0)){ 
     RedballDidCollideWithBounce(bounce: firstBody.node as! SKSpriteNode, redball: secondBody.node as! SKSpriteNode) 
    } 
    if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.blueball != 0)) { 
     BlueballDidCollideWithBounce(bounce: firstBody.node as! SKSpriteNode, blueball: secondBody.node as! SKSpriteNode) 
    } 
    if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.coin != 0)) { 
     coinDidCollideWithplayer(player: firstBody.node as! SKSpriteNode, coin: secondBody.node as! SKSpriteNode) 
    } 
    if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) && 
     (secondBody.categoryBitMask & PhysicsCategory.coin != 0)) { 
     coinDidCollideWithplayer(player: firstBody.node as!  SKSpriteNode, coin: secondBody.node as! SKSpriteNode) 
    } 

} 

Вот код, который я использовал для настройки blueball. Это другой физический корпус, имеющий проблемы:

let blueball = SKSpriteNode(imageNamed: "blueball") 
     blueball.position = enemyb.position 
     blueball.physicsBody = SKPhysicsBody(circleOfRadius: blueball.size.width/2) 
     blueball.physicsBody?.isDynamic = true 
     blueball.physicsBody?.categoryBitMask = PhysicsCategory.blueball 
     blueball.physicsBody?.contactTestBitMask = PhysicsCategory.player 
     blueball.physicsBody?.contactTestBitMask = PhysicsCategory.bounce 
     blueball.physicsBody?.collisionBitMask = PhysicsCategory.None 
     blueball.physicsBody?.usesPreciseCollisionDetection = true 
     addChild(blueball) 
     let actionMove = SKAction.move(to: player.position, duration: 2) 

Любые идеи здесь были бы полезны. Я пытался найти проблему в течение нескольких дней без везения.

+0

комментарий эту строку кода и попробовать еще раз, 'player.physicsBody .isDynamic = true' – Mina

+0

@Mina сделал это. Ничего не меняет. –

+0

прокомментируйте это как для узлов, игроков, так и для синего, я думаю, проблема связана с isDynamic свойством. – Mina

ответ

1

При настройке нескольких категорий вы должны ИЛИ значения вместе. Ваш код

player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball 
player.physicsBody?.contactTestBitMask = PhysicsCategory.redball 

Просто задает категорию дважды, вторая - первая. Измените это:

player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball | PhysicsCategory.redball