当 Direct3D 遇上中国古诗词

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33442459/article/details/73998668

在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等函数的具体实现贴上来,这三段代码都是万年不变的老三样,基本没有什么改动。

这里写图片描述

看着这一段古诗颇有一番感慨,我这么文艺的人竟然也开始写起了代码。多年前想当一个文艺作家的梦想就此破灭,希望我可以在游戏行业这条路上越走越远。与君共勉!

猜你喜欢

转载自blog.csdn.net/sinat_33442459/article/details/73998668