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

            天行健 君子當自強而不息

            Controlling Players and Characters(14)

             

            The cTextWindow Class
             

            To get things rolling, take a look at the following cTextWindow class definition:

            #include <stdlib.h>
            #include "core_common.h"
            #include "core_graphics.h"

            typedef 
            class cTextWindow
            {
            private:
                typedef 
            struct sVertex
                {
                    
            float x, y, z;      // coordinates in screen space
                    float rhw;      
                    D3DCOLOR diffuse;   
                } *sVertexPtr;

                
            #define WINDOW_FVF  (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

                ID3DXFont*                  m_font;
                IDirect3DVertexBuffer9*     m_vb;   
            // vertex buffer for window text    

                
            char*           m_text;             // text to display
                D3DCOLOR        m_text_color;       // color to draw text

                
            long            m_x_pos, m_y_pos;   // window coordinates
                long            m_width, m_height;  // window dimensions

                
            bool            m_draw_target;      // flag to draw bubble pointer

            public:
                cTextWindow()
                {
                    memset(
            this, 0, sizeof(*this));

                    m_text_color = 0xFFFFFFFF;
                }

                ~cTextWindow()
                {
                    free();
                }

                
            void create(ID3DXFont* font)
                {
                    free();

                    m_font = font;            

                    create_vertex_buffer(&m_vb, 11, 
            sizeof(sVertex), WINDOW_FVF);        
                }

                
            void free()
                {
                    release_com(m_vb);
                    delete[] m_text;
                }

                
            void set_text(pcstr text, D3DCOLOR text_color)
                {
                    delete[] m_text;

                    m_text = strdup(text);
                    m_text_color = text_color;
                }      

                
            long get_height()
                {
                    
            return m_height;
                }

                
            void move(long x_pos, long y_pos, long width, long height,
                          
            long target_x, long target_y,
                          D3DCOLOR back_color, D3DCOLOR outline_color);

                
            void render(pcstr text, D3DCOLOR text_color);
            } *cTextWindowPtr;

            Remember that the text window uses a vertex buffer to contain a
            couple of rectangles (with two triangles defined per rectangle). The vertex buffer uses
            only transformed vertices that are assigned a diffuse color (white for the larger rectangle
            in the back and your color of choice for the smaller rectangle in the front). Each
            vertex is stored within the preceding sVertex structure
            (and matching vertex descriptor).

             

            cTextWindow::move


            The biggest of the bunch, cTextWindow::Move has the job of constructing the vertex buffer
            used to render the window (and supporting pointer, if needed). The function takes
            as arguments the position to place the window (screen coordinates), the dimensions
            (in pixels), a pair of coordinates at which to point the text-bubble pointer, and a
            color to use for the smaller frontmost window.

            void cTextWindow::move(long x_pos, long y_pos, long width, long height,
                                   
            long target_x, long target_y,
                                   D3DCOLOR back_color, D3DCOLOR outline_color)
            {
                m_x_pos = x_pos;
                m_y_pos = y_pos;
                m_width = width;

                
            // calculate height if needed
                if((m_height = height) == 0)
                {
                    RECT rect;

                    rect.left   = x_pos;
                    rect.top    = 0;
                    rect.right  = x_pos + width - 12;
                    rect.bottom = 1;

                    
            int text_height = m_font->DrawText(NULL, m_text, -1, &rect, DT_CALCRECT | DT_WORDBREAK, 0xFFFFFFFF);
                    m_height = text_height + 12;
                }

                sVertex verts[11];

                
            // initialize vertex data
                for(long i = 0; i < 11; i++)
                {
                    verts[i].z       = 0.0f;
                    verts[i].rhw     = 1.0f;
                    verts[i].diffuse = outline_color;
                }

                
            // setup outline

                verts[0].x = (
            float) m_x_pos;
                verts[0].y = (
            float) m_y_pos;

                verts[1].x = (
            float) (m_x_pos + m_width);
                verts[1].y = (
            float) m_y_pos;

                verts[2].x = (
            float) m_x_pos;
                verts[2].y = (
            float) m_y_pos + m_height;

                verts[3].x = (
            float) (m_x_pos + m_width);
                verts[3].y = (
            float) (m_y_pos + m_height);

                
            // setup text window

                verts[4].x       = (
            float) m_x_pos + 2.0f;
                verts[4].y       = (
            float) m_y_pos + 2.0f;
                verts[4].diffuse = back_color;

                verts[5].x       = (
            float) m_x_pos + m_width - 2.0f;
                verts[5].y       = (
            float) m_y_pos + 2.0f;
                verts[5].diffuse = back_color;

                verts[6].x       = (
            float) m_x_pos + 2.0f;
                verts[6].y       = (
            float) m_y_pos + m_height + 2.0f;
                verts[6].diffuse = back_color;

                verts[7].x       = (
            float) m_x_pos + m_width - 2.0f;
                verts[7].y       = (
            float) m_y_pos + m_height - 2.0f;
                verts[7].diffuse = back_color;

                
            // setup the target position
                if(target_x != -1 && target_y != -1)
                {
                    m_draw_target = 
            true;

                    
            if(target_y < m_y_pos)
                    {
                        verts[8].x = (
            float) target_x;
                        verts[8].y = (
            float) target_y;

                        verts[9].x = (
            float) (m_x_pos + m_width/2 + 10);
                        verts[9].y = (
            float) m_y_pos;

                        verts[10].x = (
            float) (m_x_pos + m_width/2 - 10);
                        verts[10].y = (
            float) m_y_pos;
                    }
                    
            else
                    {
                        verts[8].x = (
            float) (m_x_pos + m_width/2 - 10);
                        verts[8].y = (
            float) (m_y_pos + m_height);

                        verts[9].x = (
            float) (m_x_pos + m_width/2 + 10);
                        verts[9].y = (
            float) (m_y_pos + m_height);

                        verts[10].x = (
            float) target_x;
                        verts[10].y = (
            float) target_y;
                    }
                }
                
            else
                    m_draw_target = 
            false;

                fill_in_vertex_buffer(m_vb, 0, 11, &verts);
            }   

            Using the previously stored position and dimensions, the windows are constructed
            as shown in Figure 16.7.

             

            cTextWindow::render

            Render merely sets the required rendering states and
            draws the required polygons that form the pointer and text window. Then it draws
            the text string (if the window height is greater than 12, which is the size of the
            border used to surround the smaller frontmost window).

            void cTextWindow::render(pcstr text, D3DCOLOR text_color)
            {
                
            if(m_font == NULL)
                    
            return;

                g_d3d_device->SetTexture(0, NULL);
                disable_zbuffer();

                render_vertex_buffer(m_vb, 0, 2, D3DPT_TRIANGLESTRIP);
                render_vertex_buffer(m_vb, 4, 2, D3DPT_TRIANGLESTRIP);

                
            if(m_draw_target)
                    render_vertex_buffer(m_vb, 8, 1, D3DPT_TRIANGLELIST);

                
            if(m_height > 12)
                {
                    
            if(text == NULL)
                        draw_font(m_font, m_text, m_x_pos+6, m_y_pos+6, m_width-12, m_height-12, m_text_color, DT_WORDBREAK);
                    
            else
                        draw_font(m_font, text, m_x_pos+6, m_y_pos+6, m_width-12, m_height-12, text_color, DT_WORDBREAK);
                }
            }

            Render takes two optional arguments. The first argument, Text, overrides the class’s
            text that was already set using the SetText function. Overriding the text to draw is
            great for dynamically updating what needs to be shown. The second argument,
            Color, specifies the color you want to use to draw the text to the display.


            posted on 2007-11-14 19:00 lovedday 閱讀(248) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久婷婷人人澡人人爽人人爱| 91麻豆国产精品91久久久| 久久伊人五月丁香狠狠色| 久久久久亚洲AV无码永不| 久久亚洲中文字幕精品有坂深雪| 久久婷婷五月综合色高清| 亚洲狠狠婷婷综合久久久久| 99999久久久久久亚洲| 国产一区二区三精品久久久无广告| 一本久久综合亚洲鲁鲁五月天| 亚洲日本va中文字幕久久| 国内精品久久久久影院免费| 久久强奷乱码老熟女| …久久精品99久久香蕉国产| 久久久黄片| 69国产成人综合久久精品| 人人狠狠综合88综合久久| 国产亚洲综合久久系列| 久久99九九国产免费看小说| 久久激情五月丁香伊人| av色综合久久天堂av色综合在| 久久久久久亚洲精品不卡| 少妇精品久久久一区二区三区| 亚洲天堂久久久| 88久久精品无码一区二区毛片 | 久久高清一级毛片| www.久久精品| 久久精品aⅴ无码中文字字幕不卡| 久久99久久成人免费播放| 成人久久精品一区二区三区| 久久丫忘忧草产品| 亚洲国产精品一区二区三区久久| 国产精品伊人久久伊人电影 | 色偷偷偷久久伊人大杳蕉| 久久乐国产精品亚洲综合 | 亚洲日本久久久午夜精品| 久久亚洲色一区二区三区| 久久精品国产福利国产秒| 精品无码久久久久久尤物| 久久久精品免费国产四虎| 久久久国产乱子伦精品作者|