• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            創(chuàng)建游戲內(nèi)核(12)

             

            本篇是 創(chuàng)建游戲內(nèi)核(11)的續(xù)篇,其中涉及到的字體知識請參閱D3D中的字體繪制示例

             

            使用FONT處理文本和字體

            雖然ID3DXFont對象處理起來比較容易,但是設置字體卻讓人痛苦不堪。不要緊,使用FONT類就能快速并容易地得到字體。

            來看看FONT類的定義:

            class FONT
            {
            private:
                ID3DXFont*  _font;

            public:
                FONT();
                ~FONT();

                ID3DXFont* Get_Font_COM();

                BOOL Create(GRAPHICS* graphics, 
            char* face_name, long size = 16, BOOL is_bold = FALSE, BOOL is_italic = FALSE);
                
            void Free();

                BOOL Print(
            char* text, long x_pos, long y_pos, long width = 0, long height = 0,
                           D3DCOLOR color = 0xFFFFFFFF, DWORD format = 0);
            };

            接著是FONT類的實現(xiàn):
            //-------------------------------------------------------------------
            // Constructor, initialize data member.
            //-------------------------------------------------------------------
            FONT::FONT()
            {
                _font = NULL;
            }

            //-------------------------------------------------------------------
            // Destructor, release font resource.
            //-------------------------------------------------------------------
            FONT::~FONT()
            {
                Free();
            }

            //-------------------------------------------------------------------
            // Get pointer to font object.
            //-------------------------------------------------------------------
            ID3DXFont* FONT::Get_Font_COM()
            {
                
            return _font;
            }

            //-------------------------------------------------------------------
            // Create font object.
            //-------------------------------------------------------------------
            BOOL FONT::Create(GRAPHICS *graphics, char* face_name, long size, BOOL is_bold, BOOL is_italic)
            {
                D3DXFONT_DESC font_desc;

                
            // check condition first

                
            if(graphics == NULL || face_name == NULL)
                    
            return FALSE;

                
            if(graphics->Get_Device_COM() == NULL)
                    
            return FALSE;

                
            // clear out the font structure
                ZeroMemory(&font_desc, sizeof(D3DXFONT_DESC));

                
            // set the font property

                strcpy(font_desc.FaceName, face_name);

                font_desc.Height = -size;
                font_desc.Weight = is_bold ? 700 : 0;
                font_desc.Italic = is_italic;

                
            // create the font object
                if(FAILED(D3DXCreateFontIndirect(graphics->Get_Device_COM(), &font_desc, &_font)))
                    
            return FALSE;

                
            return TRUE;
            }

            //-------------------------------------------------------------------
            // Release font resource.
            //-------------------------------------------------------------------
            void FONT::Free()
            {
                Release_COM(_font);
            }

            //-------------------------------------------------------------------
            // Draw text.
            //-------------------------------------------------------------------
            BOOL FONT::Print(char* text, long x_pos, long y_pos, long width, long height, D3DCOLOR color, DWORD format)
            {
                RECT rect;

                
            if(_font == NULL)
                    
            return FALSE;

                
            // set draw region's width and height
                if(width  == 0)  width  = 65536;
                
            if(height == 0)  height = 65536;

                
            // set draw region
                rect.left   = x_pos;
                rect.top    = y_pos;
                rect.right  = rect.left + width;
                rect.bottom = rect.top + height;

                
            // draw text now
                if(FAILED(_font->DrawText(NULL, text, -1, &rect, format, color)))
                    
            return FALSE;

                
            return TRUE;
            }

            要使用某個字體,使用FONT::Create函數(shù)來創(chuàng)建,必須給Create函數(shù)傳遞一個預初始化的GRAPHICS對象,提供一個字體名稱,并指定字體的大小(使用像素高度的近似值)。

            打印一行文本時,需要給FONT::Print函數(shù)提供一個指向要打印文本的指針、開始打印處的坐標、用于裁剪文本的邊界框(bounding box,即文本區(qū)域框)的大小(width和height的缺省值為0,表示全屏)、文本的顏色(缺省為白色,而且要使用D3DCOLOR_RGBA宏定義顏色)以及文本格式。

            下表列出了打印文本時可以使用的格式:
             

            標志 說明
            DT_BOTTOM 將文本對齊到邊界矩形的底部。
            DT_CENTER 在邊界矩形中將文本水平居中。
            DT_LEFT 將文本左對齊到邊界矩形的左邊緣。
            DT_NOCLIP 繪制文本,不將文本裁剪到邊界矩形中,用于快速繪制。
            DT_RIGHT 將文本右對齊到邊界矩形的右邊緣。
            DT_TOP 將文本對齊到邊界矩形的頂部。
            DT_WORDBREAK 當?shù)竭_邊界矩形的右邊緣時,文本將自動切換到下一行輸出。

             

            下面來看看一個完整的示例:

            點擊下載源碼和工程

            /*****************************************************************************
            PURPOSE:
                Test for class FONT.
            *****************************************************************************/


            #include "Core_Global.h"

            #pragma warning(disable : 4996)

            //===========================================================================
            // Defines class APP which public inherits from class APPLICATION.
            //===========================================================================
            class APP : public APPLICATION
            {
            private:
                GRAPHICS        _graphics;
                FONT            _font;  
                
            public:    
                BOOL Init();
                BOOL Shutdown();
                BOOL Frame();
            };

            //-----------------------------------------------------------------------------
            // Initialize graphics, set display mode, create font object.
            //-----------------------------------------------------------------------------
            BOOL APP::Init()
            {    
                
            // initialize graphics
                if (! _graphics.Init())
                    
            return FALSE;    

                
            // set display mode for graphics
                if(! _graphics.Set_Mode(Get_Hwnd(), TRUE, TRUE, 400, 400, 32))
                    
            return FALSE;

                
            // create font object
                if(! _font.Create(&_graphics, "Segoe Script", 32))
                    
            return FALSE;

                
            return TRUE;
            }

            //-----------------------------------------------------------------------------
            // Release all d3d resource.
            //-----------------------------------------------------------------------------
            BOOL APP::Shutdown()
            {
                
            return TRUE;
            }

            //-----------------------------------------------------------------------------
            // Render a frame.
            //-----------------------------------------------------------------------------
            BOOL APP::Frame()
            {    
                
            // clear display with specified color
                _graphics.Clear(D3DCOLOR_RGBA(0, 0, 0, 255), 1.0);

                
            // begin scene
                if(_graphics.Begin_Scene())
                {
                    
            // draw text
                    _font.Print("How are you, cloud?", 0, 0, _graphics.Get_Width(), _graphics.Get_Height(), 
                                0xFFFFFFFF, DT_CENTER | DT_VCENTER);
                 
                    
            // end the scene
                    _graphics.End_Scene();       
                }

                
            // display video buffer
                _graphics.Display();
                
                
            return TRUE;
            }

            int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                APP app;

                
            return app.Run();
            }

            運行截圖:


            posted on 2007-09-04 17:58 lovedday 閱讀(343) 評論(0)  編輯 收藏 引用

            公告

            導航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            99久久香蕉国产线看观香| 亚洲精品美女久久777777| 久久综合九色综合欧美狠狠| 国产午夜久久影院| 四虎国产精品免费久久| 久久人人爽人人爽人人片AV东京热| 99久久国产宗和精品1上映| 国产99久久精品一区二区| 亚洲国产成人精品女人久久久 | 狠狠色婷婷久久一区二区三区| 久久国产高潮流白浆免费观看| 激情五月综合综合久久69| 国产美女亚洲精品久久久综合| 777久久精品一区二区三区无码| 久久精品青青草原伊人| 久久久久久无码国产精品中文字幕 | 亚洲国产精品无码久久SM| 国产成人精品久久亚洲| 久久婷婷五月综合色高清| 国产午夜精品理论片久久| 72种姿势欧美久久久久大黄蕉| 波多野结衣久久精品| 久久久久亚洲av成人无码电影| 国产高潮国产高潮久久久| 久久久久香蕉视频| 国内精品久久久久久野外| 亚洲精品无码久久久久去q| 热久久国产欧美一区二区精品| 99久久久久| 久久青青国产| 国内精品久久久久久久影视麻豆| 久久免费小视频| 国产女人aaa级久久久级| 天天久久狠狠色综合| 人人狠狠综合久久亚洲88| 精品久久久久久国产91| 久久婷婷国产麻豆91天堂| 大香网伊人久久综合网2020| 久久久国产精品福利免费| 国产99久久久国产精品~~牛| 国内精品久久久久久中文字幕|