Cocos2d-x 3.10 蹦字彈板講解

最近在我開發(fā)游戲的時(shí)候遇到了這樣的一個(gè)需求,就是在新手教程的時(shí)候要求做一個(gè)彈板然后還要讓里面的文字一個(gè)一個(gè)的跳出來,剛開始覺得挺難弄的后來通過在網(wǎng)上查閱里一些資料發(fā)現(xiàn)還是挺容易的貌虾,我寫了一個(gè)組件限煞,希望今后在遇到的時(shí)候和其他人遇到這種情況的時(shí)候能夠參考借鑒一下撮抓。

進(jìn)入正題棋电,我先把我寫的控件的代碼貼出來然后在慢慢講解:
---------------------------------------------------
--創(chuàng)建新手文本彈出框
--@param pos 要顯示的位置 錨點(diǎn)(0.5,0.5)
--@param text 要顯示的文字
--@param textSize 文字的字號(hào)大小
--@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 = {}  -- 字符暫時(shí)存儲(chǔ)的地方
    local charArrayFonts = {}  --字符存放的地方
    local startIndex = 1
    local endIndex = 1 
    local isOk = 0
    local charIndex = 1  --字符數(shù)組下標(biāo)

    -- 添加字符串?dāng)?shù)組(判斷其中是否有中文字符)
    for i = 1, string.len(text) do
        local curByte = string.byte(text, i)
        local byteCount = 1  -- Utf8 編碼最大有4個(gè)字節(jié)的情況

        -- 判斷編碼類型
        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

        -- 講字符串?dāng)?shù)組傳入正確的字節(jié)數(shù)和值
        --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  -- 可能轉(zhuǎn)到第二行


    -- 調(diào)度函數(shù)
    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          -- 自動(dòng)換行,最多兩行
            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    
   
    --創(chuàng)建調(diào)度者
    Schedule.id = cc.Director:getInstance():getScheduler():scheduleScriptFunc(scheduleUpdate, 0.1, false)

    registerTouchEvent()  -- 注冊觸摸監(jiān)聽事件
    cc.Director:getInstance():getRunningScene():addChild(popLayer)  -- 在當(dāng)前場景添加層

end
在上面的這一長串的代碼里椎组,也基礎(chǔ)的一般都能看懂油狂,但里面核心實(shí)現(xiàn)讓文字一個(gè)一個(gè)的跳出來還是靠的中間的那段代碼(--添加字符串?dāng)?shù)組(判斷是否有中文字符))從那段帶代碼移植到for循環(huán)結(jié)束,這里面主要的參數(shù)其實(shí)就是傳進(jìn)來一個(gè)字符串,然后第一次截取一個(gè)字符专筷,第二次截取兩個(gè)字符弱贼,依次類推但是要注意的是,這段字符串里面可以有標(biāo)點(diǎn)符號(hào)的仁堪,再使用string.byte去字符的時(shí)候要注意中文是占兩個(gè)位置的而其他的符號(hào)是占一個(gè)位置的哮洽,所以這里分了四個(gè)區(qū)間來區(qū)分所占的位置,我們這里會(huì)用到的一般就是3和1這兩個(gè)位置弦聂,分別表示的是中文和特殊符號(hào)鸟辅。將字區(qū)分好了,剩下的就使用調(diào)度者去調(diào)度讓這些字顯現(xiàn)出來
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莺葫,一起剝皮案震驚了整個(gè)濱河市匪凉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捺檬,老刑警劉巖再层,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異堡纬,居然都是意外死亡聂受,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門烤镐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋济,“玉大人,你說我怎么就攤上這事炮叶⊥肼茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵镜悉,是天一觀的道長祟辟。 經(jīng)常有香客問我,道長侣肄,這世上最難降的妖魔是什么旧困? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮茫孔,結(jié)果婚禮上叮喳,老公的妹妹穿的比我還像新娘。我一直安慰自己缰贝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布畔濒。 她就那樣靜靜地躺著剩晴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赞弥,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天毅整,我揣著相機(jī)與錄音,去河邊找鬼绽左。 笑死悼嫉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拼窥。 我是一名探鬼主播戏蔑,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲁纠!你這毒婦竟也來了总棵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤改含,失蹤者是張志新(化名)和其女友劉穎情龄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捍壤,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骤视,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹃觉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片专酗。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帜慢,靈堂內(nèi)的尸體忽然破棺而出笼裳,到底是詐尸還是另有隱情,我是刑警寧澤粱玲,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布躬柬,位于F島的核電站,受9級(jí)特大地震影響抽减,放射性物質(zhì)發(fā)生泄漏允青。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一卵沉、第九天 我趴在偏房一處隱蔽的房頂上張望颠锉。 院中可真熱鬧,春花似錦史汗、人聲如沸琼掠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷蛙。三九已至悼瓮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艰猬,已是汗流浹背横堡。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冠桃,地道東北人命贴。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像食听,于是被迫代替她去往敵國和親胸蛛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法碳蛋,類相關(guān)的語法胚泌,內(nèi)部類的語法,繼承相關(guān)的語法肃弟,異常的語法玷室,線程的語...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 26,700評(píng)論 5 19
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,520評(píng)論 3 93
  • 一、『讓對方愿意聽』 如果說話繞彎子或說不全笤受,對方就容易不明就里穷缤,只能產(chǎn)生負(fù)面效果。直接說出3點(diǎn)箩兽,會(huì)讓別人覺得你思...
    小黃2333閱讀 188評(píng)論 0 0
  • 得知我當(dāng)過老師津肛,很多人問過我同樣的問題,過節(jié)需要給老師送禮嗎汗贫?管用嗎身坐?第一次碰到這種問題感覺很奇怪,這是個(gè)問題嗎落包?...
    銀子姐閱讀 346評(píng)論 1 1