zoukankan      html  css  js  c++  java
  • 关于cocos2dx之lua使用TableView

    在手机游戏的开发中,滚动是一项很重要的操作,而cocos2dx中使用的最广泛的就属于TableView了,只是由于cocos2dx的接口比較晦涩,所以须要一个熟悉的过程。本文主要解说怎样使用TableView。

    首先当然是创建一个TableView,这比較简单,和其它控件差点儿相同。看看演示样例代码:

        self._skillView = cc.TableView:create(cc.size(winSize.width / 3 - 50, winSize.height - 140))
        self._skillView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)    
        self._skillView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
        self._skillView:setPosition(cc.p(50, 10))
        self._skillView:setDelegate()
        skill_bg:addChild(self._skillView)
    须要注意的是setDirection的參数,cc.SCROLLVIEW_DIRECTION_VERTICAL表示在垂直方向滚动,cc.SCROLLVIEW_DIRECTION_HORIZONTAL则表示在水平方向滚动。

    其次为TableView设置一些回调函数。

    主要有4个回调函数。先看看演示样例代码:

        self._skillView:registerScriptHandler(SkillBoard.tableCellTouched, cc.TABLECELL_TOUCHED)
        self._skillView:registerScriptHandler(SkillBoard.cellSizeForTable, cc.TABLECELL_SIZE_FOR_INDEX)
        self._skillView:registerScriptHandler(SkillBoard.tableCellAtIndex, cc.TABLECELL_SIZE_AT_INDEX)
        self._skillView:registerScriptHandler(SkillBoard.numberOfCellsInTableView, cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
    TABLECELL_TOUCHED:TableView被触摸的时候的回调,主要用于选择TableView中的Cell。


    TABLECELL_SIZE_FOR_INDEX:此回调须要返回TableView中Cell的尺寸大小。

    TABLECELL_SIZE_AT_INDEX:此回调须要为TableView创建在某个位置的Cell。

    NUMBER_OF_CELLS_IN_TABLEVIEW:此回调须要返回TableView中Cell的数量。


    然后,我们先看最简单的两个回调函数的演示样例:

    function SkillBoard.cellSizeForTable(view, idx)
    	return 200, 200
    end
    
    function SkillBoard.numberOfCellsInTableView(view)
    	return table.size(local_skills)
    end

    參数中的view表示TableView对象,idx表示Cell的索引。

    再次,我们看看触摸函数。參数cell表示哪一个cell被触摸到了。

    function SkillBoard.tableCellTouched(view, cell)
        local self = GUI.GetGUI("SkillBoard")    
        if self:isOpened() then
            for cl, sitem in pairs(self._skillItems) do
                local issel = (cl == cell)
                sitem:select(issel)
                if issel then
                    self:onClickSkill(sitem:getSkill())
                end
            end
        end
    end
    

      最后。看看最重要的函数,就是映射cell的接口,idx表示cell的索引。

    function SkillBoard.tableCellAtIndex(view, idx)    
        local self = GUI.GetGUI("SkillBoard")
        local cell = view:dequeueCell()
        if not cell then
            cell = cc.TableViewCell:new()
        end
        return cell
    end
    
      是不是特别简单呢?假设须要多样化的cell,比方物品栏。技能栏这些功能,仅仅须要在cell上扩展,创建一些精灵或者button。作为cell的子节点加到cell上就可以。比如:
            cell = cc.TableViewCell:new()
            local image1 = CHOOSE_SERVER_AREA_NORMAL
            local sprite1 = cc.Sprite:createWithSpriteFrameName(image1)
            sprite1:setAnchorPoint(cc.p(0, 0))
            sprite1:setPosition(cc.p(0, 0))
            sprite1:setTag(1)
            cell:addChild(sprite1)
            
            local image2 = CHOOSE_SERVER_AREA_SELECTED
            local sprite2 = cc.Sprite:createWithSpriteFrameName(image2)
            sprite2:setAnchorPoint(cc.p(0, 0))
            sprite2:setPosition(cc.p(0, 0))
            sprite2:setTag(2)
            cell:addChild(sprite2)
    
            local label = cc.Label:createWithSystemFont(strValue, DEFAULT_FONT_TTF, 20)
            label:setAnchorPoint(cc.p(0.5, 0.5))
            label:setPosition(cc.p(77, 30))
            label:setTag(3)
            cell:addChild(label)
    
      好了,主要的用法就如此了,可是。。

    可是。还有最重要的一点,须要大家注意的。

    numberOfCellsInTableView返回的个数和TableView创建的cell数量一般是不一样的,这是由于cocos2dx设计上为了节省资源,创建的cell数量 = tabview的高度 / 单个cell的高度 + 1。所以在触摸和选中等逻辑处理的时候,一定不能使用cell来标识。

    由于同一个cell物理对象。可能会映射N个逻辑对象。

    通常我的做法是在tableCellAtIndex中把当前cell相应的逻辑对象存起来。这样在tableCellTouched就能够直接找到物理cell相应的逻辑对象来处理了。





  • 相关阅读:
    DBF数据库资料
    服务器更改IP(公网)地址后,Program Neighborhood客户端无法连接服务器
    windows server 2003 无法搜索到自己的解决方法
    windows server 2008系统(sp1) 出现MMC无法创建管理单元的解决方法
    Web方式登录出现如下提示The system was not able to acquire a citrix product license...的原因
    Dell2950服务器windows server 2003安装手记
    配置终端用户的输入法
    DELPHI高精度计时方法,取毫秒级时间精度
    金蝶KIS10专业版客户端打开'91'错误:未设置对象变量或 With block 变量的解决方法
    [转载]用三张图片详解Asp.Net 全生命周期
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6945283.html
Copyright © 2011-2022 走看看