【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3602|回复: 7

怎么解决WIN32中同时按键问题?

[复制链接]
发表于 2006-8-7 17:11:12 | 显示全部楼层 |阅读模式
<>急!</P>
<>我用WIN32的处理键盘消息的方式。设置VK_LEFT为向左走,VK_SPACE为跳越,我按住左键后,人物一直左走,可这时,按空格后,人物就只是跳跃,没再左走了(这时左键仍然是按下的),可能是系统接受空格消息时,把向左的消息冲掉了,怎么才可以让他们同时被系统所接受呢?</P>
发表于 2006-8-20 23:16:53 | 显示全部楼层
建议楼主再加多一个标志变量,标示按键的状态,比如按下时标示为1,释放为0,好像在消息的高低字节中有区分按下或者释放的。具体多了解点WINAPI的消息机制。[em04]
发表于 2006-8-7 17:33:21 | 显示全部楼层
据我所知不会这样的,你把你的代码贴出来
 楼主| 发表于 2006-8-7 19:31:34 | 显示全部楼层
<>#include&lt;windows.h&gt;<BR>#include&lt;iostream&gt;<BR>#include"d3dx9.h"<BR>#pragma comment( lib,"d3d9.lib" )<BR>class girl<BR>{<BR>public:<BR> int Cx,Py,Vy,Ay,num,dir;<BR> girl()<BR> {<BR>        Cx=0;  //图片X位置<BR>        Py=50; //Y位置<BR>        Vy=0;  //Y速度<BR>        Ay=1;  //Y方向加速度<BR>        num=0; //图片的序列号<BR>        dir=1; //人物方向</P>
<> }<BR> void Goleft()<BR> {</P>
<>  num++;<BR>  if(num&gt;=4) num=0;</P>
<> dir=0;</P>
<> Cx-=4;<BR> }<BR> void Goright()<BR>{<BR>  num++;<BR>  if(num&gt;=4) num=0;<BR> dir=1;</P>
<>   Cx+=4;<BR> }<BR> void Jump()<BR> {<BR>  if(Py==320) //地面<BR>  {<BR>  Vy=-20;<BR>  }<BR> }<BR> void cycle()<BR> {<BR>  Vy+=Ay;<BR>  Py+=Vy;<BR>  if(Py&gt;320) <BR>  {<BR>   Py=320;<BR>   Vy=0;<BR>  }<BR>  }<BR> };<BR>girl g;<BR>HWND hWnd;<BR>LPDIRECT3D9 g_pD3D=NULL;<BR>LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;<BR>LPDIRECT3DVERTEXBUFFER9 g_pVB;<BR>LPDIRECT3DTEXTURE9  g_pgirl  = NULL;<BR>LPDIRECT3DTEXTURE9  g_pground=NULL;<BR>LPD3DXSPRITE g_pSprite=NULL;<BR>ID3DXFont*  mfont = NULL;<BR>int n=100;</P>
<>struct CUSTOMVERTEX<BR>{<BR> float x,y,z,rhw;<BR> DWORD color;<BR>};<BR>#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)<BR>RECT Rectgirl;</P>
<><BR>void d3dClear();<BR>BOOL d3dDeviceCreate(HWND hWnd)<BR>{<BR>    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )<BR>        return E_FAIL;<BR> D3DCAPS9 caps;<BR> g_pD3D-&gt;GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&amp;caps);<BR> int vp=0;<BR> if(caps.DevCaps&amp;D3DDEVCAPS_HWTRANSFORMANDLIGHT)<BR> {<BR>  vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;<BR> }<BR> else<BR> {<BR>  vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;<BR> }<BR> D3DDISPLAYMODE d3ddm;<BR> if(g_pD3D-&gt;GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&amp;d3ddm)!=D3D_OK)<BR> {<BR>        MessageBox(0, "1", 0, 0);<BR>  return false;<BR> }<BR> D3DPRESENT_PARAMETERS d3dpp;<BR> ZeroMemory(&amp;d3dpp, sizeof(d3dpp));</P>
<><BR> d3dpp.Windowed=true;<BR>// d3dpp.MultiSampleQuality  = 0;<BR>// d3dpp.BackBufferCount  = 1;<BR> d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;<BR> d3dpp.BackBufferFormat=d3ddm.Format;<BR>// d3dpp.AutoDepthStencilFormat=D3DFMT_D16;<BR>// d3dpp.EnableAutoDepthStencil=TRUE;<BR>// d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;<BR> if(g_pD3D-&gt;CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,vp,&amp;d3dpp,&amp;g_pd3dDevice)!=D3D_OK)<BR> {<BR>        MessageBox(0, "3", 0, 0);<BR>  return false;<BR> }<BR> g_pd3dDevice-&gt;SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );</P>
<><BR>    g_pd3dDevice-&gt;SetRenderState( D3DRS_LIGHTING, FALSE );</P>
<P> D3DXCreateSprite( g_pd3dDevice, &amp;g_pSprite );<BR>    D3DXCreateTextureFromFileEx(g_pd3dDevice, "1.png", 0, 0,1,  <BR>                                          0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, <BR>                                         D3DX_FILTER_LINEAR,D3DX_FILTER_LINEAR, 0xFF000000,<BR>                                          NULL, NULL, &amp;g_pgirl);<BR>    D3DXCreateTextureFromFileEx(g_pd3dDevice, "ground1.png", 0, 0,1,  <BR>                                          0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, <BR>                                         D3DX_FILTER_LINEAR,D3DX_FILTER_LINEAR, 0xFF000000,<BR>                                          NULL, NULL, &amp;g_pground);</P>
<P> g_pd3dDevice-&gt;SetRenderState( D3DRS_ZENABLE, TRUE );</P>
<P>    g_pd3dDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);</P>
<P>    g_pd3dDevice-&gt;SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);</P>
<P>    g_pd3dDevice-&gt;SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);</P>
<P>    g_pd3dDevice-&gt;SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);<BR> D3DXCreateFont(g_pd3dDevice,20,6,FW_NORMAL,0,TRUE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,VARIABLE_PITCH,"Arial",&amp;mfont);<BR> return true;<BR>}<BR>HRESULT InitVertexBuffer()<BR>{<BR> VOID* pVertices;<BR> CUSTOMVERTEX cvVertices[]=<BR> {{ 50.0f,  50.0f, 0.5f, 1.0f, 0xff000000 }, </P>
<P>    { 400.0f, 50.0f, 0.5f, 1.0f, 0xff000000 },</P>
<P>    { 50.0f, 400.0f, 0.5f, 1.0f, 0xff000000},</P>
<P> { 400.0f, 400.0f, 0.5f,1.0f, 0xff000000},};</P>
<P><BR> if(FAILED(g_pd3dDevice-&gt;CreateVertexBuffer(4*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&amp;g_pVB,NULL)))<BR> {<BR>  MessageBox ( NULL, TEXT ("!!!!!!"), <BR>  TEXT ("CreateVertexBuffer   failed"), MB_ICONERROR) ;<BR>  return E_FAIL;<BR> }</P>
<P> g_pVB-&gt;Lock(0,sizeof(cvVertices),(void**)&amp;pVertices,0);<BR> memcpy(pVertices,cvVertices,sizeof(cvVertices));<BR> g_pVB-&gt;Unlock();<BR> return S_OK;<BR>}</P>
<P>BOOL d3dCreate(HWND hWnd)<BR>{<BR> if(!d3dDeviceCreate(hWnd))<BR>  return false;<BR> d3dClear();<BR> return true;<BR>}</P>
<P>void Render()<BR>{<BR> if(g_pd3dDevice==NULL)<BR> {<BR>  MessageBox(0, "Render() - FAILED", 0, 0);<BR>  return;<BR> }<BR>    d3dClear();<BR> g.cycle();<BR> char str1[20]=" ";<BR> sprintf(str1,"Position:%d      ",g.Cx);<BR> RECT rc;<BR>    SetRect(&amp;rc,0,0,80,20);<BR>    SetRect(&amp;Rectgirl,g.num*32,(g.dir+1)*64,(g.num+1)*32,(g.dir+2)*64);<BR>//    D3DXVECTOR3 Position={0.0f,0.0f,0.0f};<BR> g_pd3dDevice-&gt;BeginScene();<BR> g_pd3dDevice-&gt;SetFVF(D3DFVF_CUSTOMVERTEX);<BR> g_pd3dDevice-&gt;SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));<BR>    </P>
<P> g_pd3dDevice-&gt;DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);<BR> g_pSprite-&gt;Begin(D3DXSPRITE_ALPHABLEND) ;<BR> mfont-&gt;DrawText(NULL,str1, sizeof(str1), &amp;rc, DT_LEFT, D3DCOLOR_XRGB(255,255,0));<BR>    g_pSprite-&gt;Draw(g_pgirl,&amp;Rectgirl,NULL,&amp;D3DXVECTOR3(100, g.Py, 0),0xffffffff);<BR>    for(int i=0;i&lt;5;i++)<BR> {</P>
<P>  g_pSprite-&gt;Draw(g_pground,NULL,NULL,&amp;D3DXVECTOR3(i*256-g.Cx, 380, 0),0xffffffff);<BR> }</P>
<P><BR>    g_pSprite-&gt;End();<BR> g_pd3dDevice-&gt;EndScene();<BR> g_pd3dDevice-&gt;Present(NULL,NULL,NULL,NULL);</P>
<P>}</P>
<P>void d3dClear()<BR>{<BR> g_pd3dDevice-&gt;Clear(0,0,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0, 0, 0),1.0f,0);<BR>}<BR>void d3dRelease()<BR>{<BR> if(mfont) mfont-&gt;Release();<BR>    if(g_pSprite) g_pSprite-&gt;Release();<BR> if(g_pVB) g_pVB-&gt;Release(); <BR> if(g_pd3dDevice) g_pd3dDevice-&gt;Release();<BR> if(g_pD3D) g_pD3D-&gt;Release();<BR>}</P>
<P>BOOL InitInstance(HINSTANCE hInstance,int nCmdShow);<BR>int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow)<BR>{<BR> LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);<BR> MSG msg;</P>
<P> WNDCLASSEX wndclass ;<BR>    wndclass.cbSize = sizeof(WNDCLASSEX); <BR> wndclass.style    = CS_CLASSDC ;<BR> wndclass.lpfnWndProc  = WndProc ;<BR> wndclass.cbClsExtra   = 0 ;<BR> wndclass.cbWndExtra   = 0 ;<BR> wndclass.hInstance   = hInstance ;<BR> wndclass.hIcon    = NULL ;<BR> wndclass.hCursor   = LoadCursor (NULL, IDC_ARROW) ;<BR> wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;<BR> wndclass.lpszMenuName = NULL ;<BR> wndclass.lpszClassName = "mouse" ;<BR>    wndclass.hIconSm  = NULL;<BR> if (!RegisterClassEx (&amp;wndclass))<BR>    {<BR>  MessageBox ( NULL, TEXT ("This program requires Windows NT!"), <BR>   TEXT ("This program requires Windows NT!"), MB_ICONERROR) ;<BR>  return 0 ;<BR>    }<BR> if(!InitInstance(hInstance,iCmdShow))<BR> {<BR>        MessageBox ( NULL, TEXT ("!!!!!!"), <BR>   TEXT ("This program can't init instance!"), MB_ICONERROR) ;<BR>  return FALSE;<BR> }<BR> if(!d3dCreate(hWnd))<BR> {<BR>  MessageBox(0, "InitD3D() - FAILED", 0, 0);<BR>  return false;<BR> }<BR> if(SUCCEEDED(InitVertexBuffer()))<BR> {<BR> <BR>     while(msg.message!=WM_QUIT)<BR>  {<BR>      if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))<BR>   {<BR>       TranslateMessage (&amp;msg) ;<BR>       DispatchMessage (&amp;msg) ;<BR>   }<BR>      else<BR>   {</P>
<P>       Render();<BR>   }<BR>  }<BR> }<BR> return msg.wParam;<BR>}<BR>BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)<BR>{</P>
<P> hWnd=CreateWindow("mouse","D3D9", <BR>                              WS_OVERLAPPEDWINDOW, 50, 50, 650, 500,<BR>                              GetDesktopWindow(), NULL, hInstance, NULL);</P>
<P> if(!hWnd)<BR> {<BR>  return FALSE;<BR> }</P>
<P>  <BR> ShowWindow(hWnd,nCmdShow);<BR> UpdateWindow(hWnd);<BR> return TRUE;<BR>}<BR>LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)<BR>{<BR> switch(msg)<BR> {<BR>    case WM_KEYDOWN:<BR>  switch(wParam)<BR>  {<BR>  case VK_ESCAPE:<BR>   DestroyWindow(hWnd);<BR>   return 0;<BR>   break;<BR>  case VK_SPACE:<BR>   g.Jump();<BR>            break;<BR>  case VK_LEFT:<BR>            g.Goleft();<BR>   break;<BR>  case VK_RIGHT:<BR>   g.Goright();<BR>   break;</P>
<P>  }<BR>  break;<BR>  case WM_DESTROY:<BR>            d3dRelease();<BR>   PostQuitMessage(0);<BR>   return 0;<BR>   break;<BR> <BR> default:<BR>  return DefWindowProc(hWnd,msg,wParam,lParam);<BR> }<BR> return 0;<BR>}</P>



