現在、小さなゲーム実験で状態を表すために列挙型を使用しています。私はそれらを次のように宣言します:
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 スタイルのキャストを使用する必要がありましたが、|=
a では機能しませんでしたstatic_cast
。