1

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

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

问题

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

4

2 回答 2

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;

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

于 2014-04-03T12:57:19.750 回答
2

如果您使用整数 (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,您都可以对它们使用位操作,并且在您的代码中,您通常永远不会再次引用整数值。

于 2016-04-12T08:15:51.610 回答