如何实现对话时一个一个字的显示

在很多游戏中,人物对话是一个一个字的显示,如果点击可以一次显示完成,一般如何实现。如果采用读取UTF-8编码的方法如何实现逐帧显示字体,即一个一个字的出现。

一两句话不好说清楚,你去搜索一下 C++ 打字机 特效,看看能不能帮到你

cocos2d-x没这个功能吧,不考虑效率的话就是多一个字就重新setString

我大致看了一下,都是采用定时器的效果,我想采用读取UTF-8编码的形式实现逐帧显示

把字挡住,用schedule去掉遮盖?:14:

我前段时间用的一个方法,嗯,可能不是LZ说的“读取UTF-8编码的形式实现逐帧显示 ”的方法

test = parseUTF8(content);

std::vector GamePlotSummary::parseUTF8(const std::string &str)
{
    int l = str.length();

    std::vector ret;
    //  std::vector<std::string> ret;
    ret.clear();
    for(int p = 0; p < l; ) 
    {
        int size=0;
        unsigned char c = str;
        if(c < 0x80) {
            size = 1;
        }
        else if(c < 0xc2) 
        {
            size = 2;
        } 
        else if(c < 0xe0)
        {
            size = 2;
        } 
        else if(c < 0xf0)
        {
            size = 3;
        } 
        else if(c < 0xf8) 
        {
            size = 4;
        } 
        else if (c < 0xfc) 
        {
            size = 5;
        } 
        else if (c < 0xfe)
        {
            size = 6;
        }
        else
            size = 7;
        std::string temp = "";
        temp = str.substr(p, size);
        ret.push_back(temp);
        p += size;
        contentLength++;
    }
    return ret;
}

//截取UTF8字符串
std::string GamePlotSummary::subUTF8(const std::string &str,int from, int to)
{
    if(from > to) return "";

    if (test.size() < to) return str;

    std::vector::iterator iter=test.begin();
    std::string res;
    std::string result;
    for(iter=(test.begin() + from); iter != (test.begin() + to); iter++)
    {
        res += *iter;

    }
    return res;
}

void GamePlotSummary::updateStr(float cTime)
{
    if (wordCount > contentLength)
    {
        nextStepCallBack();
        this->unschedule(schedule_selector(GamePlotSummary::updateStr));
        return;  
    }

    wordCount++;
    pLabel->setString(subUTF8(content,0, wordCount).c_str()); 
}


```