#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());