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

            天行健 君子當(dāng)自強而不息

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

             

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

             

            使用FONT處理文本和字體

            雖然ID3DXFont對象處理起來比較容易,但是設(shè)置字體卻讓人痛苦不堪。不要緊,使用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ù)傳遞一個預(yù)初始化的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 當(dāng)?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 閱讀(341) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            成人国内精品久久久久一区| 久久伊人中文无码| 亚洲乱码日产精品a级毛片久久| 欧美精品丝袜久久久中文字幕| 伊人久久大香线蕉综合热线| 国产美女亚洲精品久久久综合| 色婷婷综合久久久久中文 | 久久国产一区二区| 久久亚洲av无码精品浪潮| 77777亚洲午夜久久多人| 国产精品久久久久久久久鸭| 久久乐国产精品亚洲综合| 久久精品亚洲AV久久久无码| 国产精品免费久久久久电影网| 久久精品久久久久观看99水蜜桃| 久久综合欧美成人| 少妇久久久久久被弄高潮| 99久久精品国产毛片| 亚洲AV日韩精品久久久久| 久久久久一本毛久久久| 国产午夜精品理论片久久影视| 亚洲综合久久久| 久久久久国产亚洲AV麻豆| 精品人妻久久久久久888| 久久精品国产亚洲av麻豆蜜芽 | 狠色狠色狠狠色综合久久| 久久无码高潮喷水| 色综合合久久天天给综看| 青青草国产精品久久| a级成人毛片久久| 亚洲精品无码久久千人斩| 区久久AAA片69亚洲| 日本加勒比久久精品| 久久99精品国产麻豆不卡| 伊人久久大香线蕉影院95| 99精品久久精品| 久久亚洲日韩精品一区二区三区| 亚洲中文精品久久久久久不卡| 久久久久亚洲国产| 久久亚洲国产成人影院| 亚洲精品乱码久久久久久自慰|