[✔️] cocos2dx RichText bug

简介: [✔️] cocos2dx RichText bug

image.png


image.png


如上图所示,根据xml的结构,2349应该是相同的字号,而cocos2dx的渲染结果却是不同的size


解决办法:


  1. 在解析xml的时候,font空attribute自动删除


  1. engine支持空font标签,空属性的font标签也需要push,我采用的是这个方式解决的

我使用的是cocos2dx 3.17,但是这个bug应该在4.x中同样存在


如果删除empty的判断,是解决了空tag的问题,但是又产生了其他问题,下面的xml渲染出来的文字是黄色的


<font color="#ffff00">
    <br/>
</font>
<font>
    white
</font>


导致这个问题的本质上还是无法正确区分标签空属性非字体属性标签


MyXMLVisitor::setTagDescription("br", false, [](const ValueMap& /*tagAttrValueMap*/) {
    RichElementNewLine* richElement = RichElementNewLine::create(0, Color3B::WHITE, 255);
    return make_pair(ValueMap(), richElement);
});


std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型,它的定义形式如下:


template <class T1, class T2> struct pair;


这里的make_pair第一个参数,预期返回nullptr会好点,因为强数据类型的原因,无法返回nullptr


typedef std::unordered_map<std::string, Value> ValueMap; // 无序列表
typedef std::function<std::pair<ValueMap, RichElement*>(const ValueMap& tagAttrValueMap)> VisitEnterHandler;
void setTagDescription(const std::string& tag, bool isFontElement, RichText::VisitEnterHandler handleVisitEnter);


void MyXMLVisitor::startElement(void* /*ctx*/, const char* elementName, const char** atts){
    auto result = tagBehavior.handleVisitEnter(tagAttrValueMap);
    ValueMap& attrValueMap = result.first;
    RichElement* richElement = result.second;
}


我们发现凡是返回ValueMap()的都不是fontElement,正好和setTagDescription的第二个参数isFontElement呼应,也和endElement逻辑是对应的


void MyXMLVisitor::endElement(void* /*ctx*/, const char* elementName)
{
    auto it = _tagTables.find(elementName);
    if (it != _tagTables.end()) {
        auto tagBehavior = it->second;
        if (tagBehavior.isFontElement) {
            popBackFontElement();
        }
    }
}


具体的修复pr我提交到了官方仓库,虽然现在cocos2dx也很少有人维护了。

目录
相关文章
|
存储
[✔️] cocos2dx label 渲染原理分析
[✔️] cocos2dx label 渲染原理分析
141 0
|
存储
[✔️] cocos2dx label合批探讨
[✔️] cocos2dx label合批探讨
202 0
|
C++
[✔️]cocos creator shader 入门教程2:Material / Effect
[✔️]cocos creator shader 入门教程2:Material / Effect
320 0
|
JavaScript
[✔️]cocos creator shader 入门教程2:webgl动起来
[✔️]cocos creator shader 入门教程2:webgl动起来
243 0
|
算法 atlas
[✔️]cocos2x label ttf合批
[✔️]cocos2x label ttf合批
156 0
|
编解码 缓存 开发者
[✔️]cocos2dx中播视频的实现思路以及存在的问题
[✔️]cocos2dx中播视频的实现思路以及存在的问题
192 0
|
IDE 编译器 开发工具
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS1)
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS)
905 0
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS1)
|
C++ iOS开发 MacOS
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS2)
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS2)
928 0
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS2)
|
Web App开发 Dart 测试技术
|
前端开发 iOS开发
iOS Coding Style Guide 代码规范
前言 代码规范可以说是老生常谈的话题了, 也是程序员自我修养的一种体现, 虽然一套好的代码规范不能使程序运行的更加流畅, 不能使程序直接的影响到程序的功能执行,但是如果能再发开之前就能明确定义一套代码规范,并且严格的去执行,肯定能非常有效的提高代码阅读性,高的阅读性也使得后期开发,维护等事半功倍,上手难度降低,在新人加入进行也能更快的融入团队。
1093 0