最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
cocos2dx 获得字符宽度
2015年01月22日 09:57
0 点赞
0 评论
更新于 2025-11-21 15:04
在Cocos2d-x开发中,有时我们需要根据输入的字符串来计算其所需占用的大小(Size)。本文将分享一段封装代码,通过传入字符串即可返回其对应的Size,供大家参考和学习。如果大家发现代码中有问题,欢迎指正交流。
代码实现
以下是封装的代码,该函数会根据输入的字符串计算其所需占用的Size:
Size ChartDemoScene::calculateFontSize(const char *str )
{
std::string tempString = str;
log("tempString = %s", tempString.c_str());
// 如果字符串很长,每次抽取100个字符来计算size
size_t computeCount = tempString.size();
Size size = Size(0, 0);
for (int i = 0; i < computeCount; ) {
std::string substring = tempString.substr(i, 1);
// 判断是否为汉字
if ((substring.c_str()[0] & 0x80) != 0) {
// 是汉字,一个汉字占3个字节
substring = tempString.substr(i, 3);
i += 3;
} else {
i++;
}
cclog("substring = %s", substring.c_str());
auto tempLabel = LabelTTF::create(substring.c_str(), "", 25);
tempLabel->setHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
Size tmpLsize = tempLabel->getContentSize();
size.width += tmpLsize.width;
}
float fHeight = 0;
// 判断字符串宽度是否大于容器的宽度
if (size.width > chartWidth) {
// 计算需要多少行
fHeight = (size.width / 200);
}
int nHeight = ceil(fHeight);
if (nHeight == 0) {
nHeight = 1;
}
Size labelSize;
if (size.width < chartWidth) {
// 计算容器的Size
labelSize = Size(size.width, nHeight * 32);
} else {
labelSize = Size(chartWidth, nHeight * 28);
}
// CCLog("labelSize = (%f, %f)", labelSize.width, labelSize.height);
// CCLog("fHeight = %f nHeight = %d ", fHeight, nHeight);
return labelSize;
}
代码解释
字符串处理:
- 首先将输入的
const char*类型的字符串转换为std::string类型的tempString。 - 遍历
tempString,通过判断字符的二进制位来区分汉字和普通字符。汉字通常占3个字节,普通字符占1个字节。
- 首先将输入的
计算字符宽度:
- 对于每个字符或汉字,创建一个
LabelTTF对象,并获取其内容大小tmpLsize。 - 将每个
tmpLsize的宽度累加到size.width中。
- 对于每个字符或汉字,创建一个
计算行数和最终大小:
- 如果
size.width大于chartWidth,则计算需要的行数fHeight。 - 使用
ceil函数对fHeight向上取整得到nHeight。 - 根据
size.width和chartWidth的大小关系,计算最终的labelSize。
- 如果
通过以上步骤,我们可以根据输入的字符串计算出其所需占用的Size。