Cocos2d-x 2.x:CCTableView的使用
2013-11-11 00:57
375 查看
当需要王者之剑那种地图关卡“翻页”功能时、当需要好友视图中的“列表”功能时恐怕都离不开CCTableView。
一开始看什么ViewDelegate、什么DataSource啊什么的,感觉真麻烦。
-------------------------------美丽的分割线-------------------------
主要实现步骤:
1、创建TableView
2、设置滑动方向
3、设置触摸代理和DataSource。 Ds提供的是Cell的数量、Cell的大小。
4、在触摸代理的tableCellAtIndex()函数中创建Cell。
在TestCpp中,代码如上。看起来使用很简单,Create加相关设置就好了,其实不然。
在这个地方就不要把this看成是TableViewTestLayer的这个布景层这个概念了,this传进去提供的是TableViewTestLayer类从CCTableViewDataSource类继承而来的函数:
接着看init()方法里面的代码:
完整的TableView创建过程已经结束了,下面看看它是在哪、如何创建一个个创建Cell:
最后,处理Cell被触摸的事件:
-------------------------------美丽的分割线-------------------------
我不会告诉你,精华在这:
如果要嵌套TableView,直接在tableCellAtIndex里面实现不就完了么~
想怎么套,就怎么套~
-------------------------------美丽的分割线-------------------------
总结:
1、注意设置触摸代理和DataSource,这两个是TableView能否正常工作的关键。
2、不用担心Cell数量过大,Cell是动态创建的。(因为dequeueCell函数)
3、如果想,滑动一下就是整个Cell的宽度(翻页),需要重写relocateContainer()函数哦~
一开始看什么ViewDelegate、什么DataSource啊什么的,感觉真麻烦。
-------------------------------美丽的分割线-------------------------
主要实现步骤:
1、创建TableView
2、设置滑动方向
3、设置触摸代理和DataSource。 Ds提供的是Cell的数量、Cell的大小。
4、在触摸代理的tableCellAtIndex()函数中创建Cell。
bool TableViewTestLayer::init() { if ( !CCLayer::init() ) { return false; } CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCTableView* tableView = CCTableView::create(this, CCSizeMake(400, 400)); // 设置Source和大小 tableView->setDirection(kCCScrollViewDirectionHorizontal); // 设置滑动方向 tableView->setPosition(ccp(20,winSize.height/2-30)); tableView->setDelegate(this); this->addChild(tableView); // 设置触摸代理。 其实就是设置一个对象,这个对象负责处理对TableView触摸的一些操作 tableView->reloadData();
在TestCpp中,代码如上。看起来使用很简单,Create加相关设置就好了,其实不然。
CCTableView::create(this...这里为何要传入this呢?
在这个地方就不要把this看成是TableViewTestLayer的这个布景层这个概念了,this传进去提供的是TableViewTestLayer类从CCTableViewDataSource类继承而来的函数:
virtual CCSize tableCellSizeForIndex(CCTableView *table, unsigned int idx) { return cellSizeForTable(table); // 获得一个单元格的Size大小 };
virtual CCSize cellSizeForTable(CCTableView *table) { return CCSizeZero; // 返回大小(0,0) (cell可以当做一个有额外功能的CCNode,只用来放子显示对象,因此大小无所谓) };
virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx) = 0; // 返回一个给定索引值的cell,一般情况下,都是在这下面创建cell。(当显示一个cell时,会调用这个,获得它并显示,因此这里创建)
virtual unsigned int numberOfCellsInTableView(CCTableView *table) = 0; // 这里和上面一个函数的“性质”一样,都是在运行时的回调函数,当要显示TableView时,当然先要知道有多少个cell(感觉不科学,但这个就是设置cell数量的地方)
接着看init()方法里面的代码:
tableView->setDelegate(this);现在也能理解设置代理也是用“this”了!
tableView->reloadData(); //reloads data from data source. the view will be refreshed. 简单点说:cell们,都现身吧! ^ ^
完整的TableView创建过程已经结束了,下面看看它是在哪、如何创建一个个创建Cell:
CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx) { CCString *string = CCString::createWithFormat("%d", idx); CCTableViewCell *cell = table->dequeueCell(); if (!cell) { cell = new CustomTableViewCell(); // 只是重载了Draw()方法,在这个里面可以自定义Cell的显示 cell->autorelease(); CCSprite *sprite = CCSprite::create("Images/Icon.png"); sprite->setAnchorPoint(CCPointZero); sprite->setPosition(ccp(0, 0)); cell->addChild(sprite); CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Helvetica", 20.0); label->setPosition(CCPointZero); label->setAnchorPoint(CCPointZero); label->setTag(123); cell->addChild(label); } else { CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123); label->setString(string->getCString()); } return cell; }触发这个函数的地方是CCTableView::insertCellAtIndex(unsigned int idx)
CCTableViewCell *cell = table->dequeueCell(); // 如果目前这个Cell存在,则不创建,否则创建并返回。代码就不贴出来了,这个作用很简单。
最后,处理Cell被触摸的事件:
void TableViewTestLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell) { CCLOG("cell touched at index: %i", cell->getIdx()); }
-------------------------------美丽的分割线-------------------------
我不会告诉你,精华在这:
如果要嵌套TableView,直接在tableCellAtIndex里面实现不就完了么~
想怎么套,就怎么套~
-------------------------------美丽的分割线-------------------------
总结:
1、注意设置触摸代理和DataSource,这两个是TableView能否正常工作的关键。
2、不用担心Cell数量过大,Cell是动态创建的。(因为dequeueCell函数)
3、如果想,滑动一下就是整个Cell的宽度(翻页),需要重写relocateContainer()函数哦~
相关文章推荐
- cocos2d-x学习之旅(二):1.2 cocos2d-x Visual Studio2010 开发环境搭建 windows 7 32位
- Cocos2d-x for XNA:万丈高楼亦可不需平地起
- cocos2d-x 子节点转换父节点之间的操作
- cocos2d-x中CCArray里面CCARRAY_FOREACH的用法
- cocos2d-x获取系统时间
- 如何将cocos2d-x项目打包成一个.exe
- Cocos2D-X for XNA游戏开发指南
- Cocos2D-x for XNA类解析(2): CCDirector(上)
- Cocos2D-x for XNA类解析(1): CCApplication
- Learning Cocos2d-x for XNA(1)——小窥cocos2d-x框架
- wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (一)游戏基础场景搭建
- 使用XNA为Windows phone 7开发简单拼图游戏
- Cocos2D-XNA入门篇
- cocos2d-x 学习笔记 CCTextFieldTTF
- 如何制作一个横版格斗过关游戏Cocos2d-x(2)
- 书生教你cocos2d-x入门篇(四)—资源适配
- 遍历cocos2d-x 场景树
- cocos2d-x3.0 初体验以及遇到的一些问题
- Cocos2d-x中获取设备语言的方法
- cocos2D中实现滑动菜单CCScrollView+CCMenu效果,(注意不是cocos2D-x)!!