无法让 didEnd(_contact: SKPhysicsContact) 在 swift 4 中正常工作
Cannot get didEnd(_contact: SKPhysicsContact) to work properly in swift 4
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 不知道该怎么做?
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
这是因为您正在使用一种名为 bitwise AND operator (&)
的方法。
The bitwise AND operator (&) combines the bits of two numbers. It
returns a new number whose bits are set to 1 only if the bits were
equal to 1 in both input numbers:
let eightBits1: UInt8 = 0b00000001
let eightBits2: UInt8 = 0b00000001
let lastBit = eightBits1 & eightBits2 // equals 0b00000001
只有最后一位 1 将这些位组合起来 return 1 所有其余的都会 return 零。
更简单的解释:
我声明了两个变量:
let x = 1
let y = 1
这里 x 和 y 的值都是 1,当你使用按位 AND 运算符时,结果也将是 1,当检查结果是否不等于 0 时,它会是 true(任何结果不是等于零将 return 为真)。
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 等于零。
既然你知道了这一点,你就可以修改你的代码并让它工作了。
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 不知道该怎么做?
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
这是因为您正在使用一种名为 bitwise AND operator (&)
的方法。
The bitwise AND operator (&) combines the bits of two numbers. It returns a new number whose bits are set to 1 only if the bits were equal to 1 in both input numbers:
let eightBits1: UInt8 = 0b00000001
let eightBits2: UInt8 = 0b00000001
let lastBit = eightBits1 & eightBits2 // equals 0b00000001
只有最后一位 1 将这些位组合起来 return 1 所有其余的都会 return 零。
更简单的解释:
我声明了两个变量:
let x = 1
let y = 1
这里 x 和 y 的值都是 1,当你使用按位 AND 运算符时,结果也将是 1,当检查结果是否不等于 0 时,它会是 true(任何结果不是等于零将 return 为真)。
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 等于零。
既然你知道了这一点,你就可以修改你的代码并让它工作了。