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

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>
            欧美日韩国产综合久久| 亚洲新中文字幕| 日韩午夜激情| 亚洲三级视频在线观看| 激情亚洲成人| 亚洲高清久久| 正在播放亚洲一区| 一区二区福利| 欧美一区二区三区四区视频| 欧美一区二区网站| 欧美第十八页| 一二三区精品| 久久久99爱| 欧美日韩亚洲一区二区三区| 国产精品日韩| 亚洲电影在线免费观看| 一区二区三区 在线观看视频| 亚洲一区黄色| 欧美国产丝袜视频| 亚洲午夜91| 欧美国产综合视频| 国产精品成人aaaaa网站| 国产亚洲精品久久久久婷婷瑜伽| 亚洲高清在线播放| 亚洲欧美日韩另类| 欧美成人日本| 亚洲欧美日韩在线观看a三区| 男女精品网站| 国产视频亚洲精品| 一区二区精品在线观看| 久久久久久久尹人综合网亚洲| 亚洲福利国产| 亚洲欧美日韩在线观看a三区| 欧美成ee人免费视频| 国产精品综合av一区二区国产馆| 在线日韩欧美视频| 欧美伊人精品成人久久综合97| 亚洲第一伊人| 久久精品国产一区二区三| 另类图片综合电影| 亚洲调教视频在线观看| 久久久综合激的五月天| 国产精品在线看| 亚洲午夜性刺激影院| 美国成人毛片| 久久九九精品99国产精品| 欧美视频中文一区二区三区在线观看 | 久久深夜福利| 国产日韩欧美自拍| 亚洲一区二区少妇| 亚洲激情视频在线观看| 久久国产天堂福利天堂| 国产精品羞羞答答| 亚洲永久免费精品| 亚洲午夜av电影| 国产精品久久久久久五月尺| 99国产精品久久久久久久久久 | 女女同性精品视频| 久久国产精品第一页| 国产乱码精品一区二区三区五月婷 | 亚洲精品字幕| 亚洲国产成人久久综合一区| 久久蜜臀精品av| 激情综合自拍| 欧美福利一区| 欧美激情精品久久久久| aa国产精品| 一本色道久久综合一区 | 亚洲国产精品日韩| 欧美成人精品三级在线观看 | 国产毛片精品国产一区二区三区| 亚洲一级在线| 亚洲午夜一级| 国产午夜久久久久| 另类av导航| 欧美国产成人精品| 亚洲午夜精品| 欧美在线免费观看| 亚洲国产一区二区三区在线播 | 国产一区导航| 免费中文日韩| 欧美日韩国产一区二区三区地区| 中文网丁香综合网| 亚洲欧美日韩中文视频| 久久久久久一区二区三区| 伊人久久大香线蕉综合热线| 美日韩精品免费| 欧美美女bbbb| 欧美自拍偷拍| 欧美国产一区二区| 亚洲一区二区视频在线| 亚洲欧美激情精品一区二区| 精品动漫3d一区二区三区免费版| 亚洲激情不卡| 国产亚洲欧美日韩精品| 亚洲国产成人精品视频| 国产欧美日韩亚洲一区二区三区| 看片网站欧美日韩| 欧美日韩在线看| 牛夜精品久久久久久久99黑人| 欧美人体xx| 麻豆成人小视频| 国产精品久久久久久影视| 美女脱光内衣内裤视频久久影院| 欧美日韩中国免费专区在线看| 久久久噜噜噜久久| 欧美日韩亚洲一区在线观看| 狂野欧美性猛交xxxx巴西| 欧美三级特黄| 91久久国产综合久久91精品网站| 国产一区欧美日韩| 亚洲视频免费在线| 99精品欧美一区二区三区综合在线| 亚洲尤物影院| 亚洲午夜极品| 欧美日韩喷水| 91久久一区二区| 亚洲激精日韩激精欧美精品| 欧美一区二区三区在线观看视频 | 欧美三级不卡| 亚洲国产高潮在线观看| 国产精品中文在线| 日韩一区二区精品视频| 一区二区三区在线视频播放| 亚洲男人的天堂在线观看 | 亚洲日本欧美天堂| 久久久国产精彩视频美女艺术照福利| 亚洲一二三区在线| 欧美日精品一区视频| 亚洲精品免费一区二区三区| 亚洲成色www8888| 久久久欧美精品| 麻豆精品网站| 1024亚洲| 美女脱光内衣内裤视频久久影院| 久久久久免费视频| 黑人巨大精品欧美一区二区小视频| 亚洲影音一区| 欧美在线在线| 国产亚洲欧美中文| 欧美伊人久久久久久午夜久久久久| 亚洲一区国产精品| 国产精品亚洲综合天堂夜夜| 亚洲一区二区成人| 久久国产精品一区二区| 国产欧美一级| 久久青草久久| 亚洲欧洲日本在线| 欧美日韩精品在线| 亚洲视频网站在线观看| 亚洲欧美日韩在线高清直播| 国产精品久久久久久久久久妞妞| 亚洲色图自拍| 久久成人精品视频| 一区国产精品| 欧美激情一区二区三区成人 | 久久久精品日韩| 尤物网精品视频| 欧美电影免费观看网站| 亚洲国内欧美| 亚洲欧美一区二区原创| 国产亚洲激情| 欧美电影美腿模特1979在线看| 99在线精品免费视频九九视| 亚洲欧美日韩另类| 激情六月婷婷综合| 欧美日本高清视频| 亚洲欧美日韩天堂一区二区| 免费成人av| 亚洲永久免费| 亚洲国产欧美不卡在线观看| 欧美视频一区二区在线观看| 欧美一区二区三区在线观看 | 99re在线精品| 久久视频国产精品免费视频在线| 亚洲电影在线播放| 国产精品久久二区二区| 久久久久久69| 亚洲无线视频| 亚洲第一网站免费视频| 欧美在线高清视频| 亚洲精品中文字幕有码专区| 国产日韩在线一区二区三区| 欧美a级一区| 久久精品av麻豆的观看方式| 日韩一级黄色av| 嫩草影视亚洲| 亚洲欧美日韩中文视频| 亚洲国产欧美精品| 国产午夜精品久久久久久免费视| 欧美久久一级| 男女av一区三区二区色多| 欧美制服第一页| 亚洲午夜av| 日韩一级在线| 亚洲精品久久久久中文字幕欢迎你 | 欧美在线观看视频在线| 亚洲精品在线一区二区| 欧美成人免费小视频| 久久久av水蜜桃|