Directx9学习(六)第一个小游戏

2017.08.28

这两天照着书上写了一个小小的小游戏,用DX写的第一个游戏(如果用引擎写的话估计只需要一个下午吧(笑),不过第一次不用引擎,还不错)

心得:

1.创建窗口时,WNDCCLASSEX 的成员lpszClassName 和 CreateWindow中的第一个参数,这俩字符串(?)必须一样,要不然窗口无法创建

2.LRESULT CALLBACK WinProc

3.绘画函数:

//画bomb和bucket
void DrawSurface(LPDIRECT3DSURFACE9 dest, float x, float y, LPDIRECT3DSURFACE9 source)
{
	//get info from source
	D3DSURFACE_DESC desc;
	source->GetDesc(&desc);
	//create rects for drawing
	RECT source_rect = { 0,0,(long)desc.Width,(long)desc.Height };
	RECT dest_rect = { (long)x,(long)y,(long)x + desc.Width,(long)y + desc.Height };
	d3ddev->StretchRect(source, &source_rect, dest, &dest_rect, D3DTEXF_NONE);

}
//画背景
void DrawBackGround(LPDIRECT3DSURFACE9 backbuffer, LPDIRECT3DSURFACE9 source)
{
	d3ddev->StretchRect(source, NULL, backbuffer, NULL, D3DTEXF_NONE);


}
//获得图片的信息并加载到表面中
LPDIRECT3DSURFACE9 LoadSurface(string fileName)
{
	LPDIRECT3DSURFACE9 img = NULL;


	//get W,H from bmp
	D3DXIMAGE_INFO info;
	HRESULT result = D3DXGetImageInfoFromFile(fileName.c_str(), &info);
	if (result != D3D_OK)
		return NULL;
	
	//create a surface
	result = d3ddev->CreateOffscreenPlainSurface(
		info.Width,
		info.Height,
		D3DFMT_X8R8G8B8,
		D3DPOOL_DEFAULT,
		&img,
		NULL
	);
	if (result != D3D_OK)
		return NULL;
	
	//load surface from file into newly created surface
	result = D3DXLoadSurfaceFromFile(
		img,
		NULL,
		NULL,
		fileName.c_str(),
		NULL,
		D3DX_DEFAULT,
		0,
		NULL
	);
	if (result != D3D_OK)
		return NULL;


	return img;
}

 
  

不过上面获得的信息,在绘画的时候有时候画不出来,问题在绘画的位置和尺寸上(矩形),问题可能出在StretchRect中,矩形的位置不对,将初始化的Y只修改就能看到了

注意图片的位置


4.初始化输入的步骤:

创建(DirectInput8Create)->获得设备(CreateDevice)->设置格式(SetDataFormat)->设置优先级(SetCooperativeLevel)->获得设备的使用(Acquire)


5.使用GetDeviceState来轮询鼠标或者键盘


6.用IDirect3DSurface9 创建一个表面指针,D3DXGetImageInfoFromFile 从文件获得这个图片的信息,CreateOffscreenPlainSurface 从文件图片创建表面(大小,格式等),        D3DXLoadSurfaceFromFile 从文件把这个图画到这个表面上 , StretchRect 用于将这个表面的某些部分画到窗口的某个部分


需要使用#include 

#include,

#pragma comment(lib,"dxguid.lib")

#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dinput8.lib")

才能用一些D3DX的功能


7.整理一下至今的D3D初始化操作:

获得d3d变量LPDIRECT3D9 --> 声明d3ddev设备变量LPDIRECT3DDEVICE9-->设置d3dpp设备参数D3DPRESENT_PARAMETERS-->初始化d3d设备变量d3d->CreateDevice


8.表面和后台缓冲区:

声明一个表面LPDIRECT3DSURFACE9 --> 声明一个后台缓冲区表面backbuffer --> 让backbuffer指向后台缓冲区d3ddev->GetBackBuffer --> 创建这个表面

d3ddev->CreateOffscreenPlainSurface  --> 纯色填充d3ddev->ColorFill , 获得图片信息D3DXGetImageInfoFromFile , 装载位图D3DXLoadSurfaceFromFile -->利用 

d3ddev->StretchRect 来将表面的某一部分画到窗口的某一部分


9.D3D顺序:

d3ddev->BeginScene     d3ddev->EndScene d3ddev->Present(将后台缓冲区的东西更新到屏幕)




你可能感兴趣的:(DirectX学习)