|
发表于 2009-1-10 22:49:49
|
显示全部楼层
[BR]#include <d3d9.h>#include <d3dx9.h>
[BR]#pragma comment (lib,"d3d9.lib")#pragma comment (lib,"d3dx9.lib")#pragma comment (lib,"winmm.lib")
[BR]ID3DXSprite* g_pTextSprite = NULL; //ID3DXSprite文本精灵对象LPDIRECT3D9 g_pD3D = NULL;LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;LPDIRECT3DTEXTURE9 g_pTex[25]; //纹理数组LPDIRECT3DTEXTURE9 g_pQsTex;int giCurTexIndex; //当前纹理的索引D3DXVECTOR3 gvecPos; RECT gQsRect[4];int gRectIndex;
[BR]HRESULT InitD3D(HWND hwnd);HRESULT InitFrame();void Render();void Update( double fTime);void Cleanup();
[BR]LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch(uMsg) { case WM_KEYDOWN: if(VK_ESCAPE == wParam) DestroyWindow(hwnd); break; case WM_DESTROY:   ostQuitMessage(0); break; } return DefWindowProc(hwnd,uMsg,wParam,lParam);};
[BR]int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd ){ WNDCLASS wc = { CS_CLASSDC,WinProc,0,0,hInstance, LoadIcon(hInstance,IDI_ERROR),LoadCursor(hInstance,IDC_CROSS), (HBRUSH)GetStockObject(BLACK_BRUSH),NULL,L"myClass"};
[BR] RegisterClass(&wc);
[BR] HWND hWnd = CreateWindow(L"myClass",L"纹理",WS_ACTIVECAPTION,0,0,800,600, NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nShowCmd); UpdateWindow(hWnd);
[BR] InitD3D(hWnd); InitFrame();
[BR] MSG msg; double timedelay;  eekMessage(&msg,0,0U,0U,PM_REMOVE);
[BR] while(msg.message != WM_QUIT) { if (PeekMessage(&msg,0,0U,0U,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Sleep(50); Render(); timedelay = (double)timeGetTime(); Update(timedelay); } } UnregisterClassW(L"myClass",hInstance); return 0;}
[BR]HRESULT InitD3D(HWND hwnd){
[BR] if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) ) return E_FAIL;
[BR] D3DDISPLAYMODE d3ddm; g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);
[BR] D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp) ); d3dpp.Windowed = true; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format;
[BR] if( FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)) ) { MessageBox(0,L"error",L"sdf",0); return E_FAIL; } //g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,true);
[BR] return S_OK;}
[BR]void Render(){ g_pD3DDevice->Clear(0,0,D3DCLEAR_TARGET,0xff000000,1.0f,0);
[BR] g_pD3DDevice->BeginScene();
[BR] g_pTextSprite->Begin(D3DXSPRITE_ALPHABLEND); g_pTextSprite->Draw(g_pTex[giCurTexIndex],NULL,NULL,&gvecPos,0xffffffff); g_pTextSprite->Draw(g_pQsTex,&gQsRect[gRectIndex],NULL,&D3DXVECTOR3(255,100,0),0xffffffff); g_pTextSprite->End();
[BR] g_pD3DDevice->EndScene();
[BR] g_pD3DDevice-> resent(NULL,NULL,NULL,NULL);}
[BR]void Cleanup(){ if(g_pTextSprite != NULL) g_pTextSprite->Release();
[BR] if (g_pQsTex) { g_pQsTex->Release(); }
[BR] for (int i = 0; i < 25; i ++) { if(g_pTex) g_pTex->Release(); }
[BR] if(g_pD3DDevice != NULL) g_pD3DDevice->Release();
[BR] if(g_pD3D != NULL) g_pD3D->Release();}
[BR]HRESULT InitFrame(){ giCurTexIndex = 0; gRectIndex = 0;
[BR] //创建纹理 D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode00.dds", &g_pTex[0] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode01.dds", &g_pTex[1] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode02.dds", &g_pTex[2] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode03.dds", &g_pTex[3] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode04.dds", &g_pTex[4] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode05.dds", &g_pTex[5] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode06.dds", &g_pTex[6] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode07.dds", &g_pTex[7] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode08.dds", &g_pTex[8] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode09.dds", &g_pTex[9] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode10.dds", &g_pTex[10] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode11.dds", &g_pTex[11] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode12.dds", &g_pTex[12] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode13.dds", &g_pTex[13] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode14.dds", &g_pTex[14] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode15.dds", &g_pTex[15] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode16.dds", &g_pTex[16] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode17.dds", &g_pTex[17] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode18.dds", &g_pTex[18] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode19.dds", &g_pTex[19] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode20.dds", &g_pTex[20] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode21.dds", &g_pTex[21] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode22.dds", &g_pTex[22] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode23.dds", &g_pTex[23] ); D3DXCreateTextureFromFile( g_pD3DDevice, L"Media\\explode24.dds", &g_pTex[24] );
[BR]
[BR] // D3DXCreateTextureFromFile( pd3dDevice, L"Media\\qs.png", &g_pQsTex ));
[BR] D3DXCreateTextureFromFileEx(g_pD3DDevice, L"Media\\qs.png", 520, 490, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, NULL, NULL, &g_pQsTex);
[BR] /* 第一个参数调入是IDirect3DDevice8对象指针。 第二个参数是文件名。 第三个,第四个是图像的长和宽。 第五个是MipLevel,我调入1,表示MipLevel是一层, MIP使用来平滑3D图像远景显示中出现的杂乱线条的问题。 在2D图像程序设计中,我觉得是没什么用,所以,我就设定为一, 也就是说这个层只有一层。 第六个参数设定这个纹理的使用方法,这个参数可以是0, D3DUSAGE_RENDERTARGET,和D3DUSAGE_DYNAMIC。我使用的是0。 你也可以使用了D3DUSAGE_DYNAMIC,这样可以动态改变纹理中的数据。 如果你纹理不需要动态性改变,就不需要设定这个参数为D3DUSAGE_DYNAMIC。 第七个参数是纹理的格式,就是像素深度格式,你可以自己定义, 也可以直接定义为D3DFMT_UNKNOWN,让程序在载入图像文件时定义象素深度。 第八个是POOL,这是如何管理这些纹理。我使用D3DPOOL_MANAGED, 设定这个你必须设定使用方法为0,不能使用D3DUSAGE_DYNAMIC。 第九个参数是图像像素的过滤方式. 第十个是MIP的像素过滤方式. 第十一个参数是透明色,设定这个颜色,在显示时,这图像中的这个颜色将忽略。 第十二个参数可以用来定义图像文件的内部信息,这个参数是进出型,
[BR] 你可以定义一个数据结构对象,初始化里面的数据定义图像文件的信息。 你也可以调入NULL,这样,你就不在乎返回值。 接下来是调色板信息,这个只工作于8位图像文件上,我调入NULL,表示不用调色板信息。 最后是纹理返回的指针。*/
[BR] //创建ID3DXSprite接口对象 D3DXCreateSprite( g_pD3DDevice, &g_pTextSprite );
[BR] gvecPos.x = 4; gvecPos.y = 240; gvecPos.z = 0.0f;
[BR] gQsRect[0].left = 0; gQsRect[0].top = 0; gQsRect[0].right = 130; gQsRect[0].bottom = 123;
[BR] gQsRect[1].left = 130; gQsRect[1].top = 0; gQsRect[1].right = 130 * 2; gQsRect[1].bottom = 123;
[BR] gQsRect[2].left = 130 * 2; gQsRect[2].top = 0; gQsRect[2].right = 130 * 3; gQsRect[2].bottom = 123;
[BR] gQsRect[3].left = 130 * 3; gQsRect[3].top = 0; gQsRect[3].right = 130 * 4; gQsRect[3].bottom = 123;
[BR] return 0;}
[BR]void Update( double fTime){ // 计算当前纹理索引 static double fLastTime = 0.0f; //记录显示当前纹理的时间 if( fTime - fLastTime > 0.1f ) { fLastTime = fTime; giCurTexIndex++; if( giCurTexIndex > 24 ) giCurTexIndex = 0;
[BR] gRectIndex++; if (gRectIndex > 3) { gRectIndex = 0; } }}
[BR]
[BR]
[BR]
[BR]这个是我写的源码~里面应该很好懂 |
|