Cocos2d-x 3.10 蹦字弹板讲解

最近在我开发游戏的时候遇到了这样的一个需求,就是在新手教程的时候要求做一个弹板然后还要让里面的文字一个一个的跳出来,刚开始觉得挺难弄的后来通过在网上查阅里一些资料发现还是挺容易的,我写了一个组件,希望今后在遇到的时候和其他人遇到这种情况的时候能够参考借鉴一下。

进入正题,我先把我写的控件的代码贴出来然后在慢慢讲解:
---------------------------------------------------
--创建新手文本弹出框
--@param pos 要显示的位置 锚点(0.5,0.5)
--@param text 要显示的文字
--@param textSize 文字的字号大小
--@param width 行宽
--@param img 背景图片
--@param dim 模糊程度 取值范围 0 - 1
function createNewbieTextDialog(pos, text, textSize, width, img, dim, lineNum)
    assert(Utility:isNotEmptyStr(text),"the information text is not set")
    assert(textSize ~= 0,"the textSize is wrong")
    assert(width ~= 0,"the width is wrong")
    assert(pos,"the pos is nil")
    assert(img,"the img is nil")
    assert(lineNum,"the lineNum is nil")

    local textFonts = {}  -- 字符暂时存储的地方
    local charArrayFonts = {}  --字符存放的地方
    local startIndex = 1
    local endIndex = 1 
    local isOk = 0
    local charIndex = 1  --字符数组下标

    -- 添加字符串数组(判断其中是否有中文字符)
    for i = 1, string.len(text) do
        local curByte = string.byte(text, i)
        local byteCount = 1  -- Utf8 编码最大有4個字節的情況

        -- 判断编码类型
        if curByte > 0 and curByte <= 127 then
            byteCount = 1
        elseif curByte >= 192 and curByte < 223 then
            byteCount = 2
        elseif curByte >= 224 and curByte < 239 then
            byteCount = 3
        elseif curByte >= 240 and curByte <= 247 then
            byteCount = 4
        end 

        endIndex = i + byteCount - 1
        textFonts[i] = string.sub(text, startIndex, endIndex)
        startIndex = endIndex + 1
    
    
        if byteCount ==3 then
            charArrayFonts[charIndex] = textFonts[i]
            print("pppppp"..charArrayFonts[charIndex])
            charIndex = charIndex + 1
           isOk = 2
        elseif byteCount == 1 then
            if isOk <= 0 then
                 charArrayFonts[charIndex] = textFonts[i]
                print("HHHHHH"..charArrayFonts[charIndex])
                charIndex = charIndex + 1
            end
            isOk = isOk - 1
        end

        -- 讲字符串数组传入正确的字节数和值
        --print("##########"..textFonts[i].."@@@@@@@@@"..startIndex.."^^^^^^^"..byteCount)
    end

    local popLayer = nil                            --弹出层
    local function onTouchBegan(touch,event)
        return true
    end

    --移除弹出层
    local function onTouchEnded(touch,event)
        cc.Director:getInstance():getRunningScene():removeChild(popLayer,true)
        return true
    end

    --注册触摸事件
    local function registerTouchEvent()
        local listener = cc.EventListenerTouchOneByOne:create();
        listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN)
        listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED)
        listener:setSwallowTouches(true)
        cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener,popLayer);
    end

    local bgimv=ccui.ImageView:create(img)
    bgimv:setContentSize(cc.size(width+50,lineNum * textSize+50))  --50 像素为底部背景比文字大出来的边框
    bgimv:setScale9Enabled(true)
    bgimv:setPosition(pos)
    popLayer = cc.LayerColor:create(cc.c4b(0,0,0,255*dim%255))
    popLayer:setPosition(cc.p(0,0))
    popLayer:addChild(bgimv)

    -- 弹板上的文字

    local layerHeight = nil
    local tipLable = {}

    local i = 1
    local j = 0  -- 可能转到第二行


    -- 调度函数
    local function scheduleUpdate(dt) 
        tipLable = cc.Label:createWithSystemFont(charArrayFonts[i],"fonts/Marker Felt.ttf",textSize,cc.size(width,-1))
        tipLable:setColor(cc.c3b(255,255,255))
        layerHeight = tipLable:getContentSize().height
        tipLable:setAnchorPoint(cc.p(0.5,0.5))
        tipLable:setPosition(pos)
        tipLable:setPositionX(pos.x + i * textSize)
        if pos.x + i * textSize >= 1.5 * width then          -- 自动换行,最多两行
            tipLable:setPositionY(pos.y - textSize)
            tipLable:setPositionX(pos.x + j * textSize)
            j = j + 1       
        end
        i = i + 1
        print(i.."##########"..charArrayFonts[i])
        popLayer:addChild(tipLable)  -- 添加文字
    
        if i >= #charArrayFonts then
             cc.Director:getInstance():getScheduler():unscheduleScriptEntry(Schedule.id) 
        end
     end    
   
    --创建调度者
    Schedule.id = cc.Director:getInstance():getScheduler():scheduleScriptFunc(scheduleUpdate, 0.1, false)

    registerTouchEvent()  -- 注册触摸监听事件
    cc.Director:getInstance():getRunningScene():addChild(popLayer)  -- 在当前场景添加层

end
在上面的这一长串的代码里,也基础的一般都能看懂,但里面核心实现让文字一个一个的跳出来还是靠的中间的那段代码(--添加字符串数组(判断是否有中文字符))从那段带代码移植到for循环结束,这里面主要的参数其实就是传进来一个字符串,然后第一次截取一个字符,第二次截取两个字符,依次类推但是要注意的是,这段字符串里面可以有标点符号的,再使用string.byte去字符的时候要注意中文是占两个位置的而其他的符号是占一个位置的,所以这里分了四个区间来区分所占的位置,我们这里会用到的一般就是3和1这两个位置,分别表示的是中文和特殊符号。将字区分好了,剩下的就使用调度者去调度让这些字显现出来
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 25,885评论 5 19
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 8,495评论 3 93
  • 一、『让对方愿意听』 如果说话绕弯子或说不全,对方就容易不明就里,只能产生负面效果。直接说出3点,会让别人觉得你思...
    小黄2333阅读 182评论 0 0
  • 得知我当过老师,很多人问过我同样的问题,过节需要给老师送礼吗?管用吗?第一次碰到这种问题感觉很奇怪,这是个问题吗?...
    银子姐阅读 338评论 1 1