游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3865|回复: 12

求救:dinput键盘输入过快的问题

[复制链接]

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2007-4-5 21:56:00 | 显示全部楼层 |阅读模式
本人纯新手,某教程里dinput的判断按键代码是这样的:
BOOL IsKeyPressed(int key)
{
        HRESULT hr;
        hr=pIDirectKeyboardDevice->GetDeviceState(sizeof(keyBuffer),(LPVOID)keyBuffer);
        if(hr==DIERR_INPUTLOST)
        {
                pIDirectKeyboardDevice->Acquire();  //重新获取键盘使用权
        hr=pIDirectKeyboardDevice->GetDeviceState(sizeof(keyBuffer),(LPVOID)keyBuffer);  
                if(FAILED(hr)) return FALSE;
        }
        //判断用户按键是否为key键
        if(keyBuffer[key]&0x80)
        {
                return TRUE;
        }
        return FALSE;
}
我在一个主循环中判断是否按下A键,按下了就交换两个图片的位置,可是我按了一下A键(时间很短)结果两个图片交换了3、4下。我想是不是这个函数只判断按下,那弹起又如何判断呢?还望各位前辈不吝赐教!

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2007-4-5 22:11:00 | 显示全部楼层

Re:求救:dinput键盘输入过快的问题

byte cfq=0;
if(cfq==0)//如果未按下
{
  if(keyBuffer[key]&0x80)
  {
    cfq=1;//表示按下
    return TRUE;
  }
}
else//如果按下
{
  if(keyBuffer[key]&0x80)
  {break;}//按下,返回。
  else
  {
    cfq=0;//未按下。
    return TRUE;
  }
}

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2007-4-5 22:27:00 | 显示全部楼层

Re: 求救:dinput键盘输入过快的问题

回hwbnet:
         if(keyBuffer[key]&0x80)
        {break;}//按下,返回。
这一句编译时会报错:illegal break.
我试着改成
         if(keyBuffer[key]&0x80)
        return FALSE;//按下,返回。
结果还是输入太快,按一下就相当于按了好多下````
大哥帮忙再看下~

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2007-4-5 22:48:00 | 显示全部楼层

Re:求救:dinput键盘输入过快的问题

DWORD t,tt;
t=GetTickCount();//取时间1000=1秒
if(t-tt>500)
{
  tt=t;
  if(keyBuffer[key]&0x80)
  {
    return TRUE;
  }
}

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-4-6 09:09:00 | 显示全部楼层

Re:求救:dinput键盘输入过快的问题

键盘按下是状态不是事件

你的设计思路不对

应该跟踪键盘状态状态从弹起到按下的变化

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-4-6 09:32:00 | 显示全部楼层

Re:求救:dinput键盘输入过快的问题

楼上正解~
保存一个上一帧案件状态和一个本帧按键状态。每次刷新本帧按键状态前,将本帧状态通盘赋值给上帧。
如果上帧按下,本帧没按下————弹起了
如果上帧没按下,本帧按下————按下

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2007-4-6 10:46:00 | 显示全部楼层

Re: 求救:dinput键盘输入过快的问题

回楼上及楼上的楼上:
    我大概知道你们的意思了,我原来那个函数是 如果按住A键不动相当于不停的在按A键,我和你们一样是想判断A键按下不动就相当于只按了一次。但我学习尚浅,不知道具体如何实现,麻烦哪位大哥给个伪码说下思路,谢谢。

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-4-6 12:58:00 | 显示全部楼层

Re:求救:dinput键盘输入过快的问题

使用缓冲模式,只操作keyUP事件。

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2007-4-6 19:41:00 | 显示全部楼层

Re: 求救:dinput键盘输入过快的问题

我把代码改成这样:
bool a=0;
……

BOOL IsKeyPressed(int key,bool *a)
{
……
           if(keyBuffer[key]&0x80)
        {
                if(*a==0)
                {
                        *a=1;
                    
            return TRUE;
                }
        }
        else
        {
                if(*a==1) *a=0;
               
        }
        return FALSE;
}
但结果照旧,谁能告诉我这段代码出什么问题了?

28

主题

433

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2007-4-6 21:53:00 | 显示全部楼层

Re:求救:dinput键盘输入过快的问题

static DWORD nControlPressTimer=0;
       
       
        if(GetTickCount() > nControlPressTimer + 500)
        {
               
                if (GetKeyState(VK_RETURN)<0)
                {
                        nControlPressTimer =GetTickCount();
                       
                        if (m_GameState == LOGO_GAME)
                        {
                                m_GameState = MESS_GAME;
                                return false;
                        }

                        if (m_GameState == MESS_GAME)
                        {
                                m_GameState = ACT_GAME;
                                zXM_play(data);
                                return false;
                        }

                       
                        if (m_GameState == DEATH_GAME)
                        {
                                Start();
                                return false;
                        }

                       
                        if (m_GameState == ACT_GAME)
                        {
               
                                m_GameState = PAUSE_GAME;
                                return false;
                        }
                       
                       
                }
               
               
        }
       
        //////////////////////////////////////////////////////////////////////////
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-4-12 19:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表