Cocos2d-x CCTableView实现列表

Cocos2d-x CCTableView实现列表,第1张

概述原文   http://www.voidcn.com/article/p-vcfyfqot-yt.html 在ios程序设计中,会大量使用到tableview视图(UITableView),那么在cocos2d-x中,如果需要类似的列表,该如何实现呢?在引擎中参照ios中的UITableView实现了一个叫做CCTableView的类,用于创建列表,对于熟悉ios程序设计的人来说,这个内容应该是很 原文 http://www.jb51.cc/article/p-vcfyfqot-yt.html

在ios程序设计中,会大量使用到tablevIEw视图(UItableVIEw),那么在cocos2d-x中,如果需要类似的列表,该如何实现呢?在引擎中参照ios中的UItableVIEw实现了一个叫做CCtableVIEw的类,用于创建列表,对于熟悉ios程序设计的人来说,这个内容应该是很好理解的。

下面这篇博客就介绍一下是如何使用这个CCtableVIEw的吧!

这个文件是在extensions这个文件夹中的:


下面通过一个demo详细介绍一下。

1、使用的时候要注意要引入扩展库文件:#include"cocos-ext.h"

并且最好要添加: USING_NS_CC_EXT; 这样就不用老是加前缀cocos2d::extension

#define USING_NS_CC_EXT                     using namespace cocos2d::extension@H_502_40@   

2、要继承CCtableVIEw的两个代理 CCtableVIEwDelegate 和 CCtableVIEwDataSource

所以首先要继承这里两个代理:

class HelloWorld : public cocos2d::cclayer,public cocos2d::extension::CCtableVIEwDelegate,public cocos2d::extension::CCtableVIEwDataSource@H_502_40@   

其中至少要实现以下的代理方法:

//触摸到某个cell的事件    virtual voID tableCelltouched(cocos2d::extension::CCtableVIEw* table,cocos2d::extension::CCtableVIEwCell* cell);        //定制每个cell的size    virtual cocos2d::CCSize tableCellSizeforIndex(cocos2d::extension::CCtableVIEw *table,unsigned int IDx);        //定制每个cell的内容    virtual cocos2d::extension::CCtableVIEwCell* tableCellAtIndex(cocos2d::extension::CCtableVIEw *table,136); Font-style:italic">//确定这个tablevIEw的cell行数    virtual unsigned int numberOfCellsIntableVIEw(cocos2d::extension::CCtableVIEw *table);@H_502_40@   
可以选择实现:
//设置单元格高亮的状态    virtual voID tableCellHighlight(CCtableVIEw* table,CCtableVIEwCell* cell);    //设置单元格非高亮的状态    virtual voID tableCellUnhighlight(CCtableVIEw* table,CCtableVIEwCell* cell);@H_502_40@   
3、有于CCtableVIEw是继承 CCScrollVIEw ,所以必须要继承这两个方法,但是什么都不做,只是空实现而已。
//由于CCtableVIEw是继承CCScrollVIEw,所以要继承这两个方法    virtual voID scrollVIEwDIDScroll(cocos2d::extension::CCScrollVIEw* vIEw) {}    virtual voID scrollVIEwDIDZoom(cocos2d::extension::CCScrollVIEw* vIEw) {}@H_502_40@   
4、按照需要实现代理方法。

首先看看我定制的tablevIEw吧!

其中每一个cell包含的内容:一个背景sprite(蓝色),左边一个label,中间一个menu。

(1)触摸到某个cell的事件处理:

