您的位置:首页 > 其它

有关windows下键盘连续响应问题

2012-02-10 15:00 169 查看
最近一直在将Nehe opengl程序在MFC下实现,但是到第十课时(“加载3D世界,并在其中漫游”),在MFC下实现的程序跟Nehe源码里面效果差别很大。

首先,Nehe程序旋转移动时感觉很流畅,而自己跟他一样的增量,但是整体运行后感觉不流畅。同时,按住同一个键A时(并不松开),再按另一个键B,响应B键消息,但释放B后,却不在执行A键的消息了,但是此时A键仍然未松开。上网查资料,倒腾半天没搞定,郁闷至极。今天继续倒腾,终于被搞定了。没写过博客,今天就把自己的学习经历记录下来,以后还可回顾回顾。(哎,高考结束后就没写过作文,这描述能力啊...)

开始搞起:

1)刚开始添加了WM_KEYDOWN的消息响应,并加代码如下:

if (VK_PRIOR)
{
m_lookUpDown -= 0.2f;
}
if (VK_NEXT)
{
m_lookUpDown += 0.2f;
}
if (VK_RIGHT)
{
m_lookRL += 1.0f;
}
if (VK_LEFT)
{
m_lookRL -= 1.0f;
}
if (VK_UP)
{
m_xPos += (float)sin(-m_lookRL * piover180) * 0.05f;
m_zPos += (float)cos(-m_lookRL * piover180) * 0.05f;
if (m_walkBiasAngle >= 359.0f)
{
m_walkBiasAngle = 0.0f;
}
else
{
m_walkBiasAngle += 10;
}
m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f;
}
if (VK_DOWN)
{
m_xPos -= (float)sin(-m_lookRL * piover180) * 0.05f;
m_zPos -= (float)cos(-m_lookRL * piover180) * 0.05f;
if (m_walkBiasAngle <= 1.0f)
{
m_walkBiasAngle = 359.0f;
}
else
{
m_walkBiasAngle -= 10;
}
m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f;
}


但是每次按下↑键不放,中间会有一段停顿,然后才是连续的效果,而且整体的效果根本不如Nehe程序的效果。同时要是按下↑键不放,再按→键,此时会响应→键消息,但是放开→键后,↑键(此时仍然是按下状态)却不在响应消息,当然在按下→键后不放也回出现中间停顿一会再产生持续的效果。郁闷,上网收了相关问题,有人说设置定时器,也木有具体怎么设置,就继续瞎捣鼓了。

2)设置定时器,将上面的一对代码全放到添加的WM_TIMER消息函数中了,在获取键盘状态上用了 GetAsyncKeyState函数(::GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,如果需要在键盘消息处理程序以外查询按键状态,则需要使用::GetAsyncKeyState()来代替【百度的】) ,代码如下:

if (GetAsyncKeyState(VK_PRIOR)&0x8000)
{
m_lookUpDown -= 0.2f;
}
if (GetAsyncKeyState(VK_NEXT)&0x8000)
{
m_lookUpDown += 0.2f;
}
if (GetAsyncKeyState(VK_RIGHT)&0x8000)
{
m_lookRL += 1.0f;
}
if (GetAsyncKeyState(VK_LEFT)&0x8000)
{
m_lookRL -= 1.0f;
}
if (GetAsyncKeyState(VK_UP)&0x8000)
{
m_xPos += (float)sin(-m_lookRL * piover180) * 0.05f;
m_zPos += (float)cos(-m_lookRL * piover180) * 0.05f;
if (m_walkBiasAngle >= 359.0f)
{
m_walkBiasAngle = 0.0f;
}
else
{
m_walkBiasAngle += 10;
}
m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f;
}
if (GetAsyncKeyState(VK_DOWN)&0x8000)
{
m_xPos -= (float)sin(-m_lookRL * piover180) * 0.05f;
m_zPos -= (float)cos(-m_lookRL * piover180) * 0.05f;
if (m_walkBiasAngle <= 1.0f)
{
m_walkBiasAngle = 359.0f;
}
else
{
m_walkBiasAngle -= 10;
}
m_walkBias = (float)sin(m_walkBiasAngle * piover180)/20.0f;
}
CView::OnTimer(nIDEvent);


但是未添加InvalidateRect放在OnTimer函数下,哎,导致直接失败!!!

虽然浪费了点时间,但是最后还是产生了如Nehe程序般的流畅感,花了大半天时间啊...

等该正确了,发觉花了半天时间弄好的,其实很简单。O(∩_∩)O哈哈~,不过弄出来了,很开心呢啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: