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(将后台缓冲区的东西更新到屏幕)