Установка значений битовой маски для категории физика
Я объявляю различные категории битовой маски в моем коде следующим образом:
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, и в вашем коде вы обычно никогда не обращаетесь к целочисленным значениям снова.