• <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>
            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 閱讀(774) 評論(0)  編輯 收藏 引用 所屬分類: Game引擎設計模式
             
            色成年激情久久综合| 亚洲午夜无码AV毛片久久| 久久综合给合久久狠狠狠97色69| 亚洲人成无码网站久久99热国产| 久久成人小视频| 精品999久久久久久中文字幕| 国产成人精品久久| 国内高清久久久久久| 99久久99这里只有免费费精品| 四虎国产永久免费久久| 一本色道久久88综合日韩精品 | 色综合久久综合中文综合网| 久久久精品无码专区不卡| 久久久久久青草大香综合精品| 色8久久人人97超碰香蕉987| 国产成人久久久精品二区三区 | 无码人妻少妇久久中文字幕 | 久久国产乱子伦精品免费强| 色欲综合久久躁天天躁| 99精品国产在热久久无毒不卡 | 色偷偷88欧美精品久久久| 国产日产久久高清欧美一区| 亚洲va中文字幕无码久久不卡| 久久久久这里只有精品| 国产精品久久久久aaaa| 无码AV波多野结衣久久| 亚洲精品国产综合久久一线| 国产精品欧美亚洲韩国日本久久| 狠狠色婷婷久久综合频道日韩| 久久久久久久国产免费看| 久久香蕉一级毛片| 国产成人精品久久二区二区| 奇米综合四色77777久久| 国内高清久久久久久| 亚洲一级Av无码毛片久久精品| 久久本道久久综合伊人| 亚洲精品美女久久久久99| 亚洲AⅤ优女AV综合久久久| 欧美成a人片免费看久久| 久久播电影网| 色综合久久88色综合天天 |