cocos2dx 3.1.1 Lua常用控件

时间:2022-09-20 19:10:20
<pre name="code" class="plain">require "Cocos2d"
require "Cocos2dConstants"

-- cclog
cclog = function(...)
    print(string.format(...))
end

-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
    cclog("----------------------------------------")
    cclog("LUA ERROR: " .. tostring(msg) .. "\n")
    cclog(debug.traceback())
    cclog("----------------------------------------")
    return msg
end

local function main()
    collectgarbage("collect")
    -- avoid memory leak
    collectgarbage("setpause", 100)
    collectgarbage("setstepmul", 5000)
cc.FileUtils:getInstance():addSearchResolutionsOrder("src");
cc.FileUtils:getInstance():addSearchResolutionsOrder("res");
    --support debug
    local targetPlatform = cc.Application:getInstance():getTargetPlatform()
    if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or 
       (cc.PLATFORM_OS_ANDROID == targetPlatform) or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or
       (cc.PLATFORM_OS_MAC == targetPlatform) then
        cclog("result is ")
--require('debugger')()
        
    end

    ---------------

    local visibleSize = cc.Director:getInstance():getVisibleSize()
    local origin = cc.Director:getInstance():getVisibleOrigin()


    -- create Layer
    local function createUILayer()
        local UILayer = cc.Layer:create()

        --图片精灵
        local bg = cc.Sprite:create("bg.jpg")
        bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2)
        UILayer:addChild(bg)

        ---文字标签
        local txt = cc.LabelTTF:create("zhong中文123456780", "Arial", 20)  
        txt:setColor( cc.c3b( 255, 255, 255 ) )  
        txt:setAnchorPoint(cc.p(0,0))
        txt:setPosition( cc.p( 350,  20 ) )
        UILayer:addChild(txt)      
        
        --纯色精灵
        local boxSprite = cc.Sprite:create()
        boxSprite:setTextureRect(cc.rect(0,0,80,80))
        boxSprite:setAnchorPoint(cc.p(0,0))
        boxSprite:setPosition( cc.p( 350,  40 ) )
        --cocosdx自动默认是白色
        --boxSprite:setColor(cc.c3b(255,255,255))
        UILayer:addChild(boxSprite,8)
        -- boxSprite:setGlobalZOrder(8)

        -- 菜单按钮
        local menuTools
        local function menuCallbackOpenPopup()
            cclog("ttttttttt")
        end
  
        -- add the left-bottom "tools" menu to invoke menuPopup
        local menuToolsItem = cc.MenuItemImage:create("back.png", "back2.png")
        menuToolsItem:setPosition(0, 0)
        menuToolsItem:registerScriptTapHandler(menuCallbackOpenPopup)
        menuTools = cc.Menu:create(menuToolsItem)
        local itemWidth = menuToolsItem:getContentSize().width
        local itemHeight = menuToolsItem:getContentSize().height
        menuTools:setPosition(350, 80)
        UILayer:addChild(menuTools,15)
        -- menuTools:setlocalZOrder(5)
        -- menuTools

        
        -- Scale9Sprite 9宫格精灵
        local temp=cc.Sprite:create("btntest0.png");
        local size=temp:getContentSize();
        local fullRect=cc.rect(0,0, size.width, size.height)
        local insetRect = cc.rect(20,20,size.width-40, size.height-40);
        local backGround = cc.Scale9Sprite:create("btntest0.png", fullRect, insetRect )
        backGround:setPreferredSize(cc.size(100, 50))
        backGround:setPosition(cc.p(350, 130))
        backGround:setAnchorPoint(cc.p(0,0))
        UILayer:addChild(backGround)


        --进度条精灵
        -- 创建并初始化进度,第一个参数是duration持续时间,100为进度
        local to1 = cc.ProgressTo:create(2, 100)
        local to2 = cc.ProgressTo:create(1, 100)
        --创建进度条精灵
        local progressSprite=cc.Sprite:create("bgtime2.png")
        progress1=cc.ProgressTimer:create(progressSprite)
        --设置进度条类型为BAR  
        progress1:setType(cc.PROGRESS_TIMER_TYPE_BAR)--enum  Type { RADIAL, BAR }
        progress1:setPosition(cc.p(200, 150))

        --进度动画运动方向,可以多试几个值,看看效果
        --进度条宽高变化//从左到右
        progress1:setMidpoint(cc.p(0, 0))--注意这里是cc.p  c++中是Vec2
        progress1:setBarChangeRate(cc.p(1, 0))

        --进度条宽高变化//从下到上 
        -- progress1:setMidpoint(cc.p(0, 0))
        -- progress1:setBarChangeRate(cc.p(0, 1))

        -- //进度条宽高变化//从左到右  
        -- progress1:setMidpoint(cc.p(1, 0))
        -- progress1:setBarChangeRate(cc.p(1, 0))

        --  //    //进度条宽高变化//从上到下 
        -- progress1:setMidpoint(cc.p(1, 0))
        -- progress1:setBarChangeRate(cc.p(0, 1))
        progress1:setPercentage(0)--默认是零,可以自行修改
        UILayer:addChild(progress1, 1) 
        --进度条效果设置 方这里提供了两种
        --方案1:执行动作
        --需要有这个runAction才会有动作效果
        -- progress1:runAction(cc.RepeatForever:create(to1))
        --方案2:定时器+setPercentage完成(见后面定时器中可见)
        
        --圆形的进度条1 顺时针
        local progress3Sprite = cc.Sprite:create("menu1.png")
        progress3 = cc.ProgressTimer:create(progress3Sprite)
        progress3:setType(cc.PROGRESS_TIMER_TYPE_RADIAL)--设置类型为圆形  
        progress3:setPosition(cc.p(250, 200))
        progress3:setScale(0.8)  
        progress3:setReverseDirection(false) -- 这是默认的顺时针
        progress3:setPercentage(0)--默认是零,可以自行修改
        -- progress3:runAction(cc.RepeatForever:create(to1))
        UILayer:addChild(progress3, 1)
        --如果没有runAction是可以直接removeFromParent  如果有runAction需要先停掉
        ----相同的action会导致报错  最好用不同的action
        -- progress3:stopAction(cc.RepeatForever:create(to1))
        -- progress3:removeFromParent(true)



        --圆形的进度条2 逆时针
        local progress2Sprite = cc.Sprite:create("menu1.png")
        progress2 = cc.ProgressTimer:create(progress2Sprite)
        progress2:setType(cc.PROGRESS_TIMER_TYPE_RADIAL)--设置类型为圆形
        progress2:setPosition(cc.p(200, 200))
        progress2:setScale(0.8)
        progress2:setReverseDirection(true) -- 默认是顺时针 这里设置反向逆时针
        progress2:runAction(cc.RepeatForever:create(to2))
        UILayer:addChild(progress2, 1)

        --[[
        这里有两个方法可能是比较容易疑惑的:
        progress:setMidpoint(cc.p(0, 0))
        setMidpoint()函数是设置进度条的起始点,(0,y)表示最左边,(1,y)表示最右边,(x,1)表示最上面,(x,0)表示最下面。
        progress:setBarChangeRate(cc.p(1, 0))
        setBarChangeRate()函数是用来设置进度条动画方向的,(1,0)表示横方向,(0,1)表示纵方向
        ]]

        --     cc.Label:createWithTTF  -- 添加标签  cocos ide中可以用   xcode中会报错
        -- -- 通过初始化文本、字体,字体大小来创建一个Label
        -- local label = cc.Label:createWithTTF("New Renderer", "fonts/arial.ttf", 36)
        -- label:setColor(cc.c3b(255,255,0)) -- 设置颜色为黄色
        -- UILayer:addChild(label, 1, 10000) -- 第一个参数为node,第二个参数为zorder,第三个参数是tag
        -- label:setPosition( cc.p(80, 80))-- 设置位置top,center
      
        --创建一个标签,显示进度
        local numsTTF = cc.LabelTTF:create("0", "Thonburi", 18)
        numsTTF:setPosition(cc.p(250, 150))
        UILayer:addChild(numsTTF, 1)

        --Lua 实现定时器功能
        local scheduler = CCDirector:sharedDirector():getScheduler()
        local run_logic = nil
        local x=0
        --函数定义
        local function Update()
            -- print(11)
            if x<100 then
                x=x+5
                progress1:setPercentage(x)--这里以设置进度条1作为例子
                progress3:setPercentage(x)
                numsTTF:setString(""..x.."%")  --这里以设置文字numsTTF的内容作为例子,注意这里的x是数字,需要转换为字符
            end
        end
        --开始倒计时 每1秒调用一次Update方法
        run_logic = scheduler:scheduleScriptFunc(Update,1,false)  --第一个是调用的函数 第二个参数是时间
        
        --退出界面 卸载定时器
        local function onNodeEvent(event)
           if "exit" == event then
               cc.Director:getInstance():getScheduler():unscheduleScriptEntry(run_logic)
           end
        end
        UILayer:registerScriptHandler(onNodeEvent)
