我在我的代码中声明了各种位掩码类别,如下所示:
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
问题
为什么这个方法(按位移位)用于声明这些值?另外,哪种方法最适合声明这些值,以及在联系委托中比较它们?
答案 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,并且在你的代码中,你通常再也不会引用整数值。