Ios 不应发生碰撞的物体';t(SpriteKit)

Ios 不应发生碰撞的物体';t(SpriteKit),ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我正在使用SpriteKit和Swift 2。我知道有很多教程,但我觉得它们一定过时了,否则我会发疯的,因为似乎每个人对不同的物理部分都有不同的看法 我只是想让两个物体相互碰撞。这就是我所做的: var everythingElseCategory: UInt32 = 3 var object1Category: UInt32 = 2 var object2Category: UInt32 = 4 object1.physicsBody?.categoryBitMask = object

我正在使用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不冲突

你知道我做错了什么吗


谢谢

将此从我的评论中删除

可能有兴趣

您使用的是整数值,而不是二进制值。以下是二进制中的值:

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

这将防止多个
object1
相互碰撞,但允许与其他所有对象碰撞。

另一种编码冲突位掩码的方法是记住,默认情况下,它设置为UInt32.max,即所有对象都与所有对象碰撞。如果你想让一个物体与除特定物体以外的所有物体发生碰撞,那么从它与所有物体发生碰撞开始,然后关闭表示你不想让它与之碰撞的物体的位就更容易了

    // 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) 

关键是->这些是位掩码,以避免不必要的行为。最好这样分配它们UInt32=0x1也可能会引起兴趣。您使用的是整数值,其中需要使用二进制。转换这些,冲突类别为
0011
,其中
object2Category
0100
,这意味着不会发生冲突。最简单的方法是使用位移位来创建位掩码。看看这篇维基百科文章,更好地了解位掩码是如何工作的@Gliderman让你的评论成为答案,这样你就可以得到一些代表@user3351949 welp来修复一切。。。非常感谢!是的,你应该把它作为一个答案^^
    // 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)