在手机游戏的开发中,滚动是一项很重要的操作,而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相应的逻辑对象来处理了。

关于cocos2dx之lua使用TableView的更多相关文章

  1. Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]

    Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...

  2. 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

    转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...

  3. 《Cocos2d-x实战 Lua卷》上线了

    感谢大家一直以来的支持!各大商店均开始销售:京东:http://item.jd.com/11659697.html当当:http://product.dangdang.com/23659810.htm ...

  4. 如何使用ZEROBRANE STUDIO远程调试COCOS2D-X的LUA脚本(转)

    http://www.cocos2d-x.org/docs/manual/framework/native/v2/lua/lua-remote-debug-via-zerobrane/zh ZeroB ...

  5. 分析cocos2d-x的lua项目中的工具方法

    在创建完cocos2d-x的lua项目后.打开项目的Resources中的extern.lua文件.里面有两个用于面向对象的方法.一个是用于克隆,一个是用于继承. 代码分析例如以下 --克隆一个对象 ...

  6. cocos2dx的lua绑定

    一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...

  7. cocos2d-x的lua脚本加载CocostudioUI两种方式

    前言 当前版本使用的是quick cocos2dx lua 3.3.UI使用cocostudio编辑器1.6.0.我们在程序里面可以使用两种方式进行解析UI.开始的时候用的是quick的方法, 结果遇 ...

  8. cocos2dx与Lua以及quick cocos

    1.cocos2dx中的脚本架构与组件 2.quick cocos的开发优势 3.自定义c++类如何导出到lua

  9. cocos2dx解析lua table数据结构 简易版.

    之前一直用xml填配置, cocos2dx自带了xml解析接口, 非常方便. 但是, 接口好用也改变不了xml的结构字符太多, 书写麻烦, 乱七八糟的事实. 很早就想换lua, 无奈引擎没有现成接口, ...

随机推荐

  1. nj07---npm

    一.如何使用包管理器 Node.js包管理器,即npm是Node.js官方提供的包管理工具,它已经成了Node.js包的标准发布平台,用于Node.js包的发布.传播.依赖控制.(可以下载上面的包也可 ...

  2. bzoj3438: 小M的作物(那年花开最小割)

    3438: 小M的作物 题目:传送门 题解: 最小割标准水题(做了几天的最小割之后表示是真的水) 为什么水:博主已经做过两道基本一样的题目了... 详情参考:bzoj3894 代码: #include ...

  3. matplotlib 可视化 —— 定制 matplotlib

    1. matplotlibrc 文件 matplotlib使用matplotlibrc [matplotlib resource configurations] 配置文件来自定义各种属性,我们称之为 ...

  4. BZOJ 2342 Manacher

    思路: 首先用manacher可以求出以i和i+1中间为对称轴,最长回文串能扩增的长度p[i]. 然后4*(y-x)能更新答案,当且仅当y≤x+p[x]/2且y-p[y]≤x. 按i-p[i]将所有点 ...

  5. Java类和对象5

    写一个Java应用程序,该应用程序包括2个类:Print类和主类E.Print类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的立方和等于这个三位数本身,如: 3 ...

  6. Svn中的tag标签的用法和意义

    使用场景: 假如你的项目的某个版本已经完成测试开发.测试并已经上线,接下来街道新的需求,新项目开发需要修改多个文件的代码,当需求已经开发一段时间的时候,突然接到用户和测试人员的反馈,项目中某个重大的b ...

  7. Linux下安装使用MySQL

    网上找那些安装教程比较多的版本,版本只要不是太旧就行. 下载mysql 5.6.28 通用版64位二进制版,二进制版相当于windows的安装包,可以直接安装,如果是源码版,还需要编译后再进行安装. ...

  8. php实现自动加载类

    PHP 实现自动加载类:

  9. vscode 调试vue.js程序

    npm install -g vue-cli                //安装vue-clivue init webpack projectName  //创建项目 1.Ctrl+~ 打开命令行 ...

  10. 洛谷1019 单词接龙 字符串dfs

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...