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

时间:2011-07-02 02:33:58

标签: c++ opengl glut

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

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

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

bool* keys = new bool[256];

...

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

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

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

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

keys = new bool[256];

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

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

3 个答案:

答案 0 :(得分:6)

本声明

keys = new bool[256];

分配内存。 将该内存初始化为任何特定值。为此,您可以将memset(keys, 0, sizeof(bool) * 256)设为零。

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

最后,为什么要开始使用new分配此数组?只需将其设为全局数组:bool keys[256]。 memset),一切都会好的。

我会建议std::vector<bool>,但遗憾的是,那些不可用。你可以使用std::vector<char>,0表示错误。或者是{256}的std::bitset。所有这些都在内部包含它们的分配(因此是安全的),并且有办法将它们的记忆清除到某种价值。

  

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

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

答案 1 :(得分:3)

由于CPU的粒度,你只能作为一个字节访问东西,因此bool总是解析为某种大小为1字节的unsigned char类型。这样,您可以从0到255范围内获得值。会发生的是,任何非零值都为真,0为假。除非您决定在特定条目中创建数组和索引位,否则我们无法将bool实现为单个位(C ++ STL向量等除外...它们被转换为位域),除非您决定在特定条目中创建数组和索引位。

答案 2 :(得分:0)

由于大小很小,数据类型(bool)很小,数组大小是确定的;我会在堆栈中分配它(在类级别或全局级别 - 在声明keys的地方)。

class GlutWrapper
{
    bool Keys[256];
...
};

有一个函数,那就是ResetKeys

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