最新文章
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
cocos2d-x滚动字幕
今天我们详细探讨一下cocos2d-x中滚动字幕的问题,主要讲解cocos2d-x里字幕滚动效果的实现,包含具体的源代码内容,供大家参考学习。
这里所说的滚动字幕效果,具体指的是:在label显示时,文字一个字一个字逐渐呈现出来,营造出类似对话的感觉。
开发环境
- 引擎版本:2.1.4
- 开发语言:Lua
实现思路
可以通过定时器来实现这种逐字显示的效果。在定时器内部,不断对显示的label调用setString方法进行内容设置。当全部内容显示完毕后,关闭该定时器。
具体实现
在定时器内部,需要使用两个变量:一个用于表示当前label已显示的内容,另一个用于存储最终要显示的完整内容。
local nowDes = self.captionLabel:getString(); -- 当前label显示的内容
local des = self.m_desc; -- 最终要显示的内容
具体步骤如下:
- 计算当前内容和最终内容的长度。
- 在当前内容长度的基础上,每次从最终要显示的内容中截取一个字,设置为当前
label的文本内容,从而实现逐字显示的效果。 - 完成字符串长度的计算和给定长度字符串的截取。
计算字符串长度
以下是计算UTF-8字符串长度的函数:
utfstrlen = function(str)
local len = #str;
local left = len;
local cnt = 0;
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
while left ~= 0 do
local tmp = string.byte(str, -left);
local i = #arr;
while arr[i] do
if tmp >= arr[i] then
left = left - i;
break;
end;
i = i - 1;
end;
cnt = cnt + 1;
end;
return cnt;
end;
使用该函数计算当前内容和最终内容的长度:
local lenNowDes = utfstrlen(nowDes);
local lenDes = utfstrlen(des);
对比长度并更新显示内容
得到当前和最终的字符长度后,进行对比:
if lenNowDes < lenDes then
-- 截取,重新设置
local str = utf8sub(des, lenNowDes + 1, 1);
self.captionLabel:setString(self.captionLabel:getString() .. str);
end;
字符串截取函数
以下是实现UTF-8字符串截取的函数:
utf8sub = function(str, startChar, numChars)
local startIndex = 1;
while startChar > 1 do
local char = string.byte(str, startIndex);
startIndex = startIndex + DataSheetMgr.chsize(char);
startChar = startChar - 1;
end
local currentIndex = startIndex;
while numChars > 0 and currentIndex <= #str do
local char = string.byte(str, currentIndex);
currentIndex = currentIndex + DataSheetMgr.chsize(char);
numChars = numChars - 1;
end;
return str:sub(startIndex, currentIndex - 1);
end;
通过以上步骤,就可以在cocos2d-x中实现字幕逐字滚动显示的效果。