守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1046|回复: 0

[技术资料] cocos2d-x 逐字出现功能

[复制链接]
  • TA的每日心情
    慵懒
    2015-4-16 10:25
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    18

    主题

    19

    帖子

    1284

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    威望
    11
    贡献
    0
    金币
    359
    钢镚
    20
    发表于 2015-1-14 17:28:12 | 显示全部楼层 |阅读模式
    本帖最后由 yaoyuan0701 于 2015-1-14 23:31 编辑
    1. <pre>/// 获取utf8字符长度
    2. int getUtf8Length( const char* pszutf8 )
    3. {
    4.     if( pszutf8 == NULL )
    5.     {
    6.         return 0;
    7.     }

    8.     for( int i = 8; i > 0; --i )
    9.     {
    10.         unsigned char c = 1 < < (i - 1);
    11.         if( ( pszutf8[0] & c ) != c )
    12.         {
    13.             if( i == 8 )
    14.             {
    15.                 return 1;
    16.             }
    17.             else
    18.             {
    19.                 return 8 - i;
    20.             }
    21.         }
    22.     }

    23.     return 1;
    24. }</pre>
    复制代码
    1. 加载
    2. <pre>void Main()
    3. {
    4.     std::string strSrc = "我在马路边";
    5.     if( strSrc.empty() )
    6.     {
    7.         return;
    8.     }
    9.     size_t size = strSrc.length();
    10.     for( size_t i = 0; i < size; )
    11.     {
    12.         const unsigned char c = strSrc.at(i);
    13.         int len = getUtf8Length((const char*)&c);

    14.         i += len;

    15.         std::string strTemp = strSrc.substr( 0, i );
    16.         printf("%s\n",strTemp.c_str());
    17.         
    18.     }
    19. }
    20. </pre>
    复制代码
    转载http://shadowkong.com/archives/1888
    但这个方法是通过for循环遍历来更新,速度肯定是有点快了,我在原作者的基础加入控制播放速度的功能。代码如下:
    getUtf8Length的方法不变。
    首先定义你的定时器
    1. this->schedule(schedule_selector(WelcomeLayer::labelUpdata), 1.0f); //1.0f就是你的频率 单位是秒
    复制代码
    1. int firstStr=0;
    2. void WelcomeLayer::labelUpdata(float dt)
    3. {
    4.     log("here");
    5.     std::string strSrc = "abcdefg";
    6.     if( strSrc.empty() )
    7.     {
    8.         return;
    9.     }
    10.     size_t size = strSrc.length();
    11.     if (size>firstStr)
    12.     {
    13.         const unsigned char c = strSrc.at(firstStr);
    14.         int len = getUtf8Length((const char*)&c);

    15.         firstStr += len;

    16.         std::string strTemp = strSrc.substr( 0, firstStr );
    17.         log("%s",strTemp.c_str());

    18.     }
    19.     else
    20.     {

    21.         this->unschedule(schedule_selector(WelcomeLayer::labelUpdata));//删除定时器
    22.         
    23.     }

    24. }
    复制代码
    是不是也很简单呢~~




    评分

    参与人数 1金币 +20 收起 理由
    破晓 + 20 赞一个!

    查看全部评分

    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2017-10-18 08:19 , Processed in 1.203125 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表