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


旁白呢?????

旁白:( 找我幹嘛???給我講完啦??啊啊啊啊啊啊,這麼點東西你要寫這麼多啊鄙視)


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

說實話,開始這點東西我找了很久都沒有找到,最後終於搞懂了,所以寫出來給大家分享




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