用bool*管理的OpenGL/GLUT键盘:在第二次初始化时,所有值似乎都设置为ints。有什么想法吗? 用OpenGL/GLUT和C++编写游戏。

用bool*管理的OpenGL/GLUT键盘:在第二次初始化时,所有值似乎都设置为ints。有什么想法吗? 用OpenGL/GLUT和C++编写游戏。,c++,opengl,glut,C++,Opengl,Glut,我听说在GLUT中管理键盘内容最简单的方法是使用一组布尔 所以基本上,我有: bool* keys = new bool[256]; 然后,如果我想知道密钥的状态,我只需返回keys[key] 我对特殊钥匙也有类似的设置。现在,在我的游戏中,当你死后,它会重置所有需要重置的值,然后再次启动游戏。到目前为止,这包括 keys = new bool[256]; 和特殊密钥数组的类似声明。对我来说毫无意义的是,偶尔,这种假定的数组重置会导致键中的部分或全部值变为两位或三位整数(因此总是求值为真,

我听说在GLUT中管理键盘内容最简单的方法是使用一组布尔

所以基本上,我有:

bool* keys = new bool[256];

然后,如果我想知道密钥的状态,我只需返回keys[key]

我对特殊钥匙也有类似的设置。现在,在我的游戏中,当你死后,它会重置所有需要重置的值,然后再次启动游戏。到目前为止,这包括

keys = new bool[256];
和特殊密钥数组的类似声明。对我来说毫无意义的是,偶尔,这种假定的数组重置会导致键中的部分或全部值变为两位或三位整数(因此总是求值为真,并使玩家角色无法控制地移动,直到按下一个或多个明显向下的键为止)。我怀疑这是因为在游戏结束时,其中一个键被按下了,从而混淆了C++试图使整个数组错误,发现有一件事情被卡住了。
老兄,真让人困惑。据我所知,通过消除所有额外的密钥初始化,问题已经解决。但我不明白。有人知道我是如何将一些布尔值转换成整数的吗?

由于CPU粒度,您只能以字节的形式访问内容,因此布尔值总是解析为某种大小为1字节的无符号字符类型。通过这种方式,您可以获得0-255范围内的值。任何非零值都是真的,而0是假的。我们不能实现BoL作为一个单一的位(除了C++ STL向量等,在那里它们被转换成位字段),除非你决定在特定的条目中做一个数组和索引位。
keys = new bool[256];
分配内存。它不会将内存初始化为任何特定值。为此,您可以将
memset(key,0,sizeof(bool)*256)
设置为零

但是,您不应该分配内存(这是
new
所做的)来重新初始化数组。实际上,您应该使用
memset
或使用“false”值初始化它的任何功能来重新初始化它

最后,您为什么要从
new
开始分配此数组?只需将其设置为全局数组:
bool-keys[256]
。在使用它之前先初始化它(使用
memset
),一切都会很好

我会建议使用
std::vector
,但遗憾的是,这些都不可用。但是可以使用
std::vector
,0表示false。或者是一个256位的
std::位集
。所有这些都在内部包含它们的分配(因此是安全的),并且有方法将它们的内存清除到某个值

用OpenGL/GLUT和C++编写游戏。


顺便说一句,我不建议这样做。GLUT不是为大多数游戏需要的计时设计的工具。GLFW允许您控制主循环,而不是使用回调,因此它是一个更适合游戏的工具。

由于大小较小,数据类型(bool)较小,且数组大小具有确定性;我会在堆栈中分配它(在类级别,或全局级别-只要声明了

并且有一个功能,它将
重置键

void GlutWrapper::ResetKeys()
{ 
   memset(Keys, 0, sizeof(Keys));
}

这很有趣,因为我计算了我要检查的所有值('w'、's'、'a'、'd'),它们总是0或1,除了那些时间。因为新的运算符内存不能保证归零,所以可以从另一个分配中读取堆中的数据。啊哈。我对C++很陌生。可能就是这样。谢谢。:)我希望您事先考虑过删除旧的数组……就是这样,是的。正如我在下面所说的,我是C++的新手,尤其是像这样的内存管理。也许你不知道RAII了?如果您不想进行手动内存管理(您不应该这样做),可以使用。有一个在推动。为了:-我不知何故不知道新的我不知道memset的存在,但我只是想在我发布之前,这样的东西会很方便为什么?因为我太习惯Java了。即使在那里,这也可能是不好的做法我考虑过类似的事情,但决定坚持使用数组,因为这就是示例中使用的。-所以我一直在听。我现在正在调查SDL,我计划下一步调查GLFW。我今天读了很多类似的观点。@程序是:垃圾收集,C++不是java。同样在C++中有一个设计模式叫做RAII:RealDebug是初始化。从技术上讲,这意味着您不需要为大多数类实例分配“new”,而只需要定义它们的一个变量。当然,这意味着大量的复制工作。关键思想是,您可以在实现智能/弱指针语义的访问器类中管理大量数据。而不是在类实例中传递指针(通过复制的值!)。Boost库()提供了精确的智能指针。这个Boost库听起来不错,是的。我认为我不太了解C++使用那个模式。你知道吗,我昨晚只是想把程序的一部分放在一个班里?呵呵。也许我现在会。
class GlutWrapper
{
    bool Keys[256];
...
};
void GlutWrapper::ResetKeys()
{ 
   memset(Keys, 0, sizeof(Keys));
}