ScrollView与TableView实现选择效果

前端之家收集整理的这篇文章主要介绍了ScrollView与TableView实现选择效果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在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@;
}

其中在TableView中使用了代理的设计模式,类要继承public CCTableViewDataSource,public CCTableViewDelegate,并且实现他们的纯虚函数,从而达到代理的效果

运行效果

猜你在找的Cocos2d-x相关文章