设置physicsBody类别的位掩码值

时间:2014-04-03 12:45:42

标签: ios sprite-kit bitmask skphysicsbody skphysicsworld

我在我的代码中声明了各种位掩码类别,如下所示:

static const uint32_t playerCategory = 1; 
static const uint32_t enemyCategory = 2; 

使用这些类别,我的游戏运行得非常好。

但是,各种示例项目和教程定义了这样的位掩码值:

static const uint32_t playerCategory = (0x01 << 1); // 0010
static const uint32_t enemyCategory = (0x01 << 2); // 0010

问题

为什么这个方法(按位移位)用于声明这些值?另外,哪种方法最适合声明这些值,以及在联系委托中比较它们?

2 个答案:

答案 0 :(得分:2)

我不会做这些。

我实际上为它创建了一个NS_OPTIONS typedef。有点像...

typedef NS_OPTIONS(uint32_t, MyPhysicsCategory)
{
    MyPhysicsCategoryAnt = 1 << 0,
    MyPhysicsCategoryFood = 1 << 1,
    MyPhysicsCategoryMouse = 1 << 2,
};

这些之间确实没有区别。它们都只是定义了1,2和4,8,16等的整数和值......

区别在于可读性。

通过使用NS_OPTIONS方式,它告诉我(以及使用我的项目的任何人)你可以对它们使用按位操作。

ant.physicsBody.contactTestBitMask = MyPhysicsCategoryMouse | MyPhysicsCategoryFood;

我知道这意味着将与食物和老鼠接触测试蚂蚁。

答案 1 :(得分:1)

如果使用整数(UInt32)定义类别:

static const uint32_t playerCategory = 1; 
static const uint32_t enemyCategory = 2; 

你必须记住序列1,2,4,8,16,32,64等一直到2,147,483,648。

如果使用位移:

static const uint32_t playerCategory = (0x01 << 1); // 0010
static const uint32_t enemyCategory = (0x01 << 2); // 0010

(应该从0班开始),然后你可以增加班次:

static const uint32_t playerCategory = (1 << 0); 
static const uint32_t enemyCategory = (1 << 1);
static const uint32_t enemy2Category = (1 << 2);
static const uint32_t enemy3Category = (1 << 3);
static const uint32_t asteroidCategory = (1 << 4);
static const uint32_t spaceshipCategory = (1 << 5);
static const uint32_t blackHoleCategory = (1 << 6);
static const uint32_t deathStarCategory = (1 << 7);
.
.
.
static const uint32_t lastCategory = (1 << 31);

你可能会发现不那么令人困惑。

但最终结果是相同的 - 你可以对它们使用位操作,无论它们是如何定义的,只要它们是UInt32,并且在你的代码中,你通常再也不会引用整数值。