| 
 | 
 
 
 楼主 |
发表于 2006-8-7 19:31:34
|
显示全部楼层
 
 
 
< >#include<windows.h><BR>#include<iostream><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>=4) num=0;</P> 
< > dir=0;</P> 
< > Cx-=4;<BR> }<BR> void Goright()<BR>{<BR>  num++;<BR>  if(num>=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>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->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);<BR> int vp=0;<BR> if(caps.DevCaps&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->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)!=D3D_OK)<BR> {<BR>        MessageBox(0, "1", 0, 0);<BR>  return false;<BR> }<BR> D3DPRESENT_PARAMETERS d3dpp;<BR> ZeroMemory(&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->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,vp,&d3dpp,&g_pd3dDevice)!=D3D_OK)<BR> {<BR>        MessageBox(0, "3", 0, 0);<BR>  return false;<BR> }<BR> g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );</P> 
< ><BR>    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );</P> 
<P> D3DXCreateSprite( g_pd3dDevice, &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, &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, &g_pground);</P> 
<P> g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );</P> 
<P>    g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);</P> 
<P>    g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);</P> 
<P>    g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);</P> 
<P>    g_pd3dDevice->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",&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->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL)))<BR> {<BR>  MessageBox ( NULL, TEXT ("!!!!!!"), <BR>  TEXT ("CreateVertexBuffer   failed"), MB_ICONERROR) ;<BR>  return E_FAIL;<BR> }</P> 
<P> g_pVB->Lock(0,sizeof(cvVertices),(void**)&pVertices,0);<BR> memcpy(pVertices,cvVertices,sizeof(cvVertices));<BR> g_pVB->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(&rc,0,0,80,20);<BR>    SetRect(&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->BeginScene();<BR> g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);<BR> g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));<BR>    </P> 
<P> g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);<BR> g_pSprite->Begin(D3DXSPRITE_ALPHABLEND) ;<BR> mfont->DrawText(NULL,str1, sizeof(str1), &rc, DT_LEFT, D3DCOLOR_XRGB(255,255,0));<BR>    g_pSprite->Draw(g_pgirl,&Rectgirl,NULL,&D3DXVECTOR3(100, g.Py, 0),0xffffffff);<BR>    for(int i=0;i<5;i++)<BR> {</P> 
<P>  g_pSprite->Draw(g_pground,NULL,NULL,&D3DXVECTOR3(i*256-g.Cx, 380, 0),0xffffffff);<BR> }</P> 
<P><BR>    g_pSprite->End();<BR> g_pd3dDevice->EndScene();<BR> g_pd3dDevice->Present(NULL,NULL,NULL,NULL);</P> 
<P>}</P> 
<P>void d3dClear()<BR>{<BR> g_pd3dDevice->Clear(0,0,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0, 0, 0),1.0f,0);<BR>}<BR>void d3dRelease()<BR>{<BR> if(mfont) mfont->Release();<BR>    if(g_pSprite) g_pSprite->Release();<BR> if(g_pVB) g_pVB->Release(); <BR> if(g_pd3dDevice) g_pd3dDevice->Release();<BR> if(g_pD3D) g_pD3D->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 (&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(&msg,NULL,0,0,PM_REMOVE))<BR>   {<BR>       TranslateMessage (&msg) ;<BR>       DispatchMessage (&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] |   
 
 
 
 |