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

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
給BGE加上了富文本顯示功能
相關代碼如下:
void GLTextRenderer::render(const Color& color,const String& string,const FloatRect& area,bool isMultiLine,
        Horizontal hAlignment,Vertical vAlignment,
bool rich)
{
    
if(typeFace_ != 0 && !rich)
    {
        typeFace_
->setColor(color);
        
if(isMultiLine)
        {
            renderMultiline(color,
string,area,hAlignment);
        }
        
else
        {
            Vector2f position(typeFace_
->penX(string,area,hAlignment),baseLineY(area,vAlignment));
            typeFace_
->render(string,position);
        }
    }
    
else if(typeFace_)
    {
        
if(!isMultiLine)
        {
            auto cmdlist 
= parseString(string);
            Vector2f position(typeFace_
->penX(string,area,hAlignment),baseLineY(area,vAlignment));
            typeFace_
->render(String(),position,cmdlist);
        }
        
else
        {
            auto cmdlist 
= parseString(string);
            renderMultiline(color,cmdlist,area,hAlignment);
        }
    }
}
這里的parseString用于解析類似html的問題
函數實現如下:
std::list<textRenderCmdUnit> TextRenderer::parseString(const String& content)
{
    String text(content);
    std::list
<textRenderCmdUnit> cmdList;

    String current;
    auto list 
= text.split('<');
    
for(int i=0;i<list.size();i++)
    {
        current 
= list[i];
        
if(current.startWith(L"/>"))
        {
            textRenderCmdUnit unit;
            unit.undo 
= true;
            cmdList.push_back(unit);

            String remain 
= current.substr(2);
            
if(!remain.empty())
            {
                unit.text 
= remain;
                unit.undo 
= false;
                cmdList.push_back(unit);
            }
        }
        
else if(current.find('>'!= String::InvalidPos)
        {
            textRenderCmdUnit unit;
            unit.tag 
= current.substr(0,current.find('>'));
            unit.undo 
= false;
            cmdList.push_back(unit);

            int32_t find 
= current.find('>');
            
if(find < current.size()-1)
            {
                unit.tag.clear();
                unit.text 
= current.substr(find+1);
                cmdList.push_back(unit);
            }
        }
        
else
        {
            textRenderCmdUnit unit;
            unit.text 
= current;
            unit.undo 
= false;
            cmdList.push_back(unit);
        }
    }

    
return cmdList;
}
以下用于渲染富文本

void TypeFace::render(const FloatRect& area,const std::list<textRenderCmdUnit>& queue,Horizontal hAlignment,float vpos)
{
    
const float availableWidth = area.width_ - 2.0f;

    textRenderCmdUnit unit;

    String line,lineRemain;

    String tag;
    std::queue
<String> cmdStack;

    
float y = vpos;
    
float x = penX(String(),area,hAlignment);

    auto itr 
= queue.begin();
    
while(itr != queue.end())
    {
        unit 
= *itr;
        
if(unit.undo)
        {
            
if(!cmdStack.empty())
            {
                tag 
= cmdStack.front();
                cmdStack.pop();

                
if(tag == "bold")
                    bold_ 
= false;
                
else if(tag == "italic")
                    italic_ 
= false;
                
else if(tag == "underline")
                    underline_ 
= false;
                
else
                    applyColor(tag);
            }
        }
        
else if(!unit.tag.empty())
        {
            tag 
= unit.tag;
            cmdStack.push(tag);

            
if(tag == "bold")
                bold_ 
= true;
            
else if(tag == "italic")
                italic_ 
= true;
            
else if(tag == "underline")
                underline_ 
= true;
            
else
                applyColor(tag);
        }
        
else
        {
            line 
+= unit.text;

            
while(true)
            {
                size_t pos 
= hitCharacterIndex(line,availableWidth-x);
                
if(pos == 0)
                {
                    x 
= penX(String(),area,hAlignment);
                    y 
+= lineHeight();
                    
continue;
                }

                
if(pos == String::InvalidPos)
                    pos 
= line.size();

                String current 
= line.substr(0,pos);
                lineRemain 
= line.substr(pos);
                line 
= current;

                auto linefeed 
= line.get().find_first_of('\n');
                
if(linefeed != std::basic_string<uint32_t>::npos)
                {
                    line 
= line.substr(0,linefeed);
                    lineRemain 
= line.substr(linefeed+1+ lineRemain;
                }

                render(line,Vector2f(x,y),std::list
<textRenderCmdUnit>());
                x 
+= width(line);

                
if(linefeed != String::InvalidPos)
                {
                    x 
= penX(String(),area,hAlignment);
                    y 
+= lineHeight();
                }
                line 
= lineRemain;

                
if(lineRemain.empty())
                    
break;
            }
        }
        itr 
++;
    }
}
以下渲染單色文本
void TypeFace::renderGlyphs(const std::list<textRenderCmdUnit>& cmd)
{
    Vector2f position(
0.0f,0.0f);
    size_t leftChar 
= 0;

    textRenderCmdUnit unit;

    String tag;
    std::queue
<String> cmdStack;

    std::list
<textRenderCmdUnit>::const_iterator itr = cmd.begin();
    
while(itr != cmd.end())
    {
        unit 
= *itr;
        
if(unit.tag.empty() && !unit.undo)
        {
            position 
= renderGlyphs(unit.text,position);
        }
        
else if(!unit.tag.empty())
        {
            tag 
= unit.tag;
            cmdStack.push(tag);

            
if(tag == "bold")
                bold_ 
= true;
            
else if(tag == "italic")
                italic_ 
= true;
            
else if(tag == "underline")
                underline_ 
= true;
            
else
                applyColor(tag);
        }
        
else if(unit.undo)
        {
            
if(!cmdStack.empty())
            {
                tag 
= cmdStack.front();
                cmdStack.pop();

                
if(tag == "bold")
                    bold_ 
= false;
                
else if(tag == "italic")
                    italic_ 
= false;
                
else if(tag == "underline")
                    underline_ 
= false;
                
else
                    applyColor(tag);
            }
        }

        itr 
++;
    }
}
可以看出 支持的文本格式為<Tag>Text</>
一個例子是:
<Blue>這段代碼主要測試BGE的富文本顯示功能\n</Blue><Red>需要指出的是當前只要能支持多行顯示和多顏色顯示功能即可(不考慮下劃線斜體以及加粗顯示)。</Red><White>這句話將被顯示為白色</><Blue>這句話應該被藍色字體</Blue><Green>綠色字體</><Cyan>Cyan色</>";
最終顯示如下:
posted on 2016-02-22 17:46 ccsdu2009 閱讀(805) 評論(0)  編輯 收藏 引用 所屬分類: Game引擎設計模式
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美α欧美αv大片| 国产一区二区| 中文高清一区| 欧美成人午夜77777| 久久免费偷拍视频| 欧美在线高清视频| 亚洲欧美日韩国产另类专区| 一区二区三区精密机械公司 | aa级大片欧美| 久久欧美肥婆一二区| 欧美伊人久久| 久久久久成人网| 久久精品国产欧美亚洲人人爽| 亚洲一区二区不卡免费| 亚洲图片在线| 亚洲欧美综合精品久久成人| 亚洲一区高清| 久久riav二区三区| 久久综合免费视频影院| 亚洲视频 欧洲视频| 亚洲深夜影院| 欧美亚洲一区在线| 麻豆乱码国产一区二区三区| 欧美成人激情在线| 亚洲国产一区在线观看| 日韩视频在线一区二区| 亚洲午夜国产一区99re久久| 欧美一级免费视频| 久久久久一区| 欧美精品系列| 国产精品卡一卡二| 激情欧美一区二区三区在线观看| 国产精品美女午夜av| 国产欧亚日韩视频| 亚洲激情在线播放| 91久久久久久久久久久久久| 亚洲午夜精品久久久久久app| 香蕉久久国产| 亚洲综合色噜噜狠狠| 久久精品二区| 亚洲国产日韩在线一区模特| 亚洲欧洲精品一区二区| 欧美伊人久久久久久久久影院| 蜜桃av噜噜一区| 国产精品婷婷| 激情婷婷亚洲| 亚洲综合精品自拍| 欧美高清免费| 午夜视频精品| 亚洲激情影院| 欧美中日韩免费视频| 国产精品久久久久久久电影| 夜夜精品视频| 日韩天天综合| 欧美日韩直播| 亚洲欧美国产不卡| 中文亚洲欧美| 国产精品视频久久久| 亚洲欧美日本精品| 一本色道久久99精品综合| 欧美激情一区二区三区在线视频观看 | 欧美一级播放| 日韩亚洲国产精品| 欧美日韩精品国产| 亚洲精品自在久久| 亚洲国产精品一区二区久| 牛牛国产精品| 一本到高清视频免费精品| 日韩视频在线观看国产| 国产精品久99| 久久久久九九视频| 久久综合伊人| 夜夜爽av福利精品导航| 在线中文字幕一区| 欧美顶级艳妇交换群宴| 亚洲精品日韩在线观看| 亚洲精品久久久一区二区三区| 欧美久久久久久久久久| 午夜视频一区在线观看| 久久精品日产第一区二区三区| 狠狠入ady亚洲精品经典电影| 狂野欧美一区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲激情午夜| 中文一区在线| 精品av久久707| 99v久久综合狠狠综合久久| 国产欧美亚洲一区| 欧美gay视频激情| 欧美日韩亚洲不卡| 久久免费视频在线| 欧美剧在线免费观看网站| 久久精品国产亚洲精品| 欧美二区在线观看| 久久国产66| 欧美福利电影网| 欧美一区二区精品久久911| 另类亚洲自拍| 亚洲最新在线视频| 久久欧美中文字幕| 亚洲欧美日韩成人高清在线一区| 久久精品国产99国产精品澳门| 亚洲免费不卡| 久久久精品tv| 先锋a资源在线看亚洲| 久久麻豆一区二区| 午夜一区二区三视频在线观看| 另类激情亚洲| 久久久国产精品亚洲一区| 欧美精品一区二区三| 美女主播精品视频一二三四| 国产精品电影在线观看| 亚洲高清成人| 在线视频国产日韩| 欧美一区二区播放| 香蕉久久夜色精品国产使用方法| 免费日韩成人| 免费日韩视频| 狠狠入ady亚洲精品| 亚洲专区国产精品| 亚洲欧美视频| 国产精品嫩草99a| 欧美成人免费全部| 国产午夜精品一区理论片飘花| 亚洲国产成人午夜在线一区| 亚洲第一中文字幕| 国产精品美女诱惑| 国产精品久久久久免费a∨大胸 | 国产精品国产亚洲精品看不卡15| 久久裸体艺术| 欧美国产极速在线| 麻豆视频一区二区| 久久久av水蜜桃| 亚洲天堂久久| 欧美电影在线观看| 欧美黄免费看| 久久久久久亚洲精品中文字幕| 亚洲美女在线观看| 欧美在线视频一区| 欧美激情一区二区三区在线视频观看 | 欧美国产一区二区三区激情无套| 久久人人超碰| 国产综合精品| 久久久久久久久久久成人| 久久综合久久综合久久综合| 激情欧美一区| 毛片基地黄久久久久久天堂| 你懂的视频一区二区| 亚洲高清av| 欧美屁股在线| 亚洲免费一在线| 久久久噜噜噜久久中文字免| 在线观看亚洲精品| 欧美国产日韩免费| 这里只有精品电影| 欧美在线日韩| 亚洲人成高清| 国产精品男女猛烈高潮激情 | 久久久午夜视频| 欧美成人69av| 国产精品久久久久7777婷婷| 久久五月婷婷丁香社区| 伊大人香蕉综合8在线视| 久久精品夜夜夜夜久久| 欧美成人高清| 一区二区三区欧美日韩| 国产精品亚洲人在线观看| 久久精品人人| 亚洲日本中文字幕| 香蕉国产精品偷在线观看不卡 | 久久久噜噜噜久久中文字免| 亚洲激情av| 久久国产日韩| 亚洲另类春色国产| 国产日韩精品视频一区| 欧美激情小视频| 欧美一区国产一区| 亚洲国产综合在线| 欧美一区亚洲二区| 99在线热播精品免费99热| 国产精品电影网站| 亚洲一卡久久| 久久亚洲精品网站| 久久婷婷国产综合精品青草| 亚洲国产成人高清精品| 欧美午夜国产| 欧美r片在线| 亚洲免费综合| 欧美综合第一页| 裸体丰满少妇做受久久99精品| 欧美一区免费视频| 日韩午夜电影在线观看| 黄色成人在线免费| 亚洲国产精品久久91精品| 欧美成人嫩草网站| 狠狠色伊人亚洲综合成人| 国产日韩欧美中文| 男同欧美伦乱| 久久国产精品72免费观看| 99国产精品视频免费观看一公开|