|
楼主 |
发表于 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] |
|