【问题标题】:How does the category bit mask work in SpriteKit?(0xFFFFFFFF)SpriteKit 中的类别位掩码如何工作?(0xFFFFFFFF)
【发布时间】:2018-02-23 08:55:24
【问题描述】:

我很难理解这个位掩码是如何工作的。 我知道这默认设置为 0xFFFFFFFF,如果您希望两个实体联系,请设置两个不同的位掩码。

我的问题是如何设置 2 个(或更多)不同的位掩码,如何更改默认值以获得不同的值? 我知道有 32 个不同的类别。你能给我一些吗?

【问题讨论】:

    标签: swift sprite-kit contacts bitmask uint32


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多