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

最近一直在将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哈哈~,不过弄出来了,很开心呢啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值