В настоящее время я использую перечисления для представления состояния в маленьком игровом эксперименте. Я объявляю их так:
namespace State {
enum Value {
MoveUp = 1 << 0, // 00001 == 1
MoveDown = 1 << 1, // 00010 == 2
MoveLeft = 1 << 2, // 00100 == 4
MoveRight = 1 << 3, // 01000 == 8
Still = 1 << 4, // 10000 == 16
Jump = 1 << 5
};
}
Чтобы я мог использовать их таким образом:
State::Value state = State::Value(0);
state = State::Value(state | State::MoveUp);
if (mState & State::MoveUp)
movement.y -= mPlayerSpeed;
Но мне интересно, правильно ли это реализовать битовые флаги. Разве нет специального контейнера для бит-флагов? Я слышал о std::bitset
, это то, что я должен использовать? Знаете ли вы что-то более эффективное?
Правильно ли я делаю это?
Я забыл указать, что я перегружал основных операторов моего перечисления:
inline State::Value operator|(State::Value a, State::Value b)
{ return static_cast<State::Value>(static_cast<int>(a) | static_cast<int>(b)); }
inline State::Value operator&(State::Value a, State::Value b)
{ return static_cast<State::Value>(static_cast<int>(a) & static_cast<int>(b)); }
inline State::Value& operator|=(State::Value& a, State::Value b)
{ return (State::Value&)((int&)a |= (int)b); }
Мне пришлось использовать C-стиль для |=
, он не работал с static_cast
- любая идея, почему?