游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1774|回复: 1

directinput缓冲模式的疑问,我写的这个代码为什么没有反

[复制链接]

15

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2011-3-26 10:13:00 | 显示全部楼层 |阅读模式
举例说明吧
比如键盘我弄成缓冲模式 buffersize = 4

我操作的顺序是 1.按住A 2.按住B 3.按住C 4.松开A
那么缓冲数据DIDEVICEOBJECTDATA didod[4]应该是
didod[0]
{dwOfs=>A,dwData=>松开,dwTimStamp=>操作的时间,dwSequence =>序列编号 }
didod[1]
{dwOfs=>C,dwData=>按下,dwTimStamp=>操作的时间,dwSequence =>序列编号 }
didod[2]
{dwOfs=>B,dwData=>按下,dwTimStamp=>操作的时间,dwSequence =>序列编号 }
didod[3]
{dwOfs=>A,dwData=>按下,dwTimStamp=>操作的时间,dwSequence =>序列编号 }

是这样的么??

那么我在之前的基础上松开 C 是不是就变成

didod[0]
{dwOfs=>C,dwData=>松开,dwTimStamp=>操作的时间,dwSequence =>序列编号 }
didod[1]
{dwOfs=>A,dwData=>松开,dwTimStamp=>操作的时间,dwSequence =>序列编号 }
didod[2]
{dwOfs=>C,dwData=>按下,dwTimStamp=>操作的时间,dwSequence =>序列编号 }
didod[3]
{dwOfs=>B,dwData=>按下,dwTimStamp=>操作的时间,dwSequence =>序列编号 }

这样的了?

另外就是 dwSequence 有什么用呢?dinput还能把缓冲数据排混了不成?

15

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
 楼主| 发表于 2011-3-27 23:37:00 | 显示全部楼层

Re:directinput缓冲模式的疑问,我写的这个代码为什么没有

上代码

