现在的位置: 首页 > 综合 > 正文

游戏项目中对CCTableView的使用

2014年04月30日 ⁄ 综合 ⁄ 共 2406字 ⁄ 字号 评论关闭

在当的游戏项目中为了找到一个合适的可横向滑动图标列表容器,并且支持选中状态的标记,所以首先想到的是CCListView,当然这也是从一些Cocos2dx的教程书籍中看到的。

但是当我在工程中引用“CCListView.h”的时候才发现cocos2dx 2.1以及之后的版本竟然没有了这个类,当时挺纳闷的,baidu GooG 各种搜索才找到当前cocos2dx的滑动列表类以及命名为CCTableView了,在使用的过程中也遇到了一些问题,OK  下面记录一下使用的方法以及遇到的问题和解决的办法。

首先引入TableView:

#include "cocos-ext.h"

USING_NS_CC_EXT;

class MyTableLayer : public CCLayer ,
                                public CCTableViewDataSource, public CCTableViewDelegate{

};

需要实现的方法:

virtual void scrollViewDidScroll(CCScrollView* in_pView);//需要继承,但是可以不实现内容
    
virtual void scrollViewDidZoom(CCScrollView* in_pView);//需要继承,但是可以不实现内容
    
//处理触摸事件,可以计算点击的是哪一个子项
virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
    
//每一项的宽度和高度
virtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);
    
//生成列表每一项的内容
virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
    
//一共多少项
virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
    
//按下去的时候,就是高亮显示,这里可以设置高亮状态
virtual void tableCellHighlight(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
                                    
//松开的时候,取消高亮状态
virtual void tableCellUnhighlight(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);

TableView的属性设置:

m_pTableView = CCTableView::create(this, CCSizeMake(***, ***));//设置TableView的大小
m_pTableView->setDirection(kCCScrollViewDirectionHorizontal);//这里根据项目需要选中了横向设置
m_pTableView->setAnchorPoint(CCPointZero);
m_pTableView->setPosition(ccp(***, ***));
m_pTableView->setDelegate(this);
m_pTableView->setVerticalFillOrder(kCCTableViewFillTopDown);//数据加载的方式选择了自上至下
this->addChild(m_pTableView);
m_pTableView->reloadData();

TableView的数据加载:

CCTableViewCell* HurtSoldierItemLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
    CCTableViewCell *t_pCell = table->dequeueCell();
    if (!t_pCell) {
        t_pCell = new CCTableViewCell();
        t_pCell->autorelease();
        
    }else{
        t_pCell->removeAllChildren();//这个地方的RemoveAllChildren很重要,一定要记得remove,不认就会导致列表下标和显示重复混乱
         
    }
    
    CCSprite* tmp_pSpSoldierCell = CCSprite::create("BG5.png");
    t_pCell->addChild(tmp_pSpSoldierCell);
    
    return t_pCell;
}

高亮与取消高亮可以根据自己的项目需求来实现,他的默认实现方式是当点击列表中的图标就执行tableCellHighlight,松开点击后马上执行tableCellUnhighlight,原理就就像菜单按钮一样,按下去是一个状态,松开又恢复原来的状态。

OK,其中最值得注意的地方是tableCellAtIndex方法中加载cell是时候一定要记得remove已存在下标的Cell,不然加载会出现覆盖导致顺利混乱有误,网上有个博客针对这个问题给出了一个杀鸡取卵的解决方案,就是去CCTableView::dequeueCell()方法中将if (m_pCellsFreed->count()
==
0)修改成if(1),注意会导致每次dequeueCell都会new出新的Cell,加载数量一多,必定挂掉。


Over

抱歉!评论已关闭.