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

纠结了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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值