使用bool*管理的OpenGL/GLUT键盘:所有值在第二次初始化时似乎设置为整数.有任何想法吗?

PRO*_*_IX 2 c++ opengl glut

使用OpenGL/GLUT和C++制作游戏.

我听说在GLUT中管理键盘内容的最简单方法是使用bool数组.

基本上,这就是我所拥有的:

bool* keys = new bool[256];
Run Code Online (Sandbox Code Playgroud)

...

void keyDown(unsigned char ch, int x, int y)
{
    keys[ch] = true;    
}

void keyUp(unsigned char ch, int x, int y)
{
    keys[ch] = false;
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我想知道一个键的状态,我只需返回键[key].

我有一个类似的特殊键设置.现在,在我死后的游戏中,它会重置所有需要重置的值并再次启动游戏.直到现在,包括

keys = new bool[256];
Run Code Online (Sandbox Code Playgroud)

以及特殊键数组的类似声明.对我来说没有任何意义的是偶尔,这种假设的数组重置会导致键中的部分或全部值变为两位或三位整数(因此总是评估为真,并使得玩家角色不受控制地移动,直到一个或显然失望的更多钥匙被压抑了.我怀疑这发生了,因为在结束游戏时,其中一个键被按下,从而混淆了C++,当它试图使整个数组失真并发现有一件事被证实是真的.

伙计,那令人困惑.据我所知,通过消除密钥的所有额外初始化,问题已得到解决.但我不明白.任何人都对我如何设法将一些bool变成整数有任何想法?

Nic*_*las 6

这个说法

keys = new bool[256];
Run Code Online (Sandbox Code Playgroud)

分配记忆.它并没有内存初始化任何特定的值.要做到这一点,你可以做到memset(keys, 0, sizeof(bool) * 256)零.

但是,您不应该分配内存(这是什么new)重新初始化数组.你应该真正重新初始化它,使用memset或任何功能,您使用"假"值进行初始化.

最后,为什么要分配这个数组new?把它变成一个全局数组:bool keys[256].memset在使用之前初始化它(with ),一切都会好的.

我会建议一个std::vector<bool>,但遗憾的是,那些不可用.你可以使用a std::vector<char>,0表示false.或者std::bitset256位.所有这些都在内部包含它们的分配(因此是安全的),并且有办法将它们的记忆清除到一定的价值.

使用OpenGL/GLUT和C++制作游戏.

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