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)
这是因为你使用的方法称为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它等于零.
既然您知道这一点,就可以修改代码并使其正常工作.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |