我对cocos2d-x的输入框已经忍了很久了,不,是对cocos2d-x的整个ui都忍了很久了。 不过没办法,人家也没义务为咱工作,能给你免费用就不错了,不能要求太高啊。
我抽了一些时间,对co2dx的输入框做了一些改进,我深知自己水平有限,做的不怎么样,但也将就着用了,为什么不好,我也放出来,就是为了以后骂cocos2d-x时,可以说,老子没白用。
cocos2d-x总共提供了2个可以输入的东西,一个是 CCTextFieldTTF, 一个是CCEditBox.
我们项目原来是用的 CursorTextField,从网上捞来的一个东西,是对CCTextFieldTTF的扩展,我估计很多人也是用的这个吧,网上好多文章都是这个。。。 这个东西提供了光标,输入时一闪一闪的,很诱惑,挺不错。 但是这个东西在处理输入的字符串超出显示范围时就出问题了。
这个问题得仔细说说。我们都知道,输入框一般不长,是不可能把所有输入的字符都显示出来的,那么问题来了,怎么让超出的部分消失那。 这个CursorTextField采用了截取字符串,估计大家都能想到,我也是最先想到这个方法,就是截去较早输入的字符,直到剩余的字符可以被完全显示。思路是对的,但是问题又来了,在utf8编码下,一个中文是3个大B, 一个英文是一个大B,如果输入全是英文,那是最简单的,从头一个个删,直到长度合适。 如果全部是中文,问题也不大,一次删除三个大B, 直到全部剩余字符串大小合适。 但是如果是中英文混合输入咋办那。。。
问题出在什么地方那?
//当有输入进来时响应
//@param pSender 发送事件对象
//@param text 输入内容
//@param 内容字节长度
bool CursorTextField::onTextFieldInsertText(cocos2d::CCTextFieldTTF *pSender, const char *text, int nLen)
当用户输入了“我cao”, 我们只知道用户输入了6个大B的字符(nLen 值为 6),你不知道用户是输入了一个中文加三个字母,还是输入了6个字母。 所以原作者记录了每次输入的字节数,当这次输入的字符超出时一起删除,挺暴力的,但是这个算法作者写的好像有点问题,很复杂,经常crash。就算算法没出错,可以正常运行,这个方法也不完美,那如果有人习惯一句话一起输入,那这句话就得一起删除,这个行为用户估计理解不了。
这里会有人提出可以检测是不是中文字符嘛,如果是中文字符就删除三个,英文就删除1一个, 这个方法不错,我没试过,这个中文utf8编码,没仔细研究过,反正能检测出来,谁懂得,希望解说下。
不说了,这个网上当来的CursorTextField坑挺多的。不一一说了,
后来,改用CCEditBox, 心情愉悦了很多,那比CCTextFieldTTF完善得不是一点点。代码写的也好,分别调用ios和android系统本身的ui部件,进行了一层包装。可是它在android上的表现形式,。。一个横框,太山寨了,用过的人都懂。。。
于是,我从2.1.4一直找到3.2, cocos2d-x居然一直是这样,估计大牛们都把精力放到核心上了,这一个小小的输入框没花大心思。
没办法,自己动手对CCTextFieldTTF改进了下,
1, 增加光标,
2, 在shader里,通过alpha值隐藏超出部分。
没有考虑,旋转,缩放等情况,光标位置还可以优化。。。。
不足还很多,也没详细测试,反正能用了,供大家参考,有问题欢迎联系qq: 41354290
https://github.com/aboduo/LLInputBox.git
使用cocos2d-x 2.1.4, 用iOS测试的
