• <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>

            天行健 君子當自強而不息

            創建游戲內核(12)

             

            本篇是 創建游戲內核(11)的續篇,其中涉及到的字體知識請參閱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類的實現:
            //-------------------------------------------------------------------
            // 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函數來創建,必須給Create函數傳遞一個預初始化的GRAPHICS對象,提供一個字體名稱,并指定字體的大?。ㄊ褂孟袼馗叨鹊慕浦担?。

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

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

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

             

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

            點擊下載源碼和工程

            /*****************************************************************************
            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)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            亚洲中文精品久久久久久不卡| 国产美女亚洲精品久久久综合| 国内精品九九久久久精品| 久久久噜噜噜久久熟女AA片| 久久人爽人人爽人人片AV| 色综合色天天久久婷婷基地| 人人狠狠综合久久亚洲88| 日韩乱码人妻无码中文字幕久久 | 久久99热只有频精品8| 人妻丰满AV无码久久不卡| 久久婷婷激情综合色综合俺也去| 91精品国产91久久久久福利| 久久伊人精品青青草原日本| 国内精品人妻无码久久久影院| 久久中文精品无码中文字幕| 国产精品美女久久久久网| 中文字幕久久精品无码| 久久久精品国产Sm最大网站| 男女久久久国产一区二区三区| 久久天天躁狠狠躁夜夜不卡| 青青国产成人久久91网| 久久久精品人妻一区二区三区蜜桃| 大香网伊人久久综合网2020| 国产精品无码久久综合| 精品久久亚洲中文无码| 久久综合一区二区无码| 精品欧美一区二区三区久久久 | 一级A毛片免费观看久久精品| 精品久久一区二区| 久久精品水蜜桃av综合天堂| 亚洲av日韩精品久久久久久a| 久久久WWW成人免费毛片| 狠狠88综合久久久久综合网| 日韩av无码久久精品免费| 亚洲国产一成久久精品国产成人综合 | 久久精品国产99久久久香蕉| 亚洲国产精品热久久| 99久久国产免费福利| 久久国产成人精品国产成人亚洲| 亚洲综合久久综合激情久久| Xx性欧美肥妇精品久久久久久|