gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:34:44 24 4
gpt4 key购买 nike

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
}
}
}

此函数将是类 Class 的成员函数。另一个成员函数 IsDown 将在有问题的键按下时返回 true,否则返回 false。

您能看到进一步改进此功能的方法吗?

谢谢

编辑:

我将详细说明为什么要这样做。这是对一些代码的修改,该代码通过数组 keyStates(它是三个 bool 的结构)将所有键的 IsPressed 设置为 false。然后再次将 Ispressed 设置为 this->IsDown 的值,然后第三次循环检查该键是否已被按住,如果已按住则不再是第一次按下,因此将其设置为 false。如果它没有被按住,则将 first press 设置为 true 并且 was held 也为 true,因此下次它被标记为已被按住。

编辑2:

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

最佳答案

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

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;
}
}
}

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

关于algorithm - 我的编程逻辑在这里正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com