<P>代码我简化了一下发上来的,其实就是一个简单的物理系统,不知道怎么让起跳和方向同时进行</P>
<P>最后谢谢<STRONG><FONT face=Verdana color=#da2549>鼯鼠大哥肯帮我。</FONT></STRONG></P>[em06]
 楼主| 发表于 2006-8-7 19:35:32 | 显示全部楼层
<>怎么上传文件啊,我想把自己用到的两张图片发上来</P>
<>程序所用图片:</P>
<>file:///E:/c++源程序/3231/1.png</P>
<><br>file:///E:/c++源程序/3231/ground1.PNG</P>
发表于 2006-8-8 09:54:20 | 显示全部楼层
<>说句实话,你的代码有点乱.............</P>
<>这样把,我给你一点提示吧</P>
<>你在MsgProc处理函数里面来响应键盘</P>
<>case WM_KEYDOWN:</P>
<>switch(wParam)<BR>   {</P>
<>  case VK_LEFT:<BR>           break;<BR>    case VK_UP:<BR>           break;<BR>    case VK_RIGHT:<BR>           break;<BR>    case VK_DOWN:<BR>           break;</P>
<> }</P>
<>这样我想应该可以处理你的问题了</P>
 楼主| 发表于 2006-8-8 15:03:46 | 显示全部楼层
