CCScrollView、CCTableView使用事例

#ifndef __Guess__LevelScrollLayer__
#define __Guess__LevelScrollLayer__

#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
#include "CResource.h"
#include "LevelManager.h"

//单元格
class Cell  : public cocos2d::extension::CCTableViewCell
{
public:
    static Cell *create(int idx, bool unlock);
    void init(int idx, bool unlock);
    //改变颜色.isNew是否为新的颜色
    void changeColor(bool isNew);
   
private:
    RcLevelSceneScroll m_rc;                        //资源类
    cocos2d::CCLabelTTF *m_lbl;
    CCSprite *m_sprite;
    ccColor3B m_oriColor, m_newColor;
};

//滚动层
class LevelScrollLayer : public cocos2d::CCLayer, public cocos2d::extension::CCTableViewDelegate, public cocos2d::extension::CCTableViewDataSource
{
public:
    virtual bool init();
    static cocos2d::CCScene *scene();
    CREATE_FUNC(LevelScrollLayer);

    //添加结点
    void addSprite(const RC &rc);
    LevelManager *m_lm;                      //关卡管理类
    
    virtual void onExit();

private:
    int m_selected;                         //选中的cellId
    //初始化图片
    void initImages();
    //改图片
    void changeImage(unsigned index);
    RcLevelSceneScroll m_rc;                        //资源类
    cocos2d::extension::CCTableView *tableView;     //表格视图
    CCMenu *m_imgMenu;                              //图片menu
    
    //表格代理方法
    virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
    virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
    virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
    virtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);
    virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view);
    virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view);
};



//
//  LevelScrollLayer.cpp
//  Guess
//
//  Created by zctech on 14-3-4.
//
//


#include "LevelScrollLayer.h"
USING_NS_CC;
USING_NS_CC_EXT;
#include "LevelScene.h"


const int TAG_IMG_ITEM[4] = {101, 102, 103, 104};   //menuItem的tag值

bool LevelScrollLayer::init()
{
    if(!CCLayer::init())
    {return false;}
    
    m_lm = LevelManager::sharedManager();
    m_selected = -1;
    initImages();

    //添加tableView
    this->tableView = CCTableView::create(this, m_rc.sz_table);
    this->tableView->setDirection(kCCScrollViewDirectionVertical);
    this->tableView->setAnchorPoint(CCPointZero);
    this->tableView->setPosition(CCPointZero);
    this->tableView->setDelegate(this);
    this->tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
    this->addChild(this->tableView);
    
    return true;
}



//初始化图片
void LevelScrollLayer::initImages()
{
    if(m_lm->count() == 0)
    {return;}
    Level *l = m_lm->levelAtIndex(0);
    
    
    m_imgMenu = CCMenu::create();
    //添加四张图片
    m_imgMenu->setPosition(m_rc.m_imgMenu.pos);
    for (int i = 0; i < 4; i++)
    {
        CCSprite *img = CCSprite::create(l->getFileName(i).c_str());
        CCSize sz = img->getContentSize();
        float scaleX = m_rc.m_img[i].size.width / sz.width;
        float scaleY = m_rc.m_img[i].size.height / sz.height;
        img->setScaleX(scaleX);
        img->setScaleY(scaleY);
        float dtX = (1 - scaleX) * sz.width / 2.0;
        float dtY = (1 - scaleY) * sz.height / 2.0;
        
        
        CCMenuItemImage *item = CCMenuItemImage::create();
        item->setNormalImage(img);
        item->setTag(TAG_IMG_ITEM[i]);
        item->setPosition(ccp(m_rc.m_img[i].pos.x + dtX,  m_rc.m_img[i].pos.y + dtY));
        m_imgMenu->addChild(item);
    }
    this->addChild(m_imgMenu);
}

