在cocos2dx中,ScrollView与TableView都可以实现选择效果,其中ScrollView较为原始,TableView的格子大小可以不与winSize一样大。
ScrollView实现
#include "T25ScrollView.h"@H_403_7@
#include "AppMacros.h"@H_403_7@
CCScene* T25ScrollView::scene()
{
CCScene *scene@H_403_7@=CCScene::create();
T25ScrollView* layer=T25ScrollView::create();
scene->addChild(layer);
return@H_403_7@ scene;
}
bool T25ScrollView::init()
{
CCLayer::init();
CCNode *node@H_403_7@=CCNode::create();
_node=node;
char buf[]="a"@H_403_7@;
for@H_403_7@ (int@H_403_7@ i=0@H_403_7@;i<5@H_403_7@;i++)
{
CCSprite *s@H_403_7@=CCSprite::create("HelloWorld.png"@H_403_7@);
node->addChild(s@H_403_7@);
s@H_403_7@->setPosition(ccp(i*winSize@H_403_7@.width,0@H_403_7@));
s@H_403_7@->setAnchorPoint(ccp(0@H_403_7@,0@H_403_7@));
CCLabelTTF *label@H_403_7@=CCLabelTTF::create(buf,"Arial"@H_403_7@,24@H_403_7@);
buf[0@H_403_7@]++;
s@H_403_7@->addChild(label);
label->setPosition(ccp(winSize.width/2@H_403_7@,winSize.height/2@H_403_7@));
}
CCScrollView *view@H_403_7@=CCScrollView::create(winSize,node);
addChild(view);
view->setDirection(kCCScrollViewDirectionHorizontal);
view->setContentSize(CCSizeMake(winSize.width*5@H_403_7@,winSize.height));
view->setBounceable(false); //get@H_403_7@ rid of elastic
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
return@H_403_7@ true;
}
bool T25ScrollView::ccTouchBegan(CCTouch *pTouch@H_403_7@,CCEvent *pEvent@H_403_7@)
{
return@H_403_7@ true;
}
void T25ScrollView::adjustViewPosition(float dt)
{
//calculate@H_403_7@
int@H_403_7@ fitPos[]={0@H_403_7@,-winSize.width,-winSize.width*2@H_403_7@,-winSize.width*3@H_403_7@,-winSize.width*4@H_403_7@};
int@H_403_7@ x@H_403_7@=_node->getPositionX();
int@H_403_7@ i;
for@H_403_7@(i=0@H_403_7@;i<5@H_403_7@;i++)
{
int@H_403_7@ dist=abs@H_403_7@(fitPos[i]-x@H_403_7@);
if@H_403_7@ (dist<winSize.width/2@H_403_7@)
{
break@H_403_7@;
}
}
CCPoint ptDest=ccp(fitPos[i],0@H_403_7@);
_node->runAction(CCMoveTo::create(0@H_403_7@.2@H_403_7@f,ptDest));
}
void T25ScrollView::ccTouchEnded(CCTouch *pTouch@H_403_7@,CCEvent *pEvent@H_403_7@)
{
//judge@H_403_7@ if@H_403_7@ is slider
if@H_403_7@ (isSlider(pTouch))
{
//adjust@H_403_7@ position
scheduleOnce(schedule_selector(T25ScrollView::adjustViewPosition),0@H_403_7@.05@H_403_7@f);
return@H_403_7@;
}
//judge which position is clicked
CCPoint ptWorld=pTouch->getLocation();
CCPoint ptNode=_node->convertToNodeSpace(ptWorld);
int@H_403_7@ index@H_403_7@=ptNode.x@H_403_7@/winSize.width;
CCLog("click index =%d@H_403_7@"@H_403_7@,index@H_403_7@);
}
bool T25ScrollView::isSlider(CCTouch *PTouch@H_403_7@)
{
CCPoint ptCur=PTouch->getLocation();
CCPoint ptStart=PTouch->getStartLocation();
if@H_403_7@ (ptCur.getDistanceSq(ptStart)@H_403_7@>25@H_403_7@)
{
return@H_403_7@ true;
}
return@H_403_7@ false;
}
TableView实现
#include@H_403_7@ "T26TableView.h"@H_403_7@
#include@H_403_7@ "AppMacros.h"@H_403_7@
CCScene*@H_403_7@ T26TableView::scene@H_403_7@()
{
CCScene *@H_403_7@scene=@H_403_7@CCScene::create@H_403_7@();
T26TableView*@H_403_7@ layer=@H_403_7@T26TableView::create@H_403_7@();
scene->@H_403_7@addChild(layer);
return@H_403_7@ scene;
}
bool T26TableView::init@H_403_7@()
{
CCLayer::init@H_403_7@();
CCSize cellSize=@H_403_7@CCSize(80@H_403_7@,80@H_403_7@);
_cells=@H_403_7@CCArray::create@H_403_7@();
_cells->@H_403_7@retain();
for(int i=@H_403_7@0@H_403_7@;i<@H_403_7@5@H_403_7@;i++@H_403_7@)
{
CCTableViewCell *@H_403_7@cell=@H_403_7@new@H_403_7@ CCTableViewCell;
_cells->@H_403_7@addObject(cell);
cell->@H_403_7@autorelease();
CCSprite *@H_403_7@sprite=@H_403_7@CCSprite::create@H_403_7@("p_2_01.png"@H_403_7@);
cell->@H_403_7@addChild(sprite);
sprite->@H_403_7@setPosition(ccp(cellSize.@H_403_7@width/2@H_403_7@,cellSize.@H_403_7@height/2@H_403_7@));
}
CCTableView *@H_403_7@view=@H_403_7@CCTableView::create@H_403_7@(this,CCSize(cellSize.@H_403_7@width*@H_403_7@3@H_403_7@,cellSize.@H_403_7@height));
addChild(view);
view->@H_403_7@setDirection(kCCScrollViewDirectionHorizontal);
view->@H_403_7@reloadData();
view->@H_403_7@setPosition(ccp(200@H_403_7@,200@H_403_7@));
//response click@H_403_7@
view->@H_403_7@setDelegate(this);
return@H_403_7@ true@H_403_7@;
}