directx-01-梦开始的地方

博主决定通过写博客学习DirectX9.0,以实现游戏开发梦想。参考书籍为《Directx 游戏开发终极指南》。DirectX是微软的多媒体API工具包,用于游戏和其他图形软件开发,由DirectGraphics、DirectInput等组件组成。开发前需下载DirectX SDK,并在VS2010-Win32平台上初始化Windows窗口。
摘要由CSDN通过智能技术生成

最近感觉有点荒废,为了让自己充实点,本人决定在csdn上写博客,学习directx9.0,为了游戏梦想。

由于自己也是初学,可能会犯很多错误,欢迎网友报错,欢迎前辈指点。

学习的参考书目为《Directx 游戏开发终极指南》,其实自己也买了龙书,但是感觉龙书相对比这本难理解,看完这个再学龙书。

一.先来介绍下directx

directx微软公司的DirectX是一个多媒体应用编程接口(API)工具包,DirectX主要用于游戏开发,但其中部分(而不是全部)用于开发其他类型软件,这些软件包括游戏虚拟角色、网络游戏和与游戏无关的图形软件。DirectX通过和底层硬件打交道,从而获取软件的最大性能。API DirectX主要由DirectGraphics、DirectInput、DirectPlay、DirectMusic和DirectSound组成。DirectX中的每个API都可以通过硬件加速。

DirectGraphics是DirectX API,主要负责向屏幕上渲染二维图形和三维图形。有经验的程序员会认为DirectGraphics是Direct3D。

DirectInput是Direct API,可以直接使用所有与计算机关联的输入设备。这些设备包括键盘、鼠标和游戏控制器设备。

DirectPlay控制台DirectX中网络功能的API。

DirectMusic是DirectX API中的一员,负责声音的处理。

DirectX中的DirectSound API提供了更高级声音处理能力。

要进行directx开发,首先去微软下载directxsdk。

二.初始化win窗口,由于d3d是微软的东西,自然也要在windows平台上开发了,我们的开发平台为vs2010-win32平台,所以我们先来初始化一个windows窗口

(和vc++游戏编程第一节有点重复,所以这里不讲了)我们主要来初始化一个d3d窗口;

首先你要引用d3d里面的lib,这时你 必须先安装好directxsdk,然后在vs2010项目中加载链接项

#include<d3d9.h>							//头文件

#pragma comment(lib, "d3d9.lib")			//调用库
#pragma comment(lib, "d3dx9.lib")

#define WINDOW_CLASS "UGPDX"				//宏
#define WINDOW_NAME  "D3D Window"
// 定义顶点格式标识符,即灵活顶点格式
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)


// Function Prototypes... 声明
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();          // 用于创建演示程序中要绘制在屏幕上的物体
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;   // 定义了一个顶点缓存对象
void RenderScene();
void Shutdown();


// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;					//初始化D3D对象
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;	

// 定义场景中单个3D点的结构
struct stD3DVertex
{
	float x, y, z, rhw;    // 点的x,y,z坐标值
	unsigned long color;   // 点的颜色
};



LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //消息回调函数
{
	switch(msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;

	case WM_KEYUP:
		if(wParam == VK_ESCAPE) PostQuitMessage(0);
		break;
	}

	return DefWindowProc(hWnd, msg, wParam, lParam);		//销毁
}


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
	// Register the window class
	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
		GetModuleHandle(NULL), NULL, NULL, NULL, NULL,WINDOW_CLASS, NULL };  //创建窗口类
	RegisterClassEx(&wc);	//注册窗口类

	// Create the application's window  创建窗口
	HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
		100, 100, 640, 480, GetDesktopWindow(), NULL,
		wc.hInstance, NULL);

	// Initialize Direct3D初始化
	if(InitializeD3D(hWnd, false))
	{
		// Show the window
		ShowWindow(hWnd, SW_SHOWDEFAULT);
		UpdateWindow(hWnd);

		// Enter the message loop
		MSG msg;
		ZeroMemory(&msg, sizeof(msg));

		while(msg.message != WM_QUIT)
		{
			if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
				RenderScene();		//渲染屏幕
		}
	}

	// Release any and all resources.
	Shutdown();			//释放D3D对象

	// Unregister our window.
	UnregisterClass(WINDOW_CLASS, wc.hInstance);
	return 0;
}


bool InitializeD3D(HWND hWnd, bool fullscreen)		//初始化D3D
{
	D3DDISPLAYMODE displayMode;

	// Create the D3D object.
	g_D3D = Direct3DCreate9(D3D_SDK_VERSION);  //创建D3D接口对象
	if(g_D3D == NULL) return false;

	// Get the desktop display mode.显卡信息
	if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
		return false;

	// Set up the structure used to create the D3DDevice
	//建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息

	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));

	if(fullscreen)
	{
		d3dpp.Windowed = FALSE;
		d3dpp.BackBufferWidth = 640;
		d3dpp.BackBufferHeight = 480;
	}
	else
		d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = displayMode.Format;

	// Create the D3DDevice
	if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
	{
		return false;
	}

	return true;
}


void RenderScene()
{
	// Clear the backbuffer.
	g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);

	// Begin the scene.  Start rendering.
	g_D3DDevice->BeginScene();

	// End the scene.  Stop rendering.
	g_D3DDevice->EndScene();

	// Display the scene.
	g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}


void Shutdown()
{
	if(g_D3DDevice != NULL) g_D3DDevice->Release();
	if(g_D3D != NULL) g_D3D->Release();

	g_D3DDevice = NULL;
	g_D3D = NULL;
}

InitializeD3D()函数开始先调用Direct3DCreate9()函数。Direct3DCreate9()函数将创建一个Direct3D接口对象,并返回该对象。该函数所带的参数值为D3D_SDK_VERSION。如果从该函数创建的接口不为NULL(空),那么接口创建成功。如果是NULL,那么创建接口时就会出现一些错误,并且由于其余步骤在很大程度上取决于是否成功调用Direct3DCreate9()函数,所以一旦出现错误,就会立刻退出Direct3D初始化程序。
接下来调用的是GetAdapterDisplayMode()函数,该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值