【发布时间】:2018-02-23 08:55:24
【问题描述】:
我很难理解这个位掩码是如何工作的。 我知道这默认设置为 0xFFFFFFFF,如果您希望两个实体联系,请设置两个不同的位掩码。
我的问题是如何设置 2 个(或更多)不同的位掩码,如何更改默认值以获得不同的值? 我知道有 32 个不同的类别。你能给我一些吗?
【问题讨论】:
标签: swift sprite-kit contacts bitmask uint32
我很难理解这个位掩码是如何工作的。 我知道这默认设置为 0xFFFFFFFF,如果您希望两个实体联系,请设置两个不同的位掩码。
我的问题是如何设置 2 个(或更多)不同的位掩码,如何更改默认值以获得不同的值? 我知道有 32 个不同的类别。你能给我一些吗?
【问题讨论】:
标签: swift sprite-kit contacts bitmask uint32
类别
您可以拥有 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
【讨论】: