Lua中调用 Cocos2d-x 中的滑动条 ScrollView

ScrollView

       我想玩儿过手机的朋友对滑动条都不陌生吧,(旁边: 这不是废话么????

            尴尬  那好吧,废话不多说直接开始ScrollView吧

local m_BaseNode  -- 主场景

local CreateScroll    -- 房间分级滑动视图
local CreateStageNode   -- 创建节点
local m_ScrollView              -- 滑动层变量
local m_Inner     -- 内容器
local addScrollHBtnNode   -- 添加滑动节点
local addScrollHTouchEventListener -- 滑动节点监听

local m_DataInfo = {                -- 数据表
    {png = "doudizhu", fun = function () OnDouDiZhu() end},
    {png = "yixiazai", fun = function () OnZhaJinHua() end},
    {png = "yixiazainiuniu", fun = function () OnNiuNiu() end}   
}


CreateScroll = function ( )
           print("创建滑动视图" )
           local stageStartX 150         --开始位置 
           local stageOffX = 300           -- 偏移
           local stageX = stageStartX      -- 当前stage位置
           -- 创建内容器
           m_Inner = cc.NodeRGBA:create()

           -- 创建全部 stage
           for i=1,#m_DataInfodo
               local stageNode = CreateStageNode(i, cc.size(width, height) ) 

                     -- 函数在下面这里是滑动条中单个选项图片的宽和高            

               local btn = addScrollHBtnNode(m_Inner,stageNode,    
                            m_DataInfo[i].fun,
                            stageX, 250
                            )      -- 函数再下面,将 stageNode 添加到内容器中
               stageX = stageX + stageOffX
            end
   
    -- 创建ScrollView
    m_ScrollView = cc.ScrollView:create(cc.size(900, 430), m_Inner)

    -- 设置内容器的大小
    m_ScrollView:setContentSize(cc.size(stageX - stageStartX, 380))

    -- 设置滑动的方向   0 是水平方向     1是垂直方向    2 是水平垂直都可以
    m_ScrollView:setDirection(0)
    m_ScrollView:setPosition(cc.p(65, 210))

    --将m_ScrollView添加到m_BaseNode中
    m_BaseNode:addChild(m_ScrollView)

    collectgarbage( "setpause", 100)
    collectgarbage( "setstepmul", 5000)
end

-- 创建节点函数
CreateStageNode = function (stageID, size)
     -- 创建节点
    local stageNode = CCLayer:create()
    stageNode:setContentSize(size.width, size.height)
    stageNode:setTag(stageID)
    addSprite(stageNode, m_DataInfo[stageID].png, 0, 0)
    -- 设置显示的字

       -- 在这里可以向每个节点中添加相应的信息

    -- 返回节点
    return stageNode
end

-- p : 层    name : 图片名字(plist文件中)  x y : 坐标  

function  addSprite( p, name, x, y, a, z ,scale)

    local sf = CCSpriteFrameCache:getInstance():getSpriteFrame( name )
    local s  = CCSprite:createWithSpriteFrame( sf )
    if not s then s = CCSprite:createWithSpriteFrameName( "wrong" ) end
    if z then p:addChild( s, z ) else p:addChild( s ) end
    if x and y then s:setPosition(x, y) end

    if a then s:setAnchorPoint( a ) end
    s:setScale(scale or 1.0)
    return s

end


-- 添加滑动节点

-- p : 层   btnNode : 节点   cb : 点击后的回调函数
addScrollHBtnNode = function ( p, btnNode, cb, x, y, z, a, scale )
    local layer = CCLayer:create()
    layer:addChild(btnNode)
    btnNode:setAnchorPoint(sys.ap.topCenter)
    btnNode:setPosition({0,0})

    p:addChild(layer)
    layer:setContentSize({width=btnNode:getContentSize().width,height=btnNode:getContentSize().height})
    if a then
        layer:setAnchorPoint(a)
    else
        layer:setAnchorPoint(sys.ap.leftTop)
    end
    if x and y then layer:setPosition(x,y) end
    if cb then addScrollHTouchEventListener(layer,cb) end
    return layer
end


-- 滑动节点监听函数
addScrollHTouchEventListener = function ( btn, cb )
    -- handing touch events
    local touchBeginPoint = nil
    local touchMovePoint = nil
    local isMove = false
    local moveDis = 5
    local function onTouchBegan(touch, event)
        isMove = false
        local location = touch:getLocation()
        touchBeginPoint = {x = location.x, y = location.y}
        local s         = btn:getContentSize()
        local rect      = { x=-s.width/2, y=-s.height/2, width=s.width, height=s.height }
        local touchP    = btn:convertToNodeSpace( touchBeginPoint )
        if Point_In_Rect(rect, touchP) then
            btn:setScale(1.1)
        end
        return true
    end
    local function onTouchMove(touch, event)
        local location = touch:getLocation()
        touchMovePoint = {x = location.x, y = location.y}
        if math.abs(touchBeginPoint.x - touchMovePoint.x) > moveDis then
            isMove = true
            btn:setScale(1.0)
        end
    end
    local function onTouchEnd(touch, event)
        local location = touch:getLocation()
        touchBeginPoint = {x = location.x, y = location.y}
        local s         = btn:getContentSize()
        local rect      = { x=-s.width/2, y=-s.height/2, width=s.width, height=s.height }
        local touchP    = btn:convertToNodeSpace( touchBeginPoint )
        if Point_In_Rect(rect, touchP) and not isMove then
            if cb then
                cb()
            end
        end
        btn:setScale(1.0)
    end

    local listener = cc.EventListenerTouchOneByOne:create()
    listener:setSwallowTouches(false)  --允许消息向下流转
    listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
    listener:registerScriptHandler(onTouchMove,cc.Handler.EVENT_TOUCH_MOVED )
    listener:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCH_ENDED )
    local eventDispatcher = btn:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, btn)
