[cocos2dx-lua]"Hello Lua"分析

一年之前學的cocos2dx,那時候還是用C++編寫的,但學完之後就找的一個新的方向——Unity3D開發的崗位,對我而言是一個新的方向,那時候經過了幾個月的每天熬夜奮戰,從”0“基礎到最後項目開發,那時候是在的是個小公司,總體而言還算比較輕鬆,可能效率利用的比較低,現在剛出來了,來到一家大公司,感覺到很多不一樣的變化,方向又改變了,還是回到之前的cocos2dx開發,但用的不是C++,而是lua腳本語言來開發,對我而言又是一個新的方向,既來之則安之,在接觸了那麼多方向之後,是該選擇一個確定的研究方向深入下去。來這該公司一週了,感受到一種之前所沒有的緊迫感,每天要給自己下定任務,並且按時按量的去完成,同事都很厲害,都是在這行業工作了多少年的,很有工作經驗,希望以後像他們多多請教,公司好多女程序,都很厲害,我的直屬上司楊總就是當時面試我的,我以爲當時面試的時候他旁邊的那位是祕書的,挺漂亮的一個女”上司“,我一直以爲是祕書,看起來很年輕,後來從同事那兒瞭解到她是我們所有人的上司,是公司的技術總監,好吧,我驚訝了,原來她是公司元老級別的程序了。第一天入職,辦理好入職手續,下午的時候老大遞給了我一般Lua編程的教程,不是太厚,但也不薄,三百多頁吧。後來花了兩天左右的時間將它看完,由於之前學的語言都是編譯型語言,用上強大的Visutial studio+VA提示功能非常強大,導致現在要用文本編輯器來寫lua語言有點痛苦,很容易手誤,但還是要慢慢習慣,任何事物都有兩面性,沒有所謂絕對的完美。

花兩天時間看完lua語法,然後花了一天看了下cocos2dx lua的Demo,接下來就可以進行項目開發了,不然每天開例會總是處於學習階段總感覺不好,公司不會養兩種人,懶人和閒人,所以還是多花點業餘時間來彌補自己的缺陷,跟上大部隊的開發。

  • 創建Cocos2dx-Lua項目

我這裏使用的是Visual Studio 2012+cocos2dx 2.2.4,前提安裝上Python

打開控制檯,通過命令來創建新的項目


然後打開cocos2dx的projects目錄發現生成了剛剛創建的lua項目

如果是Windows平臺就打開proj.win32->luastudy1.sln,編譯一下即可運行勢力demo。


  • 效果圖



cocos2dx lua項目,lua腳本放在Resources目錄下,也就是說lua腳本也像圖片,聲音資源這些一樣被當成是資源利用了,所以如果程序要邏輯跟新或者說有什麼bug,可以直接修改lua文件然後重新上傳即可,不需要再次編譯發佈,這也是lua開發cocos2dx的一大優點。


require "AudioEngine"

-- for CCLuaEngine traceback

function __G__TRACKBACK__(msg)

    print("----------------------------------------")

    print("LUA ERROR: " .. tostring(msg) .. "\n")

    print(debug.traceback())

    print("----------------------------------------")

end


--打印函數

local cclog = function(...)

    print(string.format(...))

end


