|
 实在是很痛苦(新手),用d3dsprite显示不出来,没有办法,不知道问题出在哪里
贴上代码,希望高手指教。
环境:VC6.0 + DX(不知道那个版本),已经无编译错误。
是全屏,黑漆漆的一片
#include
#include
#include
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
char* CatBMP = "cat.bmp";
//char* MouseBMP = "mouse.bmp";
RECT rct;
HWND g_hWnd;
HINSTANCE g_hInstance;
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPD3DXSPRITE g_pSprite = NULL;
LPDIRECT3DTEXTURE9 g_pTexture = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
struct CUSTOMVERTEX
{
float x, y, z, rhw;
DWORD color;
};
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
bool InitWindow(HINSTANCE hInstance);
bool InitDirect3D();
bool InitVB();
void Render();
void Cleanup();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow )
{
if (!InitWindow(hInstance))
return false;
if (!InitDirect3D())
return false;
if(!InitVB())
return false;
// if(!SetupMouse())
// return false;
// main message loop:
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
while(msg.message != WM_CLOSE)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
Render();
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(g_hWnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_CLOSE:
Cleanup();
PostQuitMessage(0);
return 0;
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
bool InitWindow(HINSTANCE hInstance)
{
//注册窗口类略
g_hInstance = hInstance;
// Create the window
g_hWnd = CreateWindow
(
"DirectXExample",
"DirectXExample",
WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL
);
if (!g_hWnd)
return false;
// Display the window on the screen
ShowWindow(g_hWnd, SW_SHOW);
UpdateWindow(g_hWnd);
return true;
}
bool InitDirect3D()
{
SetRect(&rct, 400, 400, 500, 500);
//g_pD3D = NULL;
//g_pd3dDevice = NULL;
if((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
return FALSE;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
//d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
//d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.hDeviceWindow = g_hWnd;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
return FALSE;
if(FAILED(D3DXCreateSprite(g_pd3dDevice, &g_pSprite)))
return FALSE;
//D3DIMAGE_INFO imageinfo;
if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, CatBMP, &g_pTexture)))
return FALSE;
return TRUE;
}
bool InitVB()
{
CUSTOMVERTEX vertices[] =
{
{300.0, 300.0, 0, 0},
{400.0, 300.0, 0, 0},
{400.0, 400.0, 0, 0},
{300.0, 400.0, 0, 0}
};
if(FAILED(g_pd3dDevice->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX), 0,
D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_pVB, NULL)))
return false;
VOID* pVertices;
if(FAILED(g_pVB->Lock(0, 0, &pVertices, 0)))
return false;
memcpy(pVertices, vertices, sizeof(vertices));
g_pVB->Unlock();
return true;
}
void Render()
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0, 0, 0), 1, 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
if(SUCCEEDED(g_pSprite->Begin()))//D3DXSPRITE_ALPHABLEND
{
g_pSprite->Draw(g_pTexture, &rct, NULL, NULL, NULL, NULL, RGB(0,0,0));
g_pSprite->End();
}
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
void Cleanup()
{
/*if(g_lpDI != NULL)
{
if(g_lpMouse != NULL)
{
g_lpMouse->Unacquire();
g_lpMouse->Release();
g_lpMouse = NULL;
}
g_lpDI->Release();
g_lpDI = NULL;
}*/
if(g_pVB != NULL)
{
g_pVB->Release();
g_pVB = NULL;
}
if(g_pTexture != NULL)
{
g_pTexture->Release();
g_pTexture = NULL;
}
if(g_pSprite != NULL)
{
g_pSprite->Release();
g_pSprite = NULL;
}
if(g_pd3dDevice != NULL)
{
g_pd3dDevice->Release();
g_pd3dDevice = NULL;
}
if(g_pD3D !=NULL)
{
g_pD3D->Release();
g_pD3D = NULL;
}
}
随便问2个问题,
1、vertices[]干什么的?
2、斑竹能讲讲matrix |
|