end

-- 斗地主回调函数
OnDouDiZhu = function ()
    print("斗地主..........")
end

-- 扎金花回调函数
OnZhaJinHua = function ()
    print("炸金花..........")
end

-- 牛牛回调函数
OnNiuNiu = function ()
    print("牛牛............")
end


旁白呢?????

旁白:( 找我干嘛???给我讲完啦??啊啊啊啊啊啊,这么点东西你要写这么多啊鄙视)


呵呵。。。。。。。。。。

说实话,开始这点东西我找了很久都没有找到,最后终于搞懂了,所以写出来给大家分享




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用 Lua 语言和 Cocos2d-x 引擎实现按钮放大缩小的示例代码: ```lua -- 创建一个按钮 local button = ccui.Button:create("button_normal.png", "button_pressed.png", "button_disabled.png") button:setPosition(display.cx, display.cy) button:setTitleText("Button") button:setTitleFontSize(24) self:addChild(button) -- 定义按钮缩放的动作 local scaleSmall = cc.ScaleTo:create(0.1, 0.9) local scaleBig = cc.ScaleTo:create(0.1, 1.1) local scaleOrigin = cc.ScaleTo:create(0.1, 1) -- 注册按钮的触摸事件 button:addTouchEventListener(function(sender, eventType) if eventType == ccui.TouchEventType.began then -- 按下时缩小按钮 sender:runAction(scaleSmall) elseif eventType == ccui.TouchEventType.ended then -- 抬起时放大按钮 sender:runAction(scaleBig) -- 在此处添加按钮点击后的逻辑处理 elseif eventType == ccui.TouchEventType.canceled then -- 取消点击时恢复按钮原始大小 sender:runAction(scaleOrigin) end end) ``` 上述代码,首先创建了一个按钮,并定义了缩小、放大和还原按钮大小的动作。然后注册了按钮的触摸事件,当触摸事件类型为 `ccui.TouchEventType.began`(即按下时)时,执行缩小动作,当事件类型为 `ccui.TouchEventType.ended`(即抬起时)时,执行放大动作并在此处添加按钮点击后的逻辑处理,当事件类型为 `ccui.TouchEventType.canceled`(即取消点击时)时,执行还原按钮大小的动作。 需要注意的是,上述代码使用了 `ccui.Button` 类创建按钮,如果使用的是 `cc.Sprite` 类,则需要使用 `cc.ScaleBy` 函数创建缩放动作。同时,由于 Lua 函数名和变量名不区分大小写,因此 `cc.ScaleTo` 函数在 Lua 也可以写成 `cc.Scaleto` 或 `cc.scaleTo`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值