Установка значений битовой маски для категории физика

Я объявляю различные категории битовой маски в моем коде следующим образом:

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 ответа

Решение

Я бы не стал делать ничего из этого.

Я бы на самом деле создал для него typedef типа NS_OPTIONS. Что-то вроде...

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;

Я знаю, что это означает, что с муравьем свяжутся с тестами на еду и мышей.

Если вы определяете свои категории, используя целые числа (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, и в вашем коде вы обычно никогда не обращаетесь к целочисленным значениям снова.

Другие вопросы по тегам