voID HelloWorld::tableCelltouched(cocos2d::extension::CCtableVIEw *table,cocos2d::extension::CCtableVIEwCell *cell){    cclOG("you touch cell index = %u",cell->getIDx());}@H_502_40@   
(2)定制每一个cell的size
CCSize HelloWorld::tableCellSizeforIndex(cocos2d::extension::CCtableVIEw int IDx){    return CCSizeMake(337,55);}@H_502_40@   
(3)定制一个tablevIEw的cell的个数
unsigned int HelloWorld::numberOfCellsIntableVIEw(cocos2d::extension::CCtableVIEw *table){    return 10;}@H_502_40@   
(4)定制每一个cell的内容
CCtableVIEwCell* HelloWorld::tableCellAtIndex(cocos2d::extension::CCtableVIEw *table,unsigned int IDx){    CCString *string = CCString::createWithFormat("index = %d"*cell = table->dequeueCell();    if (!cell) {        cell = new CustomtableCell();        cell->autorelease();                //添加背景图片        CCSprite *sprite = CCSprite::create("22.png");        sprite->setAnchorPoint(CCPointZero);        sprite->setposition(ccp(0));        cell->addChild(sprite,255)">1);                添加label        cclabelTTF *label = cclabelTTF::create(string->getCString(),"Arial"15);        label->setAnchorPoint(CCPointZero);        label->setTag(123);        label->cocos2d::CCNode::setposition(5);        cell->addChild(label,255)">2添加menu        CcmenuItemImage *itemImage = CcmenuItemImage::create("23.png""24.png"*menu = Ccmenu::create(itemImage,NulL);                注意Ccmenu是无法修改锚点的,其默认位置是在其几何中心        menu->setposition(ccp(18026));            可以通过修改CcmenuItemImage的锚点的位置    //        itemImage->setAnchorPoint(CCPointZero);    // menu->setposition(ccp(180,6)); cell->addChild(menu,2); } else { //由于每一个cell的label都是不同的,所以我们通过tag值获取到label来对label进行修改 cclabelTTF *label = (cclabelTTF*)cell->getChildByTag(123); label->setString(string->getCString()); } return cell; } voID HelloWorld::menuCallBack(cocos2d::CCObject *pSender) { CCtableVIEwCell *cell = (CCtableVIEwCell*)(((CcmenuItemImage*)pSender)->getParent()->getParent()); cclog("menu click cell index : %d",cell->getIDx()); }@H_502_40@   
这一部分是最重要的部分,稍微解说一下吧!

①这里tablevIEw也是用到了ios中cell的重用机制:CCtableVIEwCell*cell = table->dequeueCell(); 当然这也导致了下面的一些问题:每一个cell 的 label 中的内容都是不一样的,所以要对label进行一些处理。

②添加menu,我们可能要在menu点击的时候获取所在cell的一些消息,这里也要注意是如何处理的:是通过两次getParent获取到cell。

③还有在添加menu的时候意外发现一个问题:

Ccmenu是无法修改锚点值的,其锚点值是在其几何位置的中心。但是我们可以修改其子项的锚点值。

④由于Menu的触摸响应优先级是最高的,所以点击menu的时候是不会触发 cell 的 touch 事件的。

⑤在向cell添加内容的时候要注意zOrder,否则有可能被其他元素覆盖了。

⑥其中的tablevIEw cell是可以定制的,代码中用到的 CustomtableCell 内容如下:

#ifndef __tableVIEw__CustonTabelCell__#define __tableVIEw__CustonTabelCell__#include <iostream>#include "cocos-ext.h"#include "cocos2d.h"USING_NS_CC;USING_NS_CC_EXT;class CustomtableCell:public cocos2d::extension::CCtableVIEwCell{public:    voID draw();};#endif /* defined(__tableVIEw__CustonTabelCell__) */@H_502_40@   
#include "CustonTabelCell.h"voID CustomtableCell::draw(){    CCtableVIEwCell::draw();}@H_502_40@   
其中是没有添加定制实现的。

5、设置cell被点击时高亮和非高亮。

voID HelloWorld::tableCellHighlight(cocos2d::extension::CCtableVIEw *cell){    cclog("High light");    CCSprite *sprite1 = CCSprite::create("21.png");    sprite1->setTag(21);    sprite1->setopacity(125); //设置透明度    sprite1->setAnchorPoint(CCPointZero);    sprite1->setposition(ccp(0,153)">0));    cell->addChild(sprite1,153)">3);}voID HelloWorld::tableCellUnhighlight(cocos2d::extension::CCtableVIEw "Unhigh light");    cell->removeChildByTag(21);}@H_502_40@   

好啦,大概tablevIEw常用的一些 *** 作就是这些了,当然CCTabelVIEw中还有一些其他方法,这些都是和ios中的差不多的,需要的时候查看就可以了。

总结

以上是内存溢出为你收集整理的Cocos2d-x CCTableView实现列表全部内容,希望文章能够帮你解决Cocos2d-x CCTableView实现列表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存