我将DIDEVICEOBJECTDATA  的结构体变量置零,然后做判断,希望messagebox能把DIDEVICEOBJECTDATA每个成员的值都显示出来,为什么这个程序没有反应呢??

  1. #include <windows.h>
  2. #include <dinput.h>
  3. #include <iostream>
  4. #include <string.h>
  5. #include <stdio.h>
  6. using namespace std;

  7. #define DINPUT_BUFFERSIZE 4

  8. HWND hwnd;

  9. LPDIRECTINPUT           lpDirectInput;  // DirectInput object
  10. LPDIRECTINPUTDEVICE     lpKeyboard;     // DirectInput device

  11. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

  12. void ReleaseDInput()
  13. {
  14.         if (lpKeyboard!=NULL)
  15.         {
  16.                 lpKeyboard->Unacquire();
  17.                 lpKeyboard->Release();
  18.                 lpKeyboard = NULL;
  19.         }
  20.         if (lpDirectInput!=NULL)
  21.         {
  22.                 lpDirectInput->Release();
  23.                 lpDirectInput = NULL;
  24.         }
  25. }

  26. BOOL InitDInput(HWND hWnd,HINSTANCE hInstance)
  27. {
  28.     HRESULT hr;

  29.     // 创建一个 DIRECTINPUT 对象
  30.     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&lpDirectInput, NULL);

  31.     if FAILED(hr)
  32.     {
  33.         // 失败
  34.         return FALSE;
  35.     }

  36.     // 创建一个 DIRECTINPUTDEVICE 界面
  37.     hr = lpDirectInput->CreateDevice(GUID_SysKeyboard, &lpKeyboard, NULL);
  38.     if FAILED(hr)
  39.     {
  40.         // 失败
  41.         return FALSE;
  42.     }

  43.     // 设定为通过一个 256 字节的数组返回查询状态值
  44.     hr = lpKeyboard->SetDataFormat(&c_dfDIKeyboard);
  45.     if FAILED(hr)
  46.     {
  47.         // 失败
  48.         return FALSE;
  49.     }

  50.     // 设定协作模式
  51.     hr = lpKeyboard->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
  52.     if FAILED(hr)
  53.     {
  54.         // 失败
  55.         return FALSE;
  56.     }

  57.     // 设定缓冲区大小
  58.     // 如果不设定,缓冲区大小默认值为 0,程序就只能按立即模式工作
  59.     // 如果要用缓冲模式工作,必须使缓冲区大小超过 0
  60.     DIPROPDWORD     prop;

  61.     prop.diph.dwSize = sizeof(DIPROPDWORD);
  62.     prop.diph.dwHeaderSize = sizeof(DIPROPHEADER);
  63.     prop.diph.dwObj = 0;
  64.     prop.diph.dwHow = DIPH_DEVICE;
  65.     prop.dwData = DINPUT_BUFFERSIZE;

  66.     hr = lpKeyboard->SetProperty(DIPROP_BUFFERSIZE, &prop.diph);

  67.     if FAILED(hr)
  68.     {
  69.         // 失败
  70.         return FALSE;
  71.     }


  72.     hr = lpKeyboard->Acquire();
  73.     if FAILED(hr)
  74.     {
  75.         // 失败
  76.         return FALSE;
  77.     }

  78.     return TRUE;
  79. }

  80. HRESULT UpdateInputState(void)
  81. {
  82.     if(lpKeyboard != NULL)
  83.     {
  84.         DIDEVICEOBJECTDATA  didod[DINPUT_BUFFERSIZE];  // Receives buffered data
  85.         DWORD               dwElements;
  86.         HRESULT             hr;
  87.                 ZeroMemory(didod, sizeof(DIDEVICEOBJECTDATA)*DINPUT_BUFFERSIZE);

  88.         hr = DIERR_INPUTLOST;

  89.         while(hr != DI_OK)
  90.         {
  91.             dwElements = DINPUT_BUFFERSIZE;
  92.             hr = lpKeyboard->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), didod, &dwElements, 0);
  93.             if (hr != DI_OK)
  94.             {
  95.                 hr = lpKeyboard->Acquire();
  96.                 if(FAILED(hr))
  97.                 return hr;
  98.             }
  99.         }

  100.         if(FAILED(hr))
  101.             return hr;
  102.                 for(int i=0; i<DINPUT_BUFFERSIZE; i++)
  103.                 {
  104.                         if (didod[i].dwOfs == 0)
  105.                                 return S_OK;
  106.                         // 此处放入处理代码
  107.                         // didod[i].dwOfs 表示那个键被按下或松开
  108.                         // didod[i].dwData 记录此键的状态,低字节最高位是 1 表示按下,0 表示松开
  109.                         // 一般用 didod[i].dwData&0x80 来测试}
  110.                 }
  111.                 DWORD tmp[20];
  112.                 VOID* pDest,*pSrc;
  113.                 pDest = &tmp;
  114.                 pSrc = &didod;
  115.                 memcpy( pDest, pSrc, 80 );
  116.                
  117.                 string strResult("test:\n");
  118.                 for (int i=0;i<20;i++)
  119.                 {
  120.                         strResult+=tmp[i];
  121.                         strResult+="\n";
  122.                 }
  123.                 MessageBox( NULL, strResult.c_str(),"提示!", MB_OK) ;
  124.         }
  125.     return S_OK;
  126. }

  127. int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)  
  128. {  
  129.     HWND hwnd;  
  130.     MSG  msg;  
  131.     WNDCLASS WindowClass;
  132.     if(!hPrevInstance){  
  133.         //not first run, to set the windows class  
  134.         WindowClass.style=NULL;  
  135.         WindowClass.cbClsExtra=0;  
  136.         WindowClass.cbWndExtra=0;
  137.                 WindowClass.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH));
  138.         WindowClass.hCursor=LoadCursor(hInstance,IDC_ARROW);  
  139.         WindowClass.hIcon=LoadIcon(hInstance,IDI_APPLICATION);  
  140.         WindowClass.hInstance=hInstance;  
  141.         WindowClass.lpfnWndProc=WndProc;  
  142.         WindowClass.lpszClassName="DInput_Test";  
  143.         WindowClass.lpszMenuName=NULL;  
  144.         RegisterClass(&WindowClass);  
  145.     }  
  146.     // start to create the window when registed the window class  
  147.     hwnd=CreateWindow("DInput_Test","DirectInput_Test",WS_OVERLAPPEDWINDOW,  
  148.         CW_USEDEFAULT,  
  149.         CW_USEDEFAULT,  
  150.         CW_USEDEFAULT,  
  151.         CW_USEDEFAULT,NULL,NULL,hInstance,NULL);  
  152.     ShowWindow(hwnd,nShowCmd);  
  153.     UpdateWindow(hwnd);  

  154.         if FAILED(InitDInput(hwnd,hInstance))
  155.         {
  156.                 MessageBox( NULL, "创建DInput设备出错!","Error!", MB_OK) ;
  157.                 ReleaseDInput();
  158.                 PostQuitMessage( 0 );
  159.                 return 0;
  160.         }

  161.         GetMessage(&msg,NULL,NULL,NULL);
  162.     //process the message quenue
  163.         while(msg.message != WM_QUIT)
  164.         {
  165.                 UpdateInputState();
  166.                 if( GetMessage(&msg,NULL,0,0) )
  167.                 {
  168.                         //解析消息
  169.                         TranslateMessage(&msg);
  170.                         //分派消息
  171.                         DispatchMessage(&msg);
  172.                 }
  173.         }

  174.         ReleaseDInput();
  175.         UnregisterClass( "DInput_Test", hInstance);

  176.     return msg.wParam;
  177. }  
  178. //window message process function   
  179.     LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)  
  180.     {  
  181.         switch(msg)
  182.                 {
  183.                         //关闭窗口消息的处理
  184.                 case WM_CLOSE:
  185.                         DestroyWindow( hwnd );
  186.                         break;
  187.                         //销毁窗口消息的处理
  188.                 case WM_DESTROY:
  189.                         //退出当前进程
  190.                         PostQuitMessage( 0 );
  191.                         break;
  192.         default:  
  193.             return DefWindowProc(hwnd,msg,wparam,lparam);  
  194.         }  
  195.         return NULL;  
  196.     }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-14 08:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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