【发布时间】:2014-08-06 17:38:06
【问题描述】:
目前我在一个小游戏实验中使用枚举来表示一个状态。我这样声明它们:
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 - 知道为什么吗?
【问题讨论】:
-
有这个,但我不确定这是否是“规范”的做事方式...stackoverflow.com/a/439004/541686
-
对我来说太重了。我想要 lightest 方法,如有必要,仅使用纯 C++ 或标准库。没有升压。我的目标是尽量减少内存和 CPU 的使用,因为我正在制作游戏,而一毫秒的延迟将意味着 fps 数量巨大下降。
-
我可以理解“没有 Boost”,但我无法理解 run 时对内存或 CPU 使用率的担忧,因为这些都是编译时常量,而不是运行时值...
-
我相信唯一需要的处理是如果你想获取与枚举关联的字符串,无论如何你不应该在游戏引擎中经常这样做。否则枚举在类内是公开的,它就像任何其他枚举一样......
-
@Mehrdad:它看起来像一个带有顺序值的直接枚举。可以用来指定位标志枚举吗?
标签: c++ enums bit-manipulation bitflags std-bitset