<>对不起,我没写注释,但是我觉得貌似只要修改回掉函数,也就是我程序的最后部分</P>
<>LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)<BR>{<BR>switch(msg)<BR>{<BR>    case WM_KEYDOWN:<BR>  switch(wParam)<BR>  {<BR>  case VK_ESCAPE:<BR>   DestroyWindow(hWnd);<BR>   return 0;<BR>   break;<BR>  case VK_SPACE:<BR>   g.Jump();<BR>   break;<BR>  case VK_LEFT:<BR>   g.Goleft();<BR>   break;<BR>  case VK_RIGHT:<BR>   g.Goright();<BR>   break;</P>
<>  }<BR>  break;<BR>  case WM_DESTROY:<BR>            d3dRelease();<BR>   PostQuitMessage(0);<BR>   return 0;<BR>   break;<BR><BR>default:<BR>  return DefWindowProc(hWnd,msg,wParam,lParam);<BR>}<BR>return 0;<BR>}</P>
<>你在上面所说,是可以处理一个键按下的情况,我这里已经可以了,但是怎么处理两键同时按下,确实令我很伤脑筋。不过算了,我正考虑DInput呢。</P>
发表于 2006-8-8 17:12:39 | 显示全部楼层
<>这个方法一个两个按键都可以的,我的程序就在用</P>
<>不过你的程序明显有问题  ,按下空格就销毁窗体?  都return 0;还break;</P>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 07:11

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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