【问题标题】:Cannot get didEnd(_contact: SKPhysicsContact) to work properly in swift 4无法让 didEnd(_contact: SKPhysicsContact) 在 swift 4 中正常工作
【发布时间】:2018-02-09 19:10:38
【问题描述】:
 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 ");
        }
    }
 }

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 ");
        }
    }
}

我也有

let playerCategoryBitMask:UInt32 =  1
let borderCategoryBitMask:UInt32 = 4

【问题讨论】:

    标签: swift xcode sprite-kit bitmask


    【解决方案1】:

    这是因为您使用了一种名为 bitwise AND operator (&amp;) 的方法。

    按位与运算符 (&) 组合两个数字的位。它 返回一个新数字,其位仅在位被设置为 1 时 两个输入数字都等于 1:

    let eightBits1: UInt8 = 0b00000001
    let eightBits2: UInt8  = 0b00000001
    let lastBit = eightBits1 & eightBits2  // equals 0b00000001
    

    组合位,只有最后一位 1 会返回 1,其余的都将返回 0。

    更简单的解释:

    我声明了两个变量:

    let x = 1
    let y = 1
    

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

    let eightBits1: UInt8 = 0b00000001 // 1
    let eightBits2: UInt8  = 0b00000001 // 1
    let lastBit = eightBits1 & eightBits2  // equals 0b00000001 // 2
    

    在这种情况下1,结果将始终与x(等于y)相同。

    if (x & y) != 0 {
        print("Same")
    } else {
        print("Not same")
    }
    

    在这种情况下:

    let x = 1
    let y = 2
    
    let eightBits1: UInt8 = 0b00000001  // 1
    let eightBits2: UInt8  = 0b00000010 // 2
    let noBits = eightBits1 & eightBits2  // equals 0 -> 0b00000000
    

    您得到false,但由于位运算符的结果等于零,因此将打印出不一样的结果

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

    关于您的问题:
    在您的didBegin 中,您正在比较:

    if (firstBody.categoryBitMask & playerCategoryBitMask) != 0
    

    这里你的 firstBody.categoryBitMask 是 1 并且 playerCategoryBitMask 也是 1 因此 true 并且你输入 if 语句。

    在您的didEnd 中,您正在比较:

    if (firstBody.categoryBitMask & Constants().borderCategoryBitMask) != 0
    

    这里你的firstBody.categoryBitMask 是 1,borderCategoryBitMask 是 4,因此结果是 zero,你不用输入 if 语句,因为 0 等于 0。

    现在您知道了这一点,您可以修改代码并使其工作。

    【讨论】:

    • 谢谢拉什万!所以基本上如果我让玩家停止接触墙壁,位掩码组合应该是什么? 001 和 100 是十进制的 1 和 4?
    • @Marin, np 试图尽可能具体,因此进行了所有编辑。组合 001 和 100(1 和 4)将产生 000。为了能够匹配组合,需要对齐(相同的位/位置)。
    猜你喜欢
    • 2018-07-25
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多