物体在不应该碰撞时彼此碰撞(SpriteKit)

时间:2016-02-02 00:13:38

标签: ios swift sprite-kit

我使用 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没有碰撞!!!?!??!

关于我做错了什么的任何想法?

谢谢!

2 个答案:

答案 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)