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

天行健 君子當(dā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 閱讀(254) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品小视频| 影音先锋另类| 亚洲午夜久久久久久尤物| 亚洲大片在线| 久久综合九色综合欧美就去吻 | 欧美日韩一区二区欧美激情| 极品少妇一区二区| 午夜一区二区三区在线观看| 亚洲一区黄色| 狠狠色噜噜狠狠色综合久| 久久久亚洲国产美女国产盗摄| 国产精品99久久久久久久久久久久| 亚洲理论在线观看| 亚洲国产欧美日韩| 国产精品久久国产三级国电话系列| 国产精品天天看| 久久久久成人精品| 久久综合精品国产一区二区三区| 欧美日韩精品三区| 欧美一区二区三区在线观看视频| 亚洲成人在线视频播放| 男女视频一区二区| 在线午夜精品自拍| 亚洲一区二区三区四区视频| 国产日韩一区欧美| 亚洲国产成人一区| 国产精品亚洲成人| 欧美国产视频在线观看| 国产精品久久久久毛片软件| 免费亚洲婷婷| 欧美三级特黄| 久热爱精品视频线路一| 欧美日韩国产区一| 玖玖视频精品| 欧美四级在线观看| 欧美成人官网二区| 国产精品地址| 亚洲福利专区| 久久久久国产精品厨房| 蜜桃av一区二区在线观看| 亚洲视频一区二区| 久久久久久9999| 小黄鸭精品aⅴ导航网站入口| 亚洲人成亚洲人成在线观看| 国产精品久久91| 亚洲国产另类 国产精品国产免费| 久久精品视频va| 亚洲综合激情| 欧美巨乳波霸| 欧美电影在线播放| 国内精品久久久久影院优| 亚洲美女91| 最近中文字幕mv在线一区二区三区四区| 久久久久免费视频| 国产精品久久久久aaaa| 亚洲人成毛片在线播放| 亚洲高清免费| 欧美自拍偷拍| 性8sex亚洲区入口| 国产精品久久九九| 在线一区亚洲| 亚洲视频在线一区观看| 欧美精彩视频一区二区三区| 免费中文日韩| 极品尤物一区二区三区| 欧美一级一区| 久久福利精品| 国产有码一区二区| 久久精品国产999大香线蕉| 久久国产精品久久国产精品| 国产精品免费网站在线观看| 亚洲先锋成人| 久久av红桃一区二区小说| 国产精品一二一区| 香蕉视频成人在线观看| 欧美在线观看一区二区三区| 国产精品一区在线观看你懂的| 久久久久一区二区三区| 国产亚洲网站| 久久久久久久97| 欧美国产免费| 一区二区三区 在线观看视| 欧美日韩www| 亚洲男人第一av网站| 香蕉成人伊视频在线观看| 国产午夜精品久久久久久久| 欧美影院精品一区| 欧美国产日韩一区二区三区| 亚洲激情在线| 国产精品av久久久久久麻豆网| 久久一区二区三区四区五区| 韩国一区电影| 欧美v日韩v国产v| 日韩视频欧美视频| 欧美在线观看日本一区| 在线播放中文字幕一区| 欧美精品成人| 性伦欧美刺激片在线观看| 久久综合色影院| 日韩视频专区| 国产亚洲精品高潮| 久久久国产午夜精品| 亚洲日本欧美| 久久久精品国产99久久精品芒果| 欧美激情1区| 亚洲欧美福利一区二区| 久久亚洲精选| 亚洲女人av| 亚洲国产一区在线| 国产精品爽黄69| 久久久久久久综合日本| 日韩一区二区高清| 久久免费午夜影院| 亚洲欧美成aⅴ人在线观看| 精品电影一区| 国产精品欧美一区喷水| 免费观看成人| 欧美影院午夜播放| 一本色道久久99精品综合| 欧美69视频| 香蕉尹人综合在线观看| 亚洲精品一区二区三区婷婷月| 久久综合狠狠综合久久综合88| 久久国产精品色婷婷| 亚洲图片自拍偷拍| 亚洲国产精品成人一区二区 | 亚洲深夜av| 欧美大胆人体视频| 久久精品在这里| 亚洲一区在线观看视频 | 欧美激情性爽国产精品17p| 午夜精品亚洲| 亚洲在线视频网站| 99v久久综合狠狠综合久久| 尤物在线精品| 国产综合网站| 国产精品美女久久久久久2018| 99精品热视频只有精品10| 欧美成人免费全部| 久久精品一本久久99精品| 亚洲综合视频一区| 亚洲午夜激情网页| 亚洲视频欧美在线| 99av国产精品欲麻豆| 亚洲第一久久影院| 亚洲福利久久| 亚洲国产精品一区二区www在线| 美女图片一区二区| 欧美成人dvd在线视频| 欧美中文日韩| 久久精品亚洲一区二区| 久久精品99国产精品酒店日本| 久久久99免费视频| 久久婷婷综合激情| 久久久久久久一区二区三区| 午夜精品久久久久久99热| 午夜亚洲性色福利视频| 欧美一区二区播放| 久久夜色精品| 女人香蕉久久**毛片精品| 欧美韩日视频| 亚洲国产综合在线| 99re热精品| 在线视频亚洲欧美| 午夜视频一区在线观看| 欧美中文在线字幕| 久久人人97超碰国产公开结果 | 亚洲精品久久嫩草网站秘色| 亚洲精品乱码久久久久久蜜桃91| 欧美午夜在线一二页| 国产美女精品免费电影| 伊人婷婷久久| 一二三四社区欧美黄| 欧美在线免费看| 欧美成人午夜剧场免费观看| 亚洲高清不卡在线| 亚洲视频在线二区| 久久精品一区二区三区四区| 欧美成熟视频| 国产欧美va欧美不卡在线| 国内成+人亚洲| 一本色道久久综合| 久久九九热免费视频| 欧美成人69av| 亚洲男人的天堂在线观看| 美女视频黄免费的久久| 欧美午夜理伦三级在线观看| 国产一区自拍视频| 亚洲视频欧美在线| 欧美国产日本高清在线| 亚洲影视中文字幕| 欧美精品一区二区三区在线播放| 久久精品电影| 欧美视频在线观看视频极品 | 一本色道久久加勒比精品| 久久久久国产精品一区三寸| 欧美午夜大胆人体| 亚洲国产精品激情在线观看| 欧美一区观看| 99精品欧美一区二区蜜桃免费|