无法获得didEnd(_contact:SKPhysicsContact)在swift 4中正常工作

Mar*_*rin 6 xcode bitmask sprite-kit swift

 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 & Constants().playerCategoryBitMask != 0)
    {

        if(secondBody.categoryBitMask & Constants().borderCategoryBitMask == 4)
        {       touchingWall = true
                print("Touching the wall ");
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

didBegin工作得很好!

但是不知道怎么办呢?

func didEnd(_ 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 & Constants().borderCategoryBitMask != 0 )
    {

        if(secondBody.categoryBitMask & Constants().playerCategoryBitMask != 0 )
        {
            touchingWall = false
            print("Not Touching the wall ");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也有

let playerCategoryBitMask:UInt32 =  1
let borderCategoryBitMask:UInt32 = 4
Run Code Online (Sandbox Code Playgroud)

Ras*_*n L 8

这是因为你使用的方法称为bitwise AND operator (&).

按位AND运算符(&)组合两个数字的位.它返回一个新数字,只有当两个输入数字中的位数等于1时才将其设置为1:

在此输入图像描述

let eightBits1: UInt8 = 0b00000001
let eightBits2: UInt8  = 0b00000001
let lastBit = eightBits1 & eightBits2  // equals 0b00000001
Run Code Online (Sandbox Code Playgroud)

将这些位组合起来只有最后一位1将返回1所有其余位将返回零.

一个更简单的解释:

我声明了两个变量:

let x = 1
let y = 1
Run Code Online (Sandbox Code Playgroud)

这里x和y的值都是1,当你使用按位AND运算符时,结果也是1,当检查结果是否不等于零时,它将为真(任何不等于零的结果都会返回真正).

let eightBits1: UInt8 = 0b00000001 // 1
let eightBits2: UInt8  = 0b00000001 // 1
let lastBit = eightBits1 & eightBits2  // equals 0b00000001 // 2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果总是与x(等于y)相同1.

if (x & y) != 0 {
    print("Same")
} else {
    print("Not same")
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

let x = 1
let y = 2

let eightBits1: UInt8 = 0b00000001  // 1
let eightBits2: UInt8  = 0b00000010 // 2
let noBits = eightBits1 & eightBits2  // equals 0 -> 0b00000000
Run Code Online (Sandbox Code Playgroud)

你得到false,并且由于位运算符的结果也等于零不一样会被打印出来

基本上,如果您使用Bitwise AND operator两个相同的数字,结果将始终是相同的数字.

对你的问题:
didBegin你的比较中:

if (firstBody.categoryBitMask & playerCategoryBitMask) != 0
Run Code Online (Sandbox Code Playgroud)

这里你firstBody.categoryBitMask是1,playerCategoryBitMask因此也是1 true,你输入if语句.

didEnd你的比较中:

if (firstBody.categoryBitMask & Constants().borderCategoryBitMask) != 0
Run Code Online (Sandbox Code Playgroud)

这里你firstBody.categoryBitMask是1并且borderCategoryBitMask是4因此结果是zero你不输入if语句因为0它等于零.

既然您知道这一点,就可以修改代码并使其正常工作.