</pre><pre name="code" class="plain">
</pre><pre name="code" class="plain">        -- 输入框
        EditName = cc.EditBox:create(cc.size(180, 40), cc.Scale9Sprite:create("btntest0.png"))
        --   EditName = cc.EditBox:create(editBoxSize, cc.Scale9Sprite:create("btntest0.png"))
        EditName:setPosition(240, 100)
        -- --密码输入模式
        -- EditName:setInputFlag(cc.EDITBOX_INPUT_FLAG_PASSWORD)
        -- --单行输入
        -- --EditName:setInputMode(cc.EDITBOX_INPUT_MODE_SINGLELINE)
        UILayer:addChild(EditName)
        --         -- 开启委托
        --         -- EditName:setDelegate(UILayer)
        -- -- local targetPlatform = cc.Application:getInstance():getTargetPlatform()
        -- -- if kTargetIphone == targetPlatform or kTargetIpad == targetPlatform then
        -- --    EditName:setFontName("Paint Boy")
        -- -- else
        -- --     EditName:setFontName("fonts/Paint Boy.ttf")
        -- -- end
        -- --输入字符个数
        -- -- EditName:setMaxLength(10)
        -- -- EditName:setMaxLength(6)
        -- --输入字体尺寸
        EditName:setFontSize(25)
        -- EditName:setFontSize(50)
        -- --输入字体颜色
        -- -- EditName:setFontColor(cc.c3b(255,0,0))
        -- EditName:setFontColor(cc.c3b(0,255,0))
        -- -- EditName:setFontColor(cc.c3b(5, 4, 10))
        -- --设置editBox输入为空时的显示状态
        -- EditName:setPlaceHolder("Nameiiiiiiiiii:")
        -- -- EditName:setPlaceHolder("点击输入姓名") 
        -- --输入前默认显示字体颜色
        -- EditName:setPlaceholderFontColor(cc.c3b(255,255,255))
        -- -- EditName:setMaxLength(8)
        -- EditName:setReturnType(cc.KEYBOARD_RETURNTYPE_DONE )
        -- -- --Handler--事件响应
        -- -- EditName:registerScriptEditBoxHandler(editBoxTextEventHandle)



        return UILayer
    end

    -- run场景 add图层
    local sceneGame = cc.Scene:create()
    sceneGame:addChild(createUILayer())

   
    if cc.Director:getInstance():getRunningScene() then
         cc.Director:getInstance():replaceScene(sceneGame)
    else
        cc.Director:getInstance():runWithScene(sceneGame)
    end
end

local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
    error(msg)
end


 



_________
注意如果图片使用某文件夹下的,需要放到res中,并且路径名字写到res,例如
        local bgBox = cc.Sprite:create("res/RoleSelection/bgBox.png")
        bgBox:setPosition(cc.p(origin.x + visibleSize.width*0.2, origin.y + visibleSize.height*0.45-150))
        UILayer:addChild(bgBox)