function main()

    --調用其他腳本的方法

    require "hello2"

    --調用其他lua的腳本中的方法

    cclog("調用hello2腳本的方法:Result = "..myadd(3,5))

    --獲取屏幕分辨率

    local visibleSize = CCDirector:sharedDirector():getVisibleSize()

    --獲取屏幕分辨率的起始座標

    local origin = CCDirector:sharedDirector():getVisibleOrigin()

    

    print("可視區域的起點座標:",origin.x,origin.y)

    print("屏幕分辨率:",visibleSize.width,visibleSize.height)


    --創建一個場景

    local scene = CCScene:create()

    --創建一個層

    local layer = CCLayer:create()

    --創建一個文本

    local label = CCLabelTTF:create("你好 Lua","simkai",50)  --如果中文不顯示的話,必須要將lua文件保存爲中文

    label:setPosition(ccp(visibleSize.width/2+30,visibleSize.height/2+100))

    layer:addChild(label)

    --創建一個Sprite圖標

    local iconSprite = CCSprite:create("Icon.png")

    iconSprite:setPosition(ccp(80,260))

    layer:addChild(iconSprite)


    ----------------------------創建一個動畫精靈---------------------------------------------------

    local function createDog()

        --創建一個動畫(這裏是兩張圖片合成的一張,所以要根據矩形分割)

        local frameWidth = 105

        local frameHeight = 95

        --紋理塊管理器創建一個圖片文理

        local textureDog = CCTextureCache:sharedTextureCache():addImage("dog.png")

        local rect = CCRectMake(0,0,frameWidth,frameHeight)

        --創建精靈幀

        local frame0 = CCSpriteFrame:createWithTexture(textureDog,rect)

        rect = CCRectMake(frameWidth,0,frameWidth,frameHeight)

        local frame1 = CCSpriteFrame:createWithTexture(textureDog,rect)

        --創建一個精靈

        local spriteDog = CCSprite:createWithSpriteFrame(frame0)

        spriteDog.isPaused = false

        spriteDog:setPosition(origin.x+visibleSize.width-60,origin.y + visibleSize.height/2)

        

        local animFrames = CCArray:create()

        

        animFrames:addObject(frame0)

        animFrames:addObject(frame1)

        --由容器類實例對象創建一個動畫幀對象,設定每0.4秒更新一幀

        local animation = CCAnimation:createWithSpriteFrames(animFrames,0.4)  --第二個參數是播放的速率,值越小播放越快

        --創建一個動畫

        local animate = CCAnimate:create(animation)

        --設置精靈循環播放這個動作

        spriteDog:runAction(CCRepeatForever:create(animate))

        

        --設置精靈顏色

        --spriteDog:setColor(ccc3(0,255,0))


        --自定義一個定時器

        local function tick()

            if spriteDog.isPaused then return end

            local x,y = spriteDog:getPosition() --獲取座標

            if x<origin.x+60  then

                x = origin.x+visibleSize.width-60

            else

                x = x - 1

            end

        

            spriteDog:setPositionX(x)

         end

         --啓動定時器

         CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick,0,false)


         return spriteDog

    end


   


    ---------------------------------創建一個可移動的背景層-----------------------------------------

    local function createMoveLayer()

        local layerFarm = CCLayer:create()


        --添加背景

        local bg = CCSprite:create("farm.jpg")

        bg:setPosition(origin.x+visibleSize.width/2+80,origin.y+visibleSize.height/2 -20)

        layerFarm:addChild(bg)


        --添加地面田地

        for i = 0,3 do

            for j = 0,1 do

                local spriteLand = CCSprite:create("land.png")

                spriteLand:setPosition(200+j*180 - i%2 *90 ,10 + i*95/2)

                layerFarm:addChild(spriteLand)

            end

        end


        --添加植物(一個4*1的圖片)

        local frameCrop = CCSpriteFrame:create("crop.png",CCRectMake(0,0,105,95))

        for i = 0,3 do

            for j = 0,1 do

                local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop)

                spriteCrop:setPosition(10+200+j*180 - i%2*90,30+10+i*95/2)

                layerFarm:addChild(spriteCrop)

            end

        end


        --------------------觸摸事件-------------------------------------------

        local touchBeginPoint = nil

        --開始觸摸

        local function onTouchBegan(x,y)

            cclog("onTouchBegin:%0.2f,%0.2f",x,y)

            touchBeginPoint = {x = x,y = y}

            return true

        end

        --觸摸移動

        local function onTouchMoved(x,y)

            cclog("onTouchMoved:%0.2f,%0.2f",x,y)

            if touchBeginPoint then

                local cx,cy = layerFarm:getPosition()

                layerFarm:setPosition(cx+x-touchBeginPoint.x,cy+y-touchBeginPoint.y)

                touchBeginPoint = {x = x,y = y}

            end

        end

        --結束觸摸

        local function onTouchEnded(x,y)

            cclog("onTouchEnded:%0.2f,%0.2f",x,y)

            touchBeginPoint = nil

        end

        --判斷觸摸動作

        local function onTouch(eventType,x,y)

            if eventType == "began" then

                return onTouchBegan(x,y)

            elseif eventType == "moved" then

                return onTouchMoved(x,y)

            else

                return onTouchEnded(x,y)

            end

        end


        --調用layerFarm的registerScriptTouchHnadler函數註冊按下的事件相應函數

        layerFarm:registerScriptTouchHandler(onTouch)

        --使layerFarm能夠相應屏幕按下的事件

        layerFarm:setTouchEnabled(true)

        return layerFarm


    end


    --------------------------創建菜單-----------------------------------------------------

