青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

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 閱讀(252) 評(píng)論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(lèi)(178)

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

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区在线免费观看视频| 欧美福利网址| 亚洲国产精品尤物yw在线观看 | 亚洲国产精品成人va在线观看| 久久亚洲综合网| 老司机精品视频一区二区三区| 久久精品视频亚洲| 你懂的国产精品| 亚洲激情视频| 亚洲在线视频| 久久婷婷国产综合精品青草| 欧美刺激性大交免费视频| 欧美精品亚洲| 国产色产综合色产在线视频| 精品动漫3d一区二区三区免费| 亚洲精品久久久久中文字幕欢迎你| 一二三区精品福利视频| 久久精品国产亚洲aⅴ| 亚洲电影成人| 亚洲综合日韩中文字幕v在线| 久久一本综合频道| 国产精品久久久久久久久久妞妞 | 亚洲免费视频一区二区| 久久久久.com| 欧美午夜女人视频在线| 激情久久中文字幕| 亚洲综合99| 亚洲国产精品久久精品怡红院| 亚洲影院高清在线| 欧美精品亚洲精品| 在线成人激情| 午夜精品福利一区二区蜜股av| 欧美成人高清| 日韩视频精品在线观看| 国产精品久久久久久久免费软件 | 久久精品99国产精品| 欧美女同视频| 在线观看欧美一区| 欧美在线关看| 99精品99| 欧美精品日韩一本| 亚洲国产免费| 毛片精品免费在线观看| 新片速递亚洲合集欧美合集 | 影音国产精品| 久久精品国产亚洲a| 亚洲免费高清视频| 欧美日韩1区2区| 亚洲欧洲一区二区在线播放| 久久久最新网址| 亚洲欧美国产视频| 国产精品羞羞答答| 亚洲欧美高清| 中日韩美女免费视频网址在线观看| 欧美精品国产| 最新中文字幕亚洲| 亚洲黄色成人| 欧美精品在线观看一区二区| 亚洲欧洲美洲综合色网| 久久久久这里只有精品| 亚洲欧美日韩中文视频| 国产精品久久久久久妇女6080 | 久久久xxx| 激情六月婷婷久久| 牛牛影视久久网| 久久永久免费| 亚洲青色在线| 亚洲麻豆国产自偷在线| 欧美日韩久久不卡| 亚洲视频第一页| 亚洲综合欧美| 伊人久久男人天堂| 亚洲高清在线| 欧美午夜剧场| 久久久久久电影| 久久阴道视频| 亚洲深夜福利| 欧美在线999| 在线视频国内自拍亚洲视频| 亚洲电影免费| 国产精品高清一区二区三区| 午夜精品婷婷| 久久人人97超碰精品888| 亚洲国产高清在线观看视频| 亚洲激情女人| 国产女人精品视频| 欧美va天堂在线| 国产精品高潮粉嫩av| 国产精品久久久久久一区二区三区| 国产精品欧美久久久久无广告| 香港久久久电影| 久久久久免费视频| 亚洲视频日本| 久久九九有精品国产23| 在线亚洲精品| 久久久久久夜| 午夜精品美女自拍福到在线| 久久深夜福利免费观看| 国产精品99久久久久久www| 久久电影一区| 亚洲一区二区毛片| 久久人人爽人人爽| 亚洲欧美精品一区| 久久性色av| 性欧美超级视频| 欧美精品激情| 欧美阿v一级看视频| 国产精品一区免费视频| 亚洲国产精品悠悠久久琪琪| 国产偷自视频区视频一区二区| 亚洲激情小视频| 在线观看国产精品淫| 亚洲欧美日韩在线不卡| 99视频一区二区| 麻豆精品一区二区综合av| 久久激情久久| 国产精品久久久久av免费| 欧美高潮视频| 狠狠色丁香婷综合久久| 亚洲综合社区| 午夜久久黄色| 国产精品久久久久婷婷| 日韩视频欧美视频| 亚洲免费电影在线观看| 美女视频网站黄色亚洲| 另类尿喷潮videofree| 国产一区美女| 欧美在线综合视频| 久久久99爱| 国产中文一区二区| 欧美在线视频全部完| 久久国产毛片| 国产日韩欧美三级| 欧美亚洲一区二区三区| 久久国产一二区| 国产日韩专区在线| 欧美在线观看天堂一区二区三区| 欧美一级成年大片在线观看| 欧美三日本三级少妇三99| 一区二区日韩免费看| 亚洲视频中文| 国产精品va在线播放| 国产精品99久久不卡二区| 亚洲欧美国产毛片在线| 国产精品一区免费在线观看| 亚洲在线电影| 久久女同互慰一区二区三区| 亚洲福利av| 欧美精品成人| 亚洲专区欧美专区| 久久久综合免费视频| 在线看视频不卡| 欧美激情亚洲国产| 一本色道久久99精品综合| 亚洲欧美日韩一区二区三区在线| 国产乱人伦精品一区二区| 亚洲视频在线观看视频| 亚洲一区二区av电影| 欧美一区永久视频免费观看| 国产一区二区0| 久久综合成人精品亚洲另类欧美| 欧美国产一区二区在线观看| 在线亚洲激情| 国产精品成人一区二区三区夜夜夜 | 久久国产一二区| 红桃视频一区| 免费观看欧美在线视频的网站| 91久久久久久| 久久大逼视频| 日韩一级黄色大片| 国产午夜精品一区理论片飘花| 欧美aⅴ99久久黑人专区| 亚洲一区二区在线播放| 欧美高清视频一区二区| 亚洲欧美日韩区| 亚洲日韩第九十九页| 国产精品一级| 欧美精品午夜| 欧美大片网址| 国产欧美精品| 欧美一级在线视频| 欧美福利电影网| 亚洲国产婷婷香蕉久久久久久| 亚洲国产高清在线| 亚洲免费观看| 国产欧美在线| 欧美另类人妖| 女生裸体视频一区二区三区| 亚洲精品美女在线观看播放| 久久精品三级| 亚洲一区二区三区精品视频| 国产欧美日韩一区二区三区在线观看 | 午夜激情久久久| 亚洲第一精品福利| 欧美一区二区三区在线免费观看| 亚洲娇小video精品| 国产亚洲人成a一在线v站| 国产精品v日韩精品v欧美精品网站| 久久在线免费| 久久久久久国产精品一区|