我无法理解这个位掩码是如何工作的。 我知道默认设置为0xFFFFFFFF,如果你想要两个实体联系,你可以设置两个不同的位掩码。
我的问题是我如何设置2个(或更多)不同的位掩码,如何更改默认值以获得不同的值? 我知道有32个不同的类别。你能给我一些吗?
答案 0 :(得分:1)
<强>分类强>
您可以拥有32个不同的类别。类别可以是船只,子弹,墙壁,敌人等)。如果您对碰撞和接触感兴趣,那么首先需要为给定的对象设置类别。例如,船只类别0,子弹类别1,墙壁类别2,敌人类别3.因为它们是位掩码,所以你有(分别)1,2,4,8。 现在,类别更多的是行为而非身份。有些物体可能表现得像两个不同的类别:岩石(没有类别本身)表现得像墙壁(你在它上面弹跳)和敌人(你可以向它们扔石头)。然后岩石的类别将是2和3,因为位掩码这给出了12。不容易想象一个对象属于不同的类别,但是如果你考虑行为集而不是身份集,那就很容易考虑它
掩码的默认值是0xFFFFFFFF,表示每个对象都在每个可能的类别中,并且每个对象都相互冲突。 微调这些值可以严重改善物理引擎。
<强>碰撞强>
碰撞用于定义哪些对象在物理世界中发生碰撞。某些物体可能会相互交叉而其他物体反弹。例如:一个神奇的子弹可以穿过墙壁,而普通的子弹则停在墙壁上。
magicBullet.physicsBody.categoryBitMask = 1
ordinaryBullet.physicsBody.categoryBitMask = 1 // both bullets behave as bullets
wall.physicsBody.categoryBitMask = 2
ordinaryBullet.physicsBody.collisionBitMask = 2 // hits walls
magicBullet.physicsBody.collisionBitMask = 0 // do not physically see walls
冲突被声明为位掩码,因为您必须声明给定对象能够与之进行物理交互的其他类别。
联系人强>
联系人与冲突完全相同,但在代码中捕获是两个对象联系的事实。因此,如果你对普通子弹击中墙壁感兴趣(对于神奇的,它不一定有趣):
ordinaryBullet.physicsBody.contactTestBitMask = 2 // want to catch wall hit
magicBullet.physicsBody.contactTestBitMask = 0 // don't bother
稍微复杂的例子
现在,如果你添加另一种对象说硬墙,那么可以给出:
magicBullet.physicsBody.categoryBitMask = 1
ordinaryBullet.physicsBody.categoryBitMask = 1 // both bullets behave as bullets
wall.physicsBody.categoryBitMask = 2 // some bullets may travel through
hardWall.physicsBody.categoryBitMask = 4 // nothing can travel through thses
ordinaryBullet.physicsBody.collisionBitMask = 6 // hits walls and hard walls
magicBullet.physicsBody.collisionBitMask = 4 // do not physically see walls but only hard walls
ordinaryBullet.physicsBody.contactTestBitMask = 6 // want to catch all wall hit
magicBullet.physicsBody.contactTestBitMask = 4 // just want to catch hard wall hitting