上次大體總結了一下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)
當然這樣子。我們的背包的大體樣子就出來。但是它這是展示一下物品還沒有其他功能。因為大多數背包都是支持雙擊和長按的。這個我們后面再慢慢實現吧。
