在Direct3D中进行字体创建时,要用到下面的绘制文本的函数。即ID3DXFont::DrawText的调用
下面看一下这个函数的原型:
INT DrawText(
[in] LPD3DXSPRITE pSprite,
[in] LPCTSTR pString,
[in] INT Count,
[in] LPRECT pRect,
[in] DWORD Format,
[in] D3DCOLOR Color
);
【第一个参数】:指定字符串所属的ID3DXSprite对象接口。可以设为0,表示在当前窗口绘制字符串。
【第二个参数】:指定要绘制的字符串内容。
【第三个参数】:指定绘制字符的个数,如果取-1,就表示函数会自动绘制到字符串结束为止。
【第四个参数】:表示用于绘制字符串的矩形区域位置。
【第五个参数】:指定字符串在上面设置的这个参数,pRect矩形区域中的摆放属性。
【第六个参数】:指定字符串显示的颜色。
下面就是Direct3D绘制五步曲:
一:清屏操作
HRESULT Clear(
[in] DWORD Count,
[in] const D3DRECT *pRects,
[in] DWORD Flags,
[in] D3DCOLOR Color,
[in] float Z,
[in] DWORD Stencil
);
【第一个参数】:指定接下来的一个参数pRect指向的矩形数组中矩形的数量。
【第二个参数】:指向一个D3DRECT结构体的数组指针,表明我们需要清空的目标矩形区域。
【第三个参数】:指定我们需要清空的缓冲区。
【第四个参数】:指定我们在清空颜色缓冲区后每个像素对应的颜色值。
【第五个参数】:指定清空深度缓冲区后每个像素对应的深度值。
【第六个参数】:指定清空模板缓冲区后模板缓冲区中每个像素对应的模板值
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);//清屏
二:开始场景
g_pd3dDevice表示我们创建的有效的Direct3D绘制“金钥匙”-Direct3D设备对象
g_pd3dDevice->BeginScene();//开始绘制
该函数与IDirect3DDevice9::EndScene()成对出现。
三:正式绘制
//在纵坐标50处,写第一段文字
formatRect.top = 50;//指定文字的纵坐标
g_pFont->DrawText(0, _T("芦叶满汀洲。寒沙带浅流。二十年、重过南楼"), -1, &formatRect, DT_CENTER,
D3DCOLOR_XRGB(68,139,256));
//在纵坐标200处,写第二段文字
formatRect.top = 200;
g_pFont->DrawText(0, _T("柳下系舟犹未稳,能几日、又中秋"), -1, &formatRect,
DT_CENTER, D3DCOLOR_XRGB(255,10,10));
//在纵坐标350处,写第三段文字
formatRect.top = 350;
g_pFont->DrawText(0, _T("黄鹤断矶头。故人今在不。旧江山、浑是新愁"), -1, &formatRect, DT_CENTER,
D3DCOLOR_XRGB(0,0,255));//采用随机RGB值,做出文字的特效
//在纵坐标500处,写第四段文字
formatRect.top = 500;
g_pFont->DrawText(0, _T("欲买桂花同载酒,终不是、少年游"), -1, &formatRect,
DT_CENTER, D3DCOLOR_XRGB(255,255,10));
四:结束场景
g_pd3dDevice->EndScene();//结束绘制
五:翻转显示
只是将文字绘制完成这还不够,如果不进行翻转显示操作,我们是看不到绘制结果的。因为我们绘制的内容是在幕后完成的,我们需要把幕后的内容翻转到前台,那么就要用到一个非常重要的函数Present()
HRESULT Present(
[in] const RECT *pSourceRect,
[in] const RECT *pDestRect,
[in] HWND hDestWindowOverride,
[in] const RGNDATA *pDirtyRegion
);
【第一个参数】:指向复制源矩形区域的指针,一般将其设为NULL
【第二个参数】:指向复制目标矩形区域的指针,一般将其设为NULL
【第三个参数】:指向当前绘制的窗口句柄,一般将其设为NULL
【第四个参数】:指向最小更新区域的指针,一般将其设为NULL
g_pd3dDevice->Precent(NULL,NULL,NULL,NULL);//翻转与显示
这只是这段程序的核心代码,我没有把WinMain,WndProc,Direct3d_Init等函数的具体实现贴上来,这三段代码都是万年不变的老三样,基本没有什么改动。
看着这一段古诗颇有一番感慨,我这么文艺的人竟然也开始写起了代码。多年前想当一个文艺作家的梦想就此破灭,希望我可以在游戏行业这条路上越走越远。与君共勉!