local function createLayerMenu()


    local layerMenu = CCLayer:create()


    local menuPopup,menuTools,effectID   --菜單欄、左下角的工具欄按鈕、音效ID


    --關閉菜單欄

    local function menuCallBackClosePopup()


        AudioEngine.stopEffect(effectID)  --根據ID號來關閉這個聲音

        menuPopup:setVisible(false)


    end


    --開啓菜單欄

    local function menuCallBackOpenPopup()

        

        local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")

        effectID = AudioEngine.playEffect(effectPath) --播放一個聲音然後賦值給某個ID

        menuPopup:setVisible(true)


    end


    --添加一個選擇菜單

    local menuPopupItem = CCMenuItemImage:create("menu2.png","menu2.png") -- 菜單選項

    menuPopupItem:setPosition(0,0)--選項卡的位置

    menuPopupItem:registerScriptTapHandler(menuCallBackClosePopup) --點擊事件

    menuPopup = CCMenu:createWithItem(menuPopupItem) --根據菜單選項創建菜單

    menuPopup:setPosition(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2) --設置菜單的位置

    menuPopup:setVisible(false) --設置面板的不顯示

    layerMenu:addChild(menuPopup) --將菜單添加到菜單層中


    --添加左下角的工具圖標

    local menuToolsItem = CCMenuItemImage:create("menu1.png","menu1.png") 

    menuToolsItem:setPosition(0,0)

    menuToolsItem:registerScriptTapHandler(menuCallBackOpenPopup)

    menuTools = CCMenu:createWithItem(menuToolsItem)

    local itemWidth = menuToolsItem:getContentSize().width --獲取圖片的寬

    local itemHeight = menuToolsItem:getContentSize().height --獲取圖片的高

    menuTools:setPosition(origin.x + itemWidth/2,origin.y + itemHeight/2)  --設置位置

    layerMenu:addChild(menuTools)


    return layerMenu


end



    ---------------------------添加背景音樂-----------------------------------------------

    --循環播放背景音樂

    --SimpleAudioEngine:sharedEngine():playBackgroundMusic("background.mp3",true)

    --或者

    local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.mp3")

    AudioEngine.playMusic(bgMusicPath,true)



    -- 取得聲音引擎的實例對象並調用其preloadEffect函數將聲音文件“effect1.wav”預加載進內存。這裏並不播放,預加載是爲了在播放時不造成卡頓感。  

    --SimpleAudioEngine:sharedEngine():preloadEffect("effect1.wav");  

    --或者

    local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")

    AudioEngine.preloadEffect(effectPath)



     --添加動畫狗

    layer:addChild(createDog(),4) --第二個參數是Z(深度),值越大越在前面


    --添加可移動的背景層到主場景中

    scene:addChild(createMoveLayer())

    --添加menu菜單

    scene:addChild(createLayerMenu())

    --添加自己繪製的圖標和文字層

    scene:addChild(layer)

    --運行場景

    CCDirector:sharedDirector():runWithScene(scene)

end



--腳本的入口函數,前面一個參數是調用執行的函數,後面一個是錯誤處理的函數

xpcall(main, __G__TRACKBACK__)

注意:如果要顯示中文,解決方案將lua文件保存爲utf8格式

本文出自 “丁小未的專欄” 博客,請務必保留此出處http://dingxiaowei.blog.51cto.com/4561335/1437085


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章