我有一部分代码包含以下功能:

void Keyboard(int key)
{
    switch (key) {
    case GLFW_KEY_A: m_controlState |= TDC_LEFT; break;
    case GLFW_KEY_D: m_controlState |= TDC_RIGHT; break;
    case GLFW_KEY_W: m_controlState |= TDC_UP; break;
    case GLFW_KEY_S: m_controlState |= TDC_DOWN; break;
    default: Test::Keyboard(key);
    }
}

void KeyboardUp( int key)
{
    switch (key) {
    case GLFW_KEY_A: m_controlState &= ~TDC_LEFT; break;
    case GLFW_KEY_D: m_controlState &= ~TDC_RIGHT; break;
    case GLFW_KEY_W: m_controlState &= ~TDC_UP; break;
    case GLFW_KEY_S: m_controlState &= ~TDC_DOWN; break;
    default: Test::Keyboard(key);
    }
}

我知道开关盒是什么,但我不明白这些零件的作用。
m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT

m_controlState是一个int。 GFLW_KEY也引用一个int值。

有人可以解释一下这些部分用输入值做一个例子,结果会很好。

最佳答案

另外,我认为应该解释这些运算符的作用和用法。

m_controlState用作标志,这意味着它以二进制形式包含按下了哪些键。
例如,如果tds常量的值是这样选择的:

TDS_LEFT             = 0x00001
TDS_RIGH = 0x01 << 2 = 0x00010
TDS_UP   = 0x01 << 3 = 0x00100
TDS_DOWN = 0x01 << 4 = 0x01000

然后,您可以在单个整数中存储设置了哪些选项的信息。为此,您只需要检查每个设置对应的位是1还是0。

因此,要设置TDS_LEFT选项,您必须将当前状态与0x00001(即TDS_LEFT)进行或运算,因此在代码中
m_controlState = m_controlState | TDS_LEFT

这与
m_controlState |= TDS_LEFT.

要取消设置TDS_LEFT选项,您必须使用〜TDS_LEFT将其与。所以
m_controlState = m_controlState & ~TDS_LEFT

与以下内容相同:
m_controlState &= ~TDS_LEFT

您还可以检查:How to use enums as flags in C++?
希望事情变得更清楚。

10-08 03:54