Ваше перечисление должно быть степенью двойки:
enum
{
TAKES_DAMAGE = 1,
GRABBABLE = 2,
LIQUID = 4,
SOME_OTHER = 8
};
Или более читабельным образом:
enum
{
TAKES_DAMAGE = 1 << 0,
GRABBABLE = 1 << 1,
LIQUID = 1 << 2,
SOME_OTHER = 1 << 3
};
Почему? Потому что вы хотите иметь возможность комбинировать флаги без перекрытия, а также иметь возможность сделать это:
if(myVar & GRABBABLE)
{
// grabbable code
}
... Что работает, если значения перечисления выглядят так:
TAKES_DAMAGE: 00000001
GRABBABLE: 00000010
LIQUID: 00000100
SOME_OTHER: 00001000
Итак, допустим, вы установили myVar
на GRABBABLE | TAKES_DAMAGE
, вот как это работает, когда вам нужно проверить флаг GRABBABLE:
myVar: 00000011
GRABBABLE: 00000010 [AND]
-------------------
00000010 // non-zero => converts to true
Если вы установите myVar
в LIQUID | SOME_OTHER
, операция приведет к:
myVar: 00001100
GRABBABLE: 00000010 [AND]
-------------------
00000000 // zero => converts to false