一年之前学的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