首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使didEnd(_contact: SKPhysicsContact)在swift 4中正常工作

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

Stack Overflow用户
提问于 2018-02-09 19:10:38
回答 1查看 391关注 0票数 6
代码语言:javascript
复制
 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工作得很好!

但是didEnd不知道怎么做呢?

代码语言:javascript
复制
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 ");
        }
    }
}

我也有

代码语言:javascript
复制
let playerCategoryBitMask:UInt32 =  1
let borderCategoryBitMask:UInt32 = 4
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-14 20:04:57

这是因为您使用的是一种名为bitwise AND operator (&). 的方法

按位和运算符(&)组合了两个数字的位。它返回一个新的数字,只有当两个输入数字中的比特等于1时,该数字的位才被设置为1:

代码语言:javascript
复制
let eightBits1: UInt8 = 0b00000001
let eightBits2: UInt8  = 0b00000001
let lastBit = eightBits1 & eightBits2  // equals 0b00000001

组合这些位时,只有最后一个位1将返回1,其余的全部返回零。

--一个更简单的解释:

我声明两个变量:

代码语言:javascript
复制
let x = 1
let y = 1

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

代码语言:javascript
复制
let eightBits1: UInt8 = 0b00000001 // 1
let eightBits2: UInt8  = 0b00000001 // 1
let lastBit = eightBits1 & eightBits2  // equals 0b00000001 // 2

结果总是与x相同(这等于y),在本例中是1

代码语言:javascript
复制
if (x & y) != 0 {
    print("Same")
} else {
    print("Not same")
}

在这种情况下:

代码语言:javascript
复制
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里,你在比较:

代码语言:javascript
复制
if (firstBody.categoryBitMask & playerCategoryBitMask) != 0

在这里,您的firstBody.categoryBitMask是1,playerCategoryBitMask也是1,因此输入true,然后输入if-语句。

在你的didEnd中,你在比较:

代码语言:javascript
复制
if (firstBody.categoryBitMask & Constants().borderCategoryBitMask) != 0

在这里,您的firstBody.categoryBitMask是1,borderCategoryBitMask是4,因此结果是zero,您没有输入if-语句,因为0等于零。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48712580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档