cocos2dx吧 关注:10,996贴子:33,710
  • 7回复贴,共1

[求助帖]中文显示崩溃的问题

只看楼主收藏回复

这是一个游戏对话部分出现的bug(编译器Visual Stuidio 2019).用tinyxml读取utf-8编码的剧本, 以用TTF创建的Label显示, 每0.1秒更新字幕实现打字效果, 可以翻页。显示到某个特定的位置就会报如下错误, 具体由字体、文本内容、自然语言和代码决定

字体:
换个中文字体可能会改变引发bug的文本位置, 但不会消除bug
如果用arial, 虽然显示出来都是方块, 但是完全不会报错
文本内容:
如果移动或删除出bug的那一页的内容, 前者会移动、后者会延后bug发生的位置
自然语言:
日语和英语文本都没问题啊, 为啥一用中文就崩溃嘞?
代码:
1.如果直接删除setstring让字幕不去显示, 则没有bug;
2.在某处魔改一下代码, 增加setstring调用次数, 比如把
caption->setString(node->getContentByLength(wordCount));
改成
caption->setString(node->getContentByLength(wordCount));
caption->setString(node->getContentByLength(wordCount));
caption->setString(node->getContentByLength(wordCount));
则有一定概率一次运行内全程不引发bug;
3.如果每次翻页的时候显示地换一个新的label, bug延后。如果用setstring没有此效果;
4.换成ui::Text没有影响;
5.将每次的setstring改成手动换一个新label没有影响;
下面的分别是更新字幕和翻页的完整代码(由于是打字机效果, 布尔值loaded指示当前页是否已经打完)

//翻页
void Dialog::turn_page() {
loaded = false; //重置加载状态
if (index < talkList.size() - 1) ++index; //翻到下一页
wordCount = 0; //重置文字计数
以上, 折腾好几天了 希望各位大佬帮帮小白


IP属地:北京1楼2020-10-23 11:18回复
    ps:有时候出现的不是vertex这里的访问冲突,但是绝大部分时候都是这里报错


    IP属地:北京来自iPhone客户端3楼2020-10-23 11:59
    回复
      cocos版本4.0


      IP属地:北京4楼2020-10-23 15:16
      回复
        现在问题已经解决, 方法是在turn_page()中重新创建caption和speaker, 对应影响因素:代码的第3条。由于有两个label(caption&speaker), 之前只更新了caption, 后来发现speaker也会引发类似的bug, 将两者都更新即可解决问题。
        可以说, 其实在更新caption后报错的其实是speaker标签。顺便吐槽一下 如果这bug不是我的代码的问题, 希望label对中文的支持好亿点。
        修改后的turn_page()如下, 其中scene是创建Dialog时获取的指向当前场景的指针
        void Dialog::turn_page() {
        loaded = false;
        // 加入的部分
        caption->runAction(RemoveSelf::create());
        caption = Label::createWithTTF(labelConfig, "", TextHAlignment::LEFT, 0.8 * box->getContentSize().width);
        caption->setTag(15);
        caption->setColor(Color3B::WHITE);
        caption->setLocalZOrder(1.5);
        caption->setAnchorPoint(Vec2(0, 1));
        caption->setPosition(Vec2(box->getPosition().x - box->getContentSize().width * 0.45,
        box->getPosition().y + box->getContentSize().height * 0.2));
        scene->addChild(caption);
        speaker->runAction(RemoveSelf::create());
        speaker = Label::createWithTTF(labelConfig, "", TextHAlignment::LEFT, 0.8 * box->getContentSize().width);
        speaker->setTag(15);
        speaker->setColor(Color3B::WHITE);
        speaker->setLocalZOrder(1.5);
        speaker->setAnchorPoint(Vec2(0, 1));
        speaker->setPosition(box->getPosition().x - box->getContentSize().width * 0.5,
        box->getPosition().y + box->getContentSize().height * 0.6);
        scene->addChild(speaker);
        //
        if (index < talkList.size() - 1) ++index;
        wordCount = 0;
        if ((TalkNode*)talkList[index]->get_stageup()) stageup = true;
        }


        IP属地:北京5楼2020-10-24 16:45
        回复
          你好,这个问题是4.0独有的问题,主要是他的label,换回老版本可以解决问题,如果一定要用4.0,在官网论坛我有提这个问题,后面有网友给的解决方案


          IP属地:北京6楼2020-11-03 15:29
          收起回复