您的位置:首页 > 其它

D3D学习一:真是坑爹的书啊,初始化

2011-08-02 22:11 246 查看
纠结了N天,直接导入《DirectX 9.0 游戏开发编程基础》书本配套的工程运行没什么问题,为了可以尽快熟悉代码,我自己新建工程手打了一次,果真有N多的错误,看着代码明明都一样了就是运行不能,最后调试得崩溃了,干脆直接把配套的代码完全复制过了试试。他妈的,坑爹运行不能:

错误1error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 "bool __cdecl d3d::InitD3D(struct HINSTANCE__ *,int,int,bool,enum _D3DDEVTYPE,struct IDirect3DDevice9 *
*)" (?InitD3D@d3d@@YA_NPAUHINSTANCE__@@HH_NW4_D3DDEVTYPE@@PAPAUIDirect3DDevice9@@@Z) 中被引用

错误2error LNK2019: 无法解析的外部符号 __imp__timeGetTime@0,该符号在函数 "int __cdecl d3d::EnterMsgLoop(bool (__cdecl*)(float))" (?EnterMsgLoop@d3d@@YAHP6A_NM@Z@Z)
中被引用

后来经过N次得看书,说要工程要导入库文件:d3d9.lib 、d3dx9.h 、 winmm.lib 这不,在工具选项里导进去没效果,

坑爹啊后来查了谷歌才发现,这个要添加文件的地方在:

项目/属性/配置属性/连接器/输入/附加依赖项中添加




加进去以后就能跑了!



源代码(代码非原创,书上敲下来的):

//《3D游戏编程》金容俊/肖永亮
//-----------------------------------------------------------------------
// 创建D3D设备,学习清除画面的方法
//-----------------------------------------------------------------------

//使用Direct3D9的首部
#include <d3d9.h>
#include <windows.h>

//全局参数
LPDIRECT3D9 g_pD3D = NULL;			//创建D3D设备的D3D对象参数
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;		//渲染中使用的D3D设备

//Direct3D初始化
HRESULT InitD3D(HWND hWnd)
{
//创建一个用来创建设备的D3D对象
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;

D3DPRESENT_PARAMETERS d3dpp;			//创建设备的结构体
ZeroMemory(&d3dpp, sizeof(d3dpp));		//必须调用ZeroMemory()函数将结构体清零
d3dpp.Windowed = TRUE;				//创建窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;	//最有效的Swap效果
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;	//建立一个与当前显示模式相匹配的后置缓冲区

//按照以下设置,创建设备;
// 1.使用默认设置的显卡(大部分机子都是单显卡)
// 2.创建HAL设备(使用HW加速装置,即硬件加速)
// 3.顶点处理由支持所用显卡的SW创建(由HW创建性能更佳)
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}

//处理设备状态信息时,从这里进行
return S_OK;
}

//删除初始化对象
VOID Cleanup()
{
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();

if(g_pD3D != NULL)
g_pD3D->Release();
}

//绘图
VOID Render()
{
if(NULL == g_pd3dDevice)
return;

//将后置缓存清除,同时设置为蓝色
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);

//开始渲染
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//实际渲染命令栏

//结束渲染
g_pd3dDevice->EndScene();
}

//显示后置缓冲的画面
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

//窗口过程
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);
return 0;
}

return DefWindowProc(hWnd, msg, wParam, lParam);
}

//程序的起始地址
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//注册窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
TEXT("D3D Tutorial"), NULL };
RegisterClassEx(&wc);

//创建窗口 GetDesktopWindow()
HWND hWnd = CreateWindow(TEXT("D3D Tutorial"), TEXT("D3D Tutorial 01:CreateDevice"),
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
//HWND hWnd = CreateWindow()

//Direct3D初始化
if(SUCCEEDED(InitD3D(hWnd)))
{
//显示窗口
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);

//消息循环
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

//删除注册的类
UnregisterClass(TEXT("D3D Tutorial"), wc.hInstance);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: