代码之家  ›  专栏  ›  技术社区  ›  thecoshman

我的编程逻辑在这里正确吗?

  •  0
  • thecoshman  · 技术社区  · 14 年前
    const char IsPressed = 1; // 1
    const char WasHeldDown = 2; // 10
    const char IsFirstPress = 4; // 100
    
    char* keystates[256];
    
    Class::CalculateKeyStates()
    {
        for(int i = 0; i < 256; ++i)
        {
            if(this->IsDown(i))
            {
                keystates[i] |= IsPressed; // turn on
                if(keystates[i] & WasHeldDown)
                {
                    //keystates[i] |= IsFirstPress;
                    keystates[i] &= ~IsFirstPress; // turn off
                }
                else
                {
                    keystates[i] |= WasHeldDown + IsFirstPress; // Turn on
                }
            }
            else
            {
                keystates[i] = 0; // Turn ALL off
            }
        }
    }
    

    此函数将是类、类的成员函数。另一个成员函数is down将在相关键关闭时返回true,否则返回false。

    你能看到进一步改善这个功能的方法吗?

    谢谢

    编辑:

    我会详细解释一下为什么要这样做。这是对一段代码的修改,该代码通过一个数组keystates(由三个bools组成的结构)工作,对所有键的设置都显示为false。然后再次将ispressed设置为this的值->isdown,然后第三次循环检查是否已持有密钥,如果已持有,则不再是第一次按,因此将其设置为false。如果未按下,则将第一次按下设置为“真”,并保持为“真”,因此下次将标记为“已按下”。

    编辑2:

    在代码中添加了一些注释并更正了一行

    3 回复  |  直到 14 年前
        1
  •  1
  •   Oliver Charlesworth    14 年前

    就我个人而言,我将把关键状态定义为不相交的状态,并编写一个简单的状态机,因此:

    enum keystate
    {
        inactive,
        firstPress,
        active
    };
    
    keystate keystates[256];
    
    Class::CalculateKeyStates()
    {
        for (int i = 0; i < 256; ++i)
        {
            keystate &k = keystates[i];
    
            switch (k)
            {
            inactive:
                k = (isDown(i)) ? firstPress : inactive;
                break;
            firstPress:
                k = (isDown(i)) ? active : inactive;
                break;
            active:
                k = (isDown(i)) ? active : inactive;
                break;
            }
        }
    }
    

    这更容易扩展,如果变得更复杂,也更容易阅读。

        2
  •  0
  •   Heinzi    14 年前

    你总是在设置 IsFirstPress 如果钥匙掉了,这可能不是你想要的。

        3
  •  0
  •   Frank    14 年前

    我不知道你想用什么 IsFirstPress ,因为keystate无法记住任何以前的按下。如果你想用这个位来标记,这是你第一次识别出钥匙掉了,那么你的逻辑在相应的 if 语句。

    keystates[i] & WasHeldDown 如果已设置位,则计算为真 WasHeldDown 在此密钥状态之前。 在这种情况下,您可能需要实际删除 第一压力机 点到为止: keystates[i] ^= IsFirstPress