位置: 编程技术 - 正文

cocos2d-x改底层之RichText富文本换行(cocos2d-x教程)

编辑:rootadmin

推荐整理分享cocos2d-x改底层之RichText富文本换行(cocos2d-x教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos2d怎么用,cocos2d怎么用,cocos2djs,cocos2djs,cocos2djs,cocos2d怎么样,cocos2dx4.0教程,cocos2d怎么样,内容如对您有帮助,希望把文章链接给更多的朋友!

关于字符编码的知识,请参考前辈的博客:字符串和编码&#;式

这里使用的是cocos2dx的2.2.3版本,底层的RictText换行机制不能满足中文换行,需要改动。由于在3.x的版本已经优化了,而且以后的项目也会转到3.x的版本,所以这里只是做一个记录,对底层换行机制的思想做一个分析,仅供学习用。

cocos2d-x改底层之RichText富文本换行(cocos2d-x教程)

RichText的换行原理:

以文本换行为例(图片同样的道理),先用一个不带换行的label,算出该label的总长度L,然后和程序设定的宽w比较,w<L则一行足以,否则按w在L中比例来截取原字符串,作为第一行,剩余部分递归处理。看代码:

[cpp] view plaincopy<span style="font-size:px;">void RichText::handleTextRenderer(const char *text, const char *fontName, float fontSize, const ccColor3B &color, GLubyte opacity) { /* 不换行时的label */ CCLabelTTF* textRenderer = CCLabelTTF::create(text, fontName, fontSize); /* 不换行时的label宽度 */ float textRendererWidth = textRenderer->getContentSize().width; /* 用设定的大小 - label宽度 */ _leftSpaceWidth -= textRendererWidth; if (_leftSpaceWidth < 0.0f) { /* 需要换行,则需要按比例截取原字符串:先计算超出的宽度所占的比例 */ float overstepPercent = (-_leftSpaceWidth) / textRendererWidth; std::string curText = text; /* 计算字符串的长度 */ int stringLength = curText.length(); /* 1-超出比例 = 当前(设定宽度所占比) 来截取字符串 */ int leftLength = stringLength * (1.0f - overstepPercent); /* 使用stl标准库的string函数截取字串 */ std::string leftWords = curText.substr(0, leftLength); std::string cutWords = curText.substr(leftLength, curText.length()-1); /* 字符串不为空,则绘制第一行label */ if (leftLength > 0) { CCLabelTTF* leftRenderer = CCLabelTTF::create(leftWords.substr(0, leftLength).c_str(), fontName, fontSize); leftRenderer->setColor(color); leftRenderer->setOpacity(opacity); pushToContainer(leftRenderer); } /* 开启新的一行,并作递归处理 */ addNewLine(); handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity); } else { textRenderer->setColor(color); textRenderer->setOpacity(opacity); pushToContainer(textRenderer); }</span> 这里的重点是截取字串的方式,自带的substr不能很好的处理多字节字符的截取,中文会出现乱码,所以用自己写的函数实现,这个函数在网上能找到,但仍然有问题,我做了一些修改,将原来的substr改为自定义的“utf8_substr”函数:[cpp] view plaincopy<span style="font-size:px;">/*参数如下: *str:原字符串 *start:截串的起始位置(起始位置未必准确,通过判断调整) *leng:截取的长度(同样长度未必准确) */ static std::string utf8_substr(const std::string& str, unsigned long start, unsigned long leng) { if (leng==0) { return ""; } unsigned long c, i, strLen, minIdx=std::string::npos, actualLength=std::string::npos; //有效(不乱码)的起始位置和有效原的截取长度与参数有偏移差 long startOffset,lenOffset; for (i=0, strLen=str.length(); i <= strLen; i&#;&#;) { //i 按照字符所占的字节数做跳转的,utf-8中文字符时 i 的&#;0 3 6 9..... if (i <= start) { minIdx = i; //保证最小索引在一个字符的初始字节上(中文字符有3个字节,这里指第一个字节) startOffset = start - minIdx; } if (i <= start&#;leng) { lenOffset = start&#;leng - i; actualLength = leng &#; abs(startOffset) - abs(lenOffset); //多余的字节放到下一段处理 } /* 于所有字符的编码表中的范围做判断,该字符占几个字节 */ c = (unsigned char) str[i]; if (c<=) i&#;=0; else if ((c & 0xE0) == 0xC0) i&#;=1; else if ((c & 0xF0) == 0xE0) i&#;=2; else if ((c & 0xF8) == 0xF0) i&#;=3; else return "";//invalid utf8 } if (minIdx==std::string::npos || actualLength==std::string::npos) { return ""; } //CCLOG(" result = %s",str.substr(minIdx,actualLength).c_str()); return str.substr(minIdx,actualLength); } </span> 字符编码表:

Unicode符号范围 | UTF-8编码方式(十六进制) | (二进制)--------------------&#;--------------------------------------------- - F | 0xxxxxxx - FF | xxxxx xxxxxx - FFFF | xxxx xxxxxx xxxxxx - FFFF | xxx xxxxxx xxxxxx xxxxxx

将上面的utf8_substr函数添加到RichText.cpp中,替换类中用到substr的地方即可。

cocos2d-x改底层之动态改变UIListView中的某项在链表中的位置 先看一下UIListView添加、插入、删除的机制,再来考虑如何移动某一项在链表中得位置。UIListView.h/*所有项用一个数组来保存*/CCArray*_items;voidListView::pushBac

quick cocos2dx lua 网络图片 下载 quickcoocs2d-x网络图片下载,自动更新纹理,保存url的md5作为标记。如果本地存在,直接读取本地。NetSprite.new(url):addTo(self):align(display.CENTER,0,0)

cocos2dx &#;混合模式 原文地址:

标签: cocos2d-x教程

本文链接地址:https://www.jiuchutong.com/biancheng/368374.html 转载请保留说明!

上一篇:cocos2d-x2.2.3和android平台环境的搭建

下一篇:第一个cocos2d程序的代码分析(cocos编程)

  • 城镇土地使用税减免税政策
  • 坏账损失核算的两种方法
  • 坏账准备应计入
  • 无形资产研发成功
  • 销项发票导出格式不对怎么办
  • 培训机构开发票不能开公司抬头吗
  • 挂靠别人公司怎么交税?
  • 外企缴纳社保
  • 企业的定期存款
  • 公司补贴怎样做分录?
  • 公司支付宝扣的钱去哪了
  • 个人所得税如果换公司怎么办
  • 事业单位职工福利费支出范围
  • 广告制作需要缴纳文化事业建设税吗?
  • 红字发票需要盖章子吗
  • 想要房贷利息抵税怎么办
  • 人力资源顾问公司有什么岗位
  • 加计扣除申报表填报说明
  • 外币投入资本不产生汇兑损益
  • tplink无线网卡驱动802.11n
  • 多发的工资可以从下月扣除吗
  • 微信php开发包
  • 会计中记账凭证复核是谁负责
  • php连接mysql查询数据
  • 集团内部调拨账务处理
  • form action target
  • 财政资金借款给企业
  • 蒙塔巴诺督查
  • php如何生成html
  • php实现计算百度百科
  • java pdf生成工具
  • 图像分类实战
  • 如何利用数据有效性制作单元格菜单
  • 农村扶贫入股分红会计分录
  • 个人所得税银行卡未实名认证是什么意思
  • 补交上年度的企业所得税税款计入什么科目
  • phpcms生成html
  • 禁止DedeCMS未审核文档支持动态浏览方法
  • sqlserver数据库锁表如何解锁
  • 无偿帮工造成财产损失谁赔偿 法院
  • 资产处置损益是当期损益吗
  • 电子发票的开具开具方式是?
  • 符合规定的国内旅客运输发票可以作为扣税凭证吗
  • 结汇的汇率差异怎么算
  • 广告发票能抵扣吗
  • 会计利润调增调减项目
  • 咨询企业发生的费用计入
  • 购买汽车后,需要缴纳的税种有哪些
  • 工资流水贷款需要什么手续
  • 库存退货怎么做账
  • 运费是属于什么会计科目
  • sql查询和遍历数据
  • drop table select
  • win7电脑一键关机快捷键
  • 如何确定我的学生学到了问题,尤其是核心素养方面
  • linux怎么修改
  • 7.0 Release i386 DVD iso 下载
  • u盘装系统系统资料会被泄露吗
  • windows8触摸板设置
  • windows xp输入法不见了怎么办
  • linux fdisk -l
  • centos7.6忘记密码了怎么办
  • win10系统开机后任务栏无响应怎么解决
  • 【Cocso2d-x Lua笔记五】quick中的display
  • dos启动方式
  • Node.js中的什么模块是用于处理文件和目录的
  • 你可能不知道的湖北
  • 工具类的作用
  • js拖动效果
  • jquery给表单赋值
  • 浏览器兼容性问题是什么意思
  • 税务备案超过15天
  • 怎么知道税控盘有没有注销
  • 怎么查询高速路封闭和开通
  • 税务执法资格考试
  • 怎样理解句子我还没弄清楚是怎么回事
  • 长春市医保社保什么时候年检
  • 城镇土地使用税暂行条例
  • 非关税壁垒英语翻译
  • 国税税票在哪里打印
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设