上次大体总结了一下CCScrollView,一直想再总结一下CCTableView,但是一直懒得的动弹,今晚要和同事调试代码,趁同事改bug的时间,把它简单的总结一下吧。
CCTableView在游戏中一般用在背包这样场景或层中,当然也不止这些,在ios开发中UITableView的应用是相当的广泛,当然它们的用途是一样的。(其实你会发现CCtableView其实就是参照UITableView来写的,所以做过ios开发的同学happy了)。
既然说到了用到背包的地方,那么我们就做一个简单的背包信息的例子来学习它吧。
先上代码再说 .h文件
// // CCTableViewLayer.h // Cocos2dXLearnDemo // // Created by 丁 昌兴 on 12-12-31. // //
#ifndef __Cocos2dXLearnDemo__CCTableViewLayer__ #define __Cocos2dXLearnDemo__CCTableViewLayer__
#include <iostream> #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT;
class CCTableViewLayer:publicCCLayer,publicCCTableViewDataSource,publicCCTableViewDelegate{ public: // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer) virtual bool init();
// preprocessor macro for "static create()" constructor ( node() deprecated ) CREATE_FUNC(CCTableViewLayer);
// DataSource /** * cell height for a given table. * * @param table table to hold the instances of Class * @return cell size */ virtual CCSize cellSizeForTable(CCTableView *table); /** * a cell instance at a given index * * @param idx index to search for a cell * @return cell found at idx */ virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx); /** * Returns number of cells in a given table view. * * @return number of cells */ virtual unsigned int numberOfCellsInTableView(CCTableView *table);
//delegate virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell); // 另外还要引入CCScrollViewDelegate的虚函数,原因是CCTableView继承自CCScrollView virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view);
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view); };
#endif /* defined(__Cocos2dXLearnDemo__CCTableViewLayer__) */ |
.m文件
// // CCTableViewLayer.cpp // Cocos2dXLearnDemo // // Created by 丁 昌兴 on 12-12-31. // //
#include "CCTableViewLayer.h" #include "TestSprite.h" boolCCTableViewLayer::init(){
if(!CCLayer::init()){ returnfalse; }
// 第一个参数是dataSource CCTableView *tableView=CCTableView::create(this, CCSizeMake(480, 240)); tableView->setPosition(ccp(0, 0)); // 设置方向 tableView->setDirection(kCCScrollViewDirectionVertical); tableView->setAnchorPoint(CCPointZero); // tableView->setAnchorPoint(ccp(0.5, 0.5)); tableView->setPosition(ccp(0,50)); tableView->setDelegate(this); CCLOG("AnchPoint=%f,%f",tableView->getAnchorPoint().x,tableView->getAnchorPoint().y); // 设置顺序是自上往下 tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
// CCLOG("tableView->getPosition()=%f,%f",tableView->getPosition().x,tableView->getPosition().y); this->addChild(tableView); // CCLOG("AfterAnchPoint=%f,%f",tableView->getAnchorPoint().x,tableView->getAnchorPoint().y); tableView->reloadData(); this->setTouchEnabled(true);
returntrue; } //datasource
CCSizeCCTableViewLayer::cellSizeForTable(CCTableView *table){ return CCSizeMake(table->getContentSize().width, 100); } CCTableViewCell* CCTableViewLayer::tableCellAtIndex(CCTableView *table, unsignedint idx){ CCTableViewCell *cell = table->dequeueCell(); if(!cell){ cell = new CCTableViewCell(); cell->autorelease(); } cell->removeAllChildrenWithCleanup(true); for (int i=0; i<3; i++) {
CCSprite *testSprite=CCSprite::create("Icon.png"); testSprite->setPosition(ccp(240+100*i, 30)); cell->addChild(testSprite); } return cell; }
unsigned int CCTableViewLayer::numberOfCellsInTableView(CCTableView *table){ return 20; }
//delegate voidCCTableViewLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell){ // CCLog("HHHHHHHH"); }
void CCTableViewLayer::scrollViewDidScroll(CCScrollView* view){ // CCLOG("scrollViewDidScroll"); } //设置Zoom的时候进行调用 void CCTableViewLayer::scrollViewDidZoom(CCScrollView* view){ // CCLOG("scrollViewDidZoom"); } |
首先CCTableView继承自CCScrollView,自然它是在 Cocosd-x 的扩展库里面.
所以你会发现要引入下面两个虚函数。
virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view) {}
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view) {}
另外它的用法基本和UITableView是一样的。当然我们这里要继承
publicCCTableViewDataSource,publicCCTableViewDelegate。
几个方法和UITableView的都差不多。
//CCTableViewDataSource
CCSizeCCTableViewLayer::cellSizeForTable(CCTableView *table)
unsigned int CCTableViewLayer::numberOfCellsInTableView(CCTableView *table)
CCTableViewCell* CCTableViewLayer::tableCellAtIndex(CCTableView *table, unsignedint idx)
//CCTableViewDelegate
void CCTableViewLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
当然这样子。我们的背包的大体样子就出来。但是它这是展示一下物品还没有其他功能。因为大多数背包都是支持双击和长按的。这个我们后面再慢慢实现吧。