• <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)自強(qiá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類的實(shí)現(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ù)提供一個指向要打印文本的指針、開始打印處的坐標(biāo)、用于裁剪文本的邊界框(bounding box,即文本區(qū)域框)的大?。╳idth和height的缺省值為0,表示全屏)、文本的顏色(缺省為白色,而且要使用D3DCOLOR_RGBA宏定義顏色)以及文本格式。

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

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

             

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

            點(diǎn)擊下載源碼和工程

            /*****************************************************************************
            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();
            }

            運(yùn)行截圖:


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


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


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評論

            免费观看久久精彩视频| 婷婷综合久久狠狠色99h| 久久免费大片| 亚洲αv久久久噜噜噜噜噜| 国产成人精品白浆久久69| 国产福利电影一区二区三区久久老子无码午夜伦不 | 婷婷综合久久中文字幕蜜桃三电影| 东方aⅴ免费观看久久av| 九九99精品久久久久久| 伊色综合久久之综合久久| 99国产欧美精品久久久蜜芽| 香蕉99久久国产综合精品宅男自 | 久久久久18| 久久99国内精品自在现线| 欧美午夜精品久久久久久浪潮| 欧美黑人激情性久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 99久久无码一区人妻| 亚洲AV无码久久| 性高朝久久久久久久久久| 国产精品久久久久久影院| 伊人久久大香线蕉综合影院首页 | 欧美性猛交xxxx免费看久久久| 久久国产一区二区| 亚洲va国产va天堂va久久| 久久笫一福利免费导航| 久久国产香蕉视频| 久久精品国产只有精品66| 亚洲国产精品久久久久网站 | 99精品国产99久久久久久97| 区亚洲欧美一级久久精品亚洲精品成人网久久久久| 久久久无码精品亚洲日韩按摩| 国内精品伊人久久久久777| 国产精品久久久久a影院| 日产久久强奸免费的看| 久久久久18| 久久天天婷婷五月俺也去| 久久久精品人妻一区二区三区蜜桃| 久久夜色精品国产亚洲av| 人妻精品久久久久中文字幕| 中文字幕久久精品|