void LevelScrollLayer::changeImage(unsigned index)
{
    Level *l = m_lm->levelAtIndex(index);
    for (int i = 0; i < 4; i++)
    {
        CCSprite *img = CCSprite::create(l->getFileName(i).c_str());
        CCMenuItemImage *item = (CCMenuItemImage *)m_imgMenu->getChildByTag(TAG_IMG_ITEM[i]);
        item->setNormalImage(img);
    }
}

CCScene *LevelScrollLayer::scene()
{
    CCScene* scene = CCScene::create();
    LevelScrollLayer* layer = LevelScrollLayer::create();
    scene->addChild(layer);
    return scene;
}

//添加结点
void LevelScrollLayer::addSprite(const RC &rc)
{
    CCSprite *sprite = CCSprite::create(rc.fname.c_str());
    sprite->setPosition(rc.pos);
    this->addChild(sprite);
}

//表格代理方法
void LevelScrollLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell){
   
    Level *level = m_lm->levelAtIndex(cell->getIdx());
    if(level->getUnlocked() && m_selected != cell->getIdx())
    {
        changeImage(cell->getIdx());
        
        //修改原来的单元格
        Cell *c = dynamic_cast<Cell *>(tableView->cellAtIndex(m_selected));
        c->changeColor(false);
        
        //修改新的单元格颜色
        c = dynamic_cast<Cell *>(cell);
        c->changeColor(true);
        
        m_selected = cell->getIdx();
        
        LevelScene::selectedIndex = m_selected;
    }
}
CCTableViewCell* LevelScrollLayer::tableCellAtIndex(CCTableView *table, unsigned int idx){
    
    Cell *cell = dynamic_cast<Cell *>(table->dequeueCell());
    
    if(!cell)
    {
        cell = new Cell();
        cell->init(idx, m_lm->levelAtIndex(idx)->getUnlocked());
        if(0 == idx)
        {
            cell->changeColor(true);
            m_selected = 0;
        }
        cell->autorelease();
    }
    
    return cell;
}
unsigned int LevelScrollLayer::numberOfCellsInTableView(CCTableView *table){
    
    return m_lm->count();
}
CCSize LevelScrollLayer::cellSizeForTable(CCTableView *table){
    
    return m_rc.sz_cell;
}
void LevelScrollLayer::scrollViewDidScroll(CCScrollView* view){
    
}
void LevelScrollLayer::scrollViewDidZoom(CCScrollView* view){
    
}

void LevelScrollLayer::onExit()
{
    CCLayer::onExit();
}



Cell *Cell::create(int idx, bool unlock)
{
    Cell *cell = new Cell();
    cell->init(idx, unlock);
    cell->autorelease();
    return cell;
}

void Cell::init(int idx, bool unlock)
{
    m_oriColor = ccc3(255, 255, 255);
    m_newColor = ccc3(255, 0, 0);
    
    //添加背景单元格
    m_sprite = CCSprite::create(m_rc.m_level.fname.c_str());
    m_sprite->setPosition(ccp(m_rc.sz_table.width / 2, m_rc.sz_cell.height / 2.0));
    this->addChild(m_sprite);
    
    
    //添加用户名标签
    CCString *str = CCString::createWithFormat("第%d关", idx + 1);
    m_lbl=CCLabelTTF::create(str->getCString(), "Arial", 25.0);
    m_lbl->setColor(m_oriColor);
    m_lbl->setPosition(ccp(m_rc.sz_table.width / 2, m_rc.sz_cell.height / 2.0));
    
    //是否解锁
    if(unlock)
    {
        this->addChild(m_lbl);
    }
    else
    {
        m_sprite->setTexture(CCTextureCache::sharedTextureCache()->addImage(m_rc.m_level_lock.fname.c_str()));
    }
    
    this->setTag(idx);
}

//改变颜色.isNew是否为新的颜色
void Cell::changeColor(bool isNew)
{
    if(m_lbl)
    {
        isNew ? m_lbl->setColor(m_newColor) : m_lbl->setColor(m_oriColor);
    }
}



使用方法 

    this->addChild(LevelScrollLayer::scene());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值