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

天行健 君子當(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>
            在线播放中文字幕一区| 中文日韩电影网站| 美女国产精品| 另类国产ts人妖高潮视频| 原创国产精品91| 欧美18av| 欧美日韩一区成人| 欧美在线视频播放| 久久久久久久综合| 亚洲靠逼com| 99re6这里只有精品| 国产精品亚洲一区| 美女日韩欧美| 欧美日韩国产大片| 欧美一区国产二区| 久久亚洲国产成人| 正在播放亚洲| 校园激情久久| 99国产精品99久久久久久粉嫩| 日韩视频一区| 国产在线精品成人一区二区三区| 久久综合久久综合这里只有精品| 欧美a级理论片| 一区二区三区免费网站| 亚洲综合视频网| 亚洲高清久久网| 亚洲视频欧美在线| 亚洲第一视频| 亚洲女人av| 亚洲精品在线三区| 欧美在线日韩精品| 一区二区高清视频| 久久免费精品视频| 欧美在线播放高清精品| 欧美成人精品三级在线观看 | 欧美日韩成人综合| 久久久精品一品道一区| 欧美日韩人人澡狠狠躁视频| 久久天天综合| 国产欧美日韩专区发布| 亚洲激情视频网| 狠狠狠色丁香婷婷综合久久五月 | 亚洲国产高清一区| 国产亚洲一区二区三区| 一本久久综合亚洲鲁鲁| 亚洲靠逼com| 久久亚洲高清| 狼狼综合久久久久综合网| 国产精品劲爆视频| 日韩亚洲精品视频| 亚洲理论在线| 欧美大片在线看| 蜜月aⅴ免费一区二区三区| 国产乱码精品| 亚洲性色视频| 亚洲免费中文| 国产精品草草| 亚洲视频一区二区| 亚洲视频在线播放| 欧美视频中文一区二区三区在线观看| 亚洲国产mv| 亚洲精品乱码久久久久久蜜桃91| 久久久www成人免费精品| 久久成人这里只有精品| 国产女精品视频网站免费| 一本色道久久加勒比精品| 亚洲天堂第二页| 国产精品hd| 国产精品99久久不卡二区| 亚洲欧美日韩国产综合| 国产精品欧美精品| 午夜视频在线观看一区二区| 久久国产精品久久w女人spa| 国产欧美一区二区精品仙草咪| 亚洲免费视频中文字幕| 欧美综合国产精品久久丁香| 国产精品尤物| 久久黄色影院| 亚洲黄色成人| 亚洲图片你懂的| 国产日韩欧美在线看| 欧美在线亚洲在线| 欧美成人精品在线观看| 日韩亚洲欧美成人一区| 国产精品乱码| 久久久久久亚洲精品不卡4k岛国| 欧美成人69av| 亚洲视频观看| 国产香蕉久久精品综合网| 久久中文字幕一区二区三区| 亚洲欧洲日产国产网站| 亚洲欧美国产日韩天堂区| 国产亚洲精品久久久久久| 欧美不卡在线| 亚洲一区在线观看视频| 欧美成人一区二区三区| 亚洲自拍三区| 一区三区视频| 国产精品欧美一区二区三区奶水 | 免费一级欧美片在线播放| 99视频一区二区三区| 欧美天天视频| 老牛影视一区二区三区| 亚洲无人区一区| 欧美高清不卡| 久久av最新网址| 亚洲精品乱码久久久久久蜜桃91 | 欧美激情第五页| 性欧美xxxx大乳国产app| 欧美激情无毛| 欧美在线视频全部完| 91久久久精品| 国产一区二区三区精品久久久| 欧美激情综合网| 久久国产精品网站| 一区二区欧美亚洲| 亚洲二区三区四区| 久久综合狠狠综合久久综合88| 一区二区三区毛片| 亚洲激情av在线| 国产一区视频观看| 国产精品久久国产愉拍| 欧美激情国产日韩| 久热精品在线视频| 欧美一级久久久久久久大片| 夜夜爽www精品| 日韩天堂在线观看| 亚洲欧洲日本国产| 欧美福利一区二区| 噜噜噜噜噜久久久久久91 | 亚洲午夜精品网| 日韩亚洲欧美一区| 亚洲高清不卡一区| 亚洲二区精品| 激情亚洲成人| 亚洲第一天堂av| 一区二区三区在线看| 狠狠色2019综合网| 黄色一区二区在线观看| 黑丝一区二区三区| 狠狠综合久久av一区二区老牛| 国产精品一区三区| 国产欧美在线观看一区| 国产精品一卡| 国产女优一区| 国产一区视频观看| 精品999网站| 亚洲国产老妈| 亚洲伦理网站| 亚洲天堂av在线免费| 亚洲午夜久久久| 午夜精品久久一牛影视| 欧美一区二区三区日韩| 欧美在线视频全部完| 久久免费视频一区| 久热精品视频在线免费观看 | 亚洲欧美日韩中文播放| 亚洲尤物在线视频观看| 亚洲欧美日本另类| 久久精品免费观看| 免费日韩成人| 99精品欧美一区二区蜜桃免费| 99国产精品国产精品久久| 亚洲视频www| 欧美在线看片| 欧美黄在线观看| 欧美午夜久久| 黄色成人在线| 亚洲精品久久久久久久久久久| 99日韩精品| 久久精品成人一区二区三区 | 一区二区三区黄色| 亚洲欧美一级二级三级| 久久综合色综合88| 亚洲乱码精品一二三四区日韩在线 | 亚洲国产99| 亚洲免费在线精品一区| 美日韩丰满少妇在线观看| 亚洲精品色图| 欧美在线免费观看| 欧美日韩二区三区| 狠狠色丁香久久婷婷综合_中| 亚洲精品视频在线看| 午夜在线精品偷拍| 亚洲第一综合天堂另类专| 亚洲欧美韩国| 欧美了一区在线观看| 国产婷婷色一区二区三区四区| 亚洲破处大片| 久久精品国产精品亚洲精品| 亚洲激情网站| 久久成人精品视频| 国产精品乱码久久久久久| 亚洲国产美国国产综合一区二区 | 黑人巨大精品欧美一区二区| 亚洲在线成人精品| 欧美激情免费观看| 久久国产综合精品| 国产精品美女999| 一本一本久久a久久精品综合妖精|