• 【Cocos2dx游戏开发】CCTableView实现滑动列表


       在游戏中,经常需要用到列表展示,例如我现在做的卡牌游戏中就有卡牌列表好友列表需要用到CCTableView,下面简单介绍一下使用方法。

       CCTableView位于扩展库文件cocos-ext.h中,它是CCScrollView的子类。引擎已经帮我们封装好了,而我们要实现列表展示只需要重写下面4个函数:

    	// 处理触摸事件,可以计算点击的是哪个子项
    	virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell);
    	// 定制单元格cell的尺寸
    	virtual CCSize cellSizeForTable(CCTableView *table);
    	// 生成列表的每一项内容
    	virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx);
    	// cell的数量
    	virtual unsigned int numberOfCellsInTableView(CCTableView *table);

    由于CCTableView继承自CCScrollView,所以要实现这两个方法,但是什么都不做。

    	virtual void scrollViewDidScroll(CCScrollView* view);
    	virtual void scrollViewDidZoom(CCScrollView* view);

    下面我们来写一个好友列表展示:

    FriendListLayer.h

    #ifndef __FRIENDLISTLAYER_H__
    #define __FRIENDLISTLAYER_H__
    
    #include "cocos2d.h"
    #include "cocos-ext.h"
    
    USING_NS_CC;
    USING_NS_CC_EXT;
    
    class FriendListLayer : public CCLayer, public CCTableViewDataSource, public CCTableViewDelegate
    {
    public:
    	virtual bool init();
    
    	// CCTableViewDelegate继承自CCScrollViewDelegate
    	virtual void scrollViewDidScroll(CCScrollView* view);
    	virtual void scrollViewDidZoom(CCScrollView* view);
    
    	// 处理触摸事件,可以计算点击的是哪个子项
    	virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell);
    
    	// 定制单元格的尺寸
    	virtual CCSize cellSizeForTable(CCTableView *table);
    
    	// 生成列表的每一项内容
    	virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx);
    
    	// cell的数量
    	virtual unsigned int numberOfCellsInTableView(CCTableView *table);
    
            // 返回按钮回调函数
    	void menuCallback(CCObject* pSender);
    
    	CREATE_FUNC(FriendListLayer);
    };
    
    #endif

    FriendListLayer.cpp

    #include "FriendListLayer.h"
    
    USING_NS_CC;
    USING_NS_CC_EXT;
    
    
    bool FriendListLayer::init()
    {
    	if (!CCLayer::init())
    	{
    		return false;
    	}
    
    	CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    
    	// CCTableView使用
    	CCTableView* tableView = CCTableView::create(this, CCSizeMake(visibleSize.width-200, visibleSize.height-100));
    	tableView->setDirection(kCCScrollViewDirectionVertical); // 设置方向
    	tableView->setPosition(ccp(40, 30));
    	//tableView->setAnchorPoint(CCPointZero);
    	tableView->setDelegate(this);
    	tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
    	this->addChild(tableView);
    	tableView->reloadData();
    
    	// "好友列表"标题
    	CCSprite* title = CCSprite::create("title.png");
    	title->setPosition(ccp(40, visibleSize.height - title->getContentSize().height - 10));
    	title->setAnchorPoint(CCPointZero);
    	this->addChild(title);
    
    	// 返回按钮
    	CCMenuItemImage *pBackItem = CCMenuItemImage::create(
    		"button1.png",
    		"button1.png",
    		this,
    		menu_selector(FriendListLayer::menuCallback));   
    	pBackItem->setPosition(visibleSize.width - pBackItem->getContentSize().width - 20, visibleSize.height - 100);
    	CCMenu* pMenu = CCMenu::create(pBackItem, NULL);
    	pMenu->setPosition(CCPointZero);
    	this->addChild(pMenu, 1);
    
    	return true;
    }
    
    
    // 响应触摸事件
    void FriendListLayer::tableCellTouched( CCTableView* table, CCTableViewCell* cell )
    {
    	CCLOG("Cell touched at index: %i", cell->getIdx()+1);
    }
    
    
    // 设置cell的size
    CCSize FriendListLayer::cellSizeForTable( CCTableView *table )
    {
    	CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    	return CCSizeMake(visibleSize.width, 64);
    }
    
    
    // 具体实现每个cell
    CCTableViewCell* FriendListLayer::tableCellAtIndex( CCTableView *table, unsigned int idx )
    {
    	CCString* name = CCString::createWithFormat("Name: friend_%d", idx+1);
    	CCString* attack = CCString::createWithFormat("Money: %d", (idx+1)*((rand()%100)+900));
    
    	CCTableViewCell* cell = table->dequeueCell();
    
    	// 头像icon路径
    	std::string imagePath[10] = {"icon0.png","icon1.png","icon2.png","icon3.png","icon4.png","icon5.png","icon6.png","icon7.png","icon8.png","icon9.png"};
    
    	if (!cell)
    	{
    		cell = new CCTableViewCell();
    		cell->autorelease();  // 加入自动释放池
    	}
    	cell->removeAllChildrenWithCleanup(true);
    
    	// 背景
    	CCSprite* bgSprite = CCSprite::create("cell_background.png");
    	bgSprite->setAnchorPoint(CCPointZero); // 设置锚点
    	bgSprite->setPosition(CCPointZero);  // 设置位置
    	bgSprite->setTag(12);
    	cell->addChild(bgSprite);   // 加入cell
    
    	// 头像icon
    	CCSprite* iconSprite = CCSprite::create(imagePath[idx].c_str());
    	iconSprite->setScale(0.9);
    	iconSprite->setAnchorPoint(CCPointZero);
    	iconSprite->setPosition(ccp(25,5));
    	iconSprite->setTag(34);
    	cell->addChild(iconSprite);
    
    	// 文字
    	CCLabelTTF* pLabel = CCLabelTTF::create(name->getCString(), "Arial", 15);
    	pLabel->setAnchorPoint(CCPointZero);
    	pLabel->setPosition(ccp(100, 35));
    	pLabel->setTag(56);
    	cell->addChild(pLabel);
    
    	CCLabelTTF* pLabel1 = CCLabelTTF::create(attack->getCString(), "Arial", 15);
    	pLabel1->setAnchorPoint(CCPointZero);
    	pLabel1->setPosition(ccp(100, 10));
    	pLabel1->setTag(78);
    	cell->addChild(pLabel1);
    
    	return cell;
    }
    
    
    // cell的数量
    unsigned int FriendListLayer::numberOfCellsInTableView( CCTableView *table )
    {
    	return 10;
    }
    
    
    // CCTableView继承自CCScrollView,所以要实现这两个方法,但是什么都不做
    void FriendListLayer::scrollViewDidScroll( CCScrollView* view ){}
    void FriendListLayer::scrollViewDidZoom( CCScrollView* view ){}
    
    
    // menu回调函数
    void FriendListLayer::menuCallback( CCObject* pSender )
    {
    }


    另外还可以重写这两个函数实现cell的点击和释放时的响应效果:

    // 按下
    void FriendListLayer::tableCellHighlight(CCTableView *table, CCTableViewCell *cell)  
    {  
    	CCTexture2D *aTexture=CCTextureCache::sharedTextureCache()->addImage("cell_selected.png");  
    	CCSprite *pSprite=(CCSprite *)cell->getChildByTag(12);  
    	pSprite->setTexture(aTexture);  
    }  
    // 释放
    void FriendListLayer::tableCellUnhighlight(CCTableView *table, CCTableViewCell *cell)  
    {   
    	CCTexture2D *aTexture=CCTextureCache::sharedTextureCache()->addImage("cell_background.png");  
    	CCSprite *pSprite=(CCSprite *)cell->getChildByTag(12);  
    	pSprite->setTexture(aTexture);  
    } 


    效果图:





  • 相关阅读:
    IntelliJ Idea的黑色主题+代码高亮
    @EqualsAndHashCode
    @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
    springcloud各种网址
    利用PowerDesigner连接Mysql数据库并逆向所有表关系图【两种方式】
    Java 异步实现的几种方式
    如何查看Linux操作系统版本
    Java中关于WeakReference和WeakHashMap的理解
    Java弱引用(WeakReference)的理解与使用
    Unchecked Exception 和 Checked Exception 比较
  • 原文地址:https://www.cnblogs.com/songlee/p/5738157.html
Copyright © 2020-2023  润新知