• <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引擎設計模式
             
            蜜桃麻豆www久久国产精品| 亚洲国产一成人久久精品| 91精品免费久久久久久久久| 91精品国产综合久久香蕉| 欧美久久一级内射wwwwww.| 久久精品国产99国产精品亚洲| 色偷偷偷久久伊人大杳蕉| 狠狠色丁香久久婷婷综| 区亚洲欧美一级久久精品亚洲精品成人网久久久久| 日韩电影久久久被窝网| 久久婷婷五月综合国产尤物app| 精品久久久久久无码专区不卡| 久久精品18| 久久精品aⅴ无码中文字字幕重口| 久久93精品国产91久久综合| 日日噜噜夜夜狠狠久久丁香五月| 久久AAAA片一区二区| 粉嫩小泬无遮挡久久久久久| 久久这里有精品视频| 久久国产精品-久久精品| 2021国内精品久久久久久影院| 久久精品国产精品青草app| 久久国产欧美日韩精品| 午夜精品久久久内射近拍高清| 国产精品18久久久久久vr| yy6080久久| 久久国产精品免费一区二区三区| 久久水蜜桃亚洲av无码精品麻豆| 久久亚洲电影| 久久99国产一区二区三区| 好久久免费视频高清| 99久久无码一区人妻a黑| 波多野结衣久久一区二区| 午夜精品久久久久久影视777| 久久99精品免费一区二区| 国产成人综合久久久久久| 久久免费视频网站| 国产99久久久国产精免费| 久久精品国产影库免费看| 伊人久久大香线蕉精品| 日韩精品久久久久久|