在很多游戏中,人物对话是一个一个字的显示,如果点击可以一次显示完成,一般如何实现。如果采用读取UTF-8编码的方法如何实现逐帧显示字体,即一个一个字的出现。
一两句话不好说清楚,你去搜索一下 C++ 打字机 特效,看看能不能帮到你
cocos2d-x没这个功能吧,不考虑效率的话就是多一个字就重新setString
我大致看了一下,都是采用定时器的效果,我想采用读取UTF-8编码的形式实现逐帧显示
把字挡住,用schedule去掉遮盖?
我前段时间用的一个方法,嗯,可能不是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());
}
```