我使用 SpriteKit 和 Swift 2 。我知道有很多教程,但我觉得它们必定已经过时或者我疯了,因为似乎每个人对不同的物理位掩码都有不同的看法。
我只是试图让两个物体与除了彼此以外的所有物体发生碰撞。这就是我所做的:
var everythingElseCategory: UInt32 = 3
var object1Category: UInt32 = 2
var object2Category: UInt32 = 4
object1.physicsBody?.categoryBitMask = object1;
object1.physicsBody?.collisionBitMask = everythingElseCategory
object2.physicsBody?.categoryBitMask = object2;
object2.physicsBody?.collisionBitMask = everythingElseCategory
everythingElse.physicsBody?.categoryBitMask = everythingElseCategory;
everythingElse.physicsBody?.collisionBitMask = 0 //its a wall
我必须把位掩码的概念搞砸了,因为对我来说碰撞位掩码是它碰撞的但是看起来我一定是错的,因为这个解决方案不起作用。 Object2与object1冲突,但object1与object2没有碰撞!!!?!??!
关于我做错了什么的任何想法?
谢谢!
答案 0 :(得分:2)
从评论中移除此信息。
Apple's SpriteKit physics example可能会引起人们的兴趣。
您使用的是整数值,而不是二进制值。以下是二进制值中的值:
everythingElseCategory = 0011b // I think you need the "b" somewhere to indicate binary
object1Category = 0010b
object2Category = 0100b
基本上,SK physics将在两个对象上使用&
(二元和)运算符,如果值不是0
,它们将发生冲突。以你的两个对象为例:
object1.physicsBody?.categoryBitMask = object1 (0010)
object1.physicsBody?.collisionBitMask = everythingElseCategory (0011)
object2.physicsBody?.categoryBitMask = object2 (0100)
object2.physicsBody?.collisionBitMask = everythingElseCategory (0011)
object1
位掩码将与object2
冲突,因为0010 & 0011 == 0010
或非零。 object2
位掩码不会与object1
发生冲突,因为0100 & 0011 == 0000
零或无碰撞。
解决此问题的最简单方法是使用位移。语法如下所示:
value = bitValue << placesToShiftLeft
所以你的位掩码设置如下:
everythingElseCategory = 1 << 0 // I have this shifted by 0 just to show that you can do that
object1Category = 1 << 1
object2Category = 1 << 2
现在,当您将位掩码设置为对象时,请使用|
(二进制或)运算符来组合它们。 001 | 010 == 011
是如何运作的。
object1.physicsBody?.categoryBitMask = object1Category
object1.physicsBody?.collisionBitMask = everythingElseCategory | object2Category
object2.physicsBody?.categoryBitMask = object2Category
object2.physicsBody?.collisionBitMask = everythingElseCategory | object1Category
everythingElse.physicsBody?.categoryBitMask = everythingElseCategory | object1Category | object2Category
这可以防止多个object1
相互冲突,但允许与其他所有内容发生冲突。
答案 1 :(得分:1)
对碰撞位掩码进行编码的另一种方法是记住,默认情况下,它设置为UInt32.max,即一切都与所有内容冲突。如果你想让一个物体与除了特定物体之外的所有物体发生碰撞,那么它就会更容易与它碰撞,然后关闭代表你不希望它与之碰撞的物体的位... / p>
您可以打开和关闭特定类别的碰撞,而不会影响任何其他碰撞,如下所示: // Assign the category
object1.physicsBody?.categoryBitMask = object1Category
// Turn off collisions with object1 and object2
object1.physicsBody?.collisionBitMask &= ~(object1Category | object2Category)
// Turn on collisions with object3
object1.physicsBody?.collisionBitMask |= object3Category
// Turn off collisions with object4
object1.physicsBody?.collisionBitMask &= ~object4Category
// Turn on collisions with object 5 & 6
object1.physicsBody?.collisionBitMask |= (object5Category | object6Category)