原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处、作者信息和本声明。否则将追究法律责任。
http://blog.csdn.net/azhou_hui/article/details/8167498
CCTableView用来实现滑动列表的效果。本来想用CCScrollView,不过好像有bug,一直达不到效果。最后还是选用了CCTableView
------------------------------------------------------------------------------------相关代码----------------------------------------------------------------------------
(1)CustomTableViewCell.h
#ifndef __CUSTOMTABELVIEWCELL_H__
#define __CUSTOMTABELVIEWCELL_H__
#include "cocos2d.h"
#include "cocos-ext.h"
class CustomTableViewCell : public cocos2d::extension::CCTableViewCell
{
public:
virtual void draw();
};
#endif /* __CUSTOMTABELVIEWCELL_H__ */
(2)CustomTableViewCell.cpp
#include "CustomTableViewCell.h"
USING_NS_CC;
void CustomTableViewCell::draw()
{
CCTableViewCell::draw();
// draw bounding box
// CCPoint pos = getPosition();
// CCSize size = CCSizeMake(178, 200);
// CCPoint vertices[4]={
// ccp(pos.x+1, pos.y+1),
// ccp(pos.x+size.width-1, pos.y+1),
// ccp(pos.x+size.width-1, pos.y+size.height-1),
// ccp(pos.x+1, pos.y+size.height-1),
// };
// ccDrawColor4B(0, 0, 255, 255);
// ccDrawPoly(vertices, 4, true);
}
(3)TableViewMenuLayer.h
#ifndef __TABLEVIEWMENULAYER_H__
#define __TABLEVIEWMENULAYER_H__
//城市界面右边的滑动菜单项列表Layer,这个用的是CCTableView
#include "cocos2d.h"
#include "cocos-ext.h"
using namespace cocos2d;
using namespace cocos2d::extension;
class TableViewMenuLayer : public cocos2d::CCLayer, public cocos2d::extension::CCTableViewDataSource, public cocos2d::extension::CCTableViewDelegate
{
public:
static TableViewMenuLayer *instance;
public:
TableViewMenuLayer(void);
~TableViewMenuLayer(void);
public:
virtual bool init();
CREATE_FUNC(TableViewMenuLayer);
virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view) {};
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view) {}
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);
};
#endif //__TABLEVIEWMENULAYER_H__
(4)TableViewMenuLayer.cpp
#include "TableViewMenuLayer.h"
#include "CustomTableViewCell.h"
#include "MenuInfoLayer.h"
using namespace cocos2d;
using namespace cocos2d::extension;
TableViewMenuLayer::TableViewMenuLayer(void)
{
}
TableViewMenuLayer::~TableViewMenuLayer(void)
{
}
//初始化静态成员
TableViewMenuLayer* TableViewMenuLayer::instance=NULL;
// on "init" you need to initialize your instance
bool TableViewMenuLayer::init()
{
if ( !CCLayer::init() )
{
return false;
}
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
// Add the BG
CCSprite* tableViewBG = CCSprite::create("right.png");
tableViewBG->setPosition(ccp(winSize.width-45, winSize.height/2));
this->addChild(tableViewBG);
CCSprite* upBG = CCSprite::create("up.png");
upBG->setPosition(ccp(winSize.width-45, winSize.height-30));
this->addChild(upBG);
CCSprite* downBG = CCSprite::create("down.png");
downBG->setPosition(ccp(winSize.width-45, 10));
this->addChild(downBG);
// Add the CCTableView
CCTableView *tableView = CCTableView::create(this, CCSizeMake(80, 690));
tableView->setDirection(kCCScrollViewDirectionVertical);
tableView->setPosition(ccp(winSize.width-85,28));
tableView->setDelegate(this);
tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
this->addChild(tableView);
tableView->reloadData();
return true;
}
void TableViewMenuLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
{
//打印相应cell的Idx
CCLOG("cell touched at index: %i", cell->getIdx());
//调用相应的菜单功能
CCSize size = CCDirector::sharedDirector()->getWinSize();
// add the MenuInfoLayer
if (this->getChildByTag(101))
{
this->removeChildByTag(101,true);
}
MenuInfoLayer *menuInfoLayer = MenuInfoLayer::create();
this->addChild(menuInfoLayer,0,101);
menuInfoLayer->runAction(CCMoveBy::create(0.3,ccp(-size.width,0)));
}
CCSize TableViewMenuLayer::cellSizeForTable(CCTableView *table)
{
return CCSizeMake(80, 115);
}
CCTableViewCell* TableViewMenuLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCString *string;
switch(idx)
{
case 0: string = CCString::createWithFormat("%s", "CITY"); break;
case 1: string = CCString::createWithFormat("%s", "WORLD"); break;
case 2: string = CCString::createWithFormat("%s", "BATTLE"); break;
case 3: string = CCString::createWithFormat("%s", "CityInfo"); break;
case 4: string = CCString::createWithFormat("%s", "Commander"); break;
case 5: string = CCString::createWithFormat("%s", "Equipment"); break;
case 6: string = CCString::createWithFormat("%s", "Quest"); break;
case 7: string = CCString::createWithFormat("%s", "Items"); break;
case 8: string = CCString::createWithFormat("%s", "Military"); break;
case 9: string = CCString::createWithFormat("%s", "Legion"); break;
case 10: string = CCString::createWithFormat("%s", "Rank"); break;
case 11: string = CCString::createWithFormat("%s", "Report"); break;
case 12: string = CCString::createWithFormat("%s", "News"); break;
case 13: string = CCString::createWithFormat("%s", "System"); break;
case 14: string = CCString::createWithFormat("%s", "Shop"); break;
case 15: string = CCString::createWithFormat("%s", "Friend"); break;
default:string = CCString::createWithFormat("%s", "Error");
}
// the cell
CCTableViewCell *cell = table->dequeueCell();
if (!cell) {
// the sprite
cell = new CustomTableViewCell();
cell->autorelease();
CCSprite *sprite = CCSprite::create("CloseNormal.png");
sprite->setAnchorPoint(ccp(0, 0));
sprite->setPosition(ccp(0, 30));
sprite->setTag(456);
cell->addChild(sprite);
// the label
CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Thonburi", 13);
label->setPosition(ccp(40, 20));
label->setTag(123);
cell->addChild(label);
}
else
{
// the sprite
cell->removeChildByTag(456,true);
CCSprite *sprite ;
switch(idx)
{
case 0: sprite = CCSprite::create("city.png");break;
case 1: sprite = CCSprite::create("world.png");break;
case 2: sprite = CCSprite::create("battle.png");break;
case 3: sprite = CCSprite::create("cityInfo.png");break;
case 4: sprite = CCSprite::create("hero.png");break;
case 5: sprite = CCSprite::create("equipment.png");break;
case 6: sprite = CCSprite::create("task.png");break;
case 7: sprite = CCSprite::create("treasure.png");break;
case 8: sprite = CCSprite::create("army.png");break;
case 9: sprite = CCSprite::create("guild.png");break;
case 10: sprite = CCSprite::create("rank.png");break;
case 11: sprite = CCSprite::create("report.png");break;
case 12: sprite = CCSprite::create("message.png");break;
case 13: sprite = CCSprite::create("system.png");break;
case 14: sprite = CCSprite::create("mall.png");break;
case 15: sprite = CCSprite::create("friend.png");break;
default:sprite = CCSprite::create("CloseNormal.png");
}
sprite->setAnchorPoint(ccp(0, 0));
sprite->setPosition(ccp(0, 35));
sprite->setTag(456);
cell->addChild(sprite);
// the label
CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
label->setString(string->getCString());
}
return cell;
}
unsigned int TableViewMenuLayer::numberOfCellsInTableView(CCTableView *table)
{
return 16;
}
(5)CityScene.cpp 调用界面,调用时直接在scene里调用该layer(包含包含的头文件)
#include "TableViewMenuLayer.h" // add TableViewMenuLayer TableViewMenuLayer *tableViewMenuLayer = TableViewMenuLayer::create(); TableViewMenuLayer::instance=tableViewMenuLayer; this->addChild(tableViewMenuLayer,10);