在游戏中,经常需要用到列表展示,例如我现在做的卡牌游戏中就有卡牌列表好友列表需要用到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);
}

效果图:

【Cocos2dx游戏开发】CCTableView实现滑动列表的更多相关文章

  1. cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发

     cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622     ...

  2. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

  3. cocos2d-x游戏开发系列教程-前言

    cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...

  4. cocos2d-x 游戏开发之有限状态机(FSM) (四)

    cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...

  5. cocos2d-x 游戏开发之有限状态机(FSM) (三)

    cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monk ...

  6. cocos2d-x 游戏开发之有限状态机(FSM) (一)

    cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...

  7. cocos2d-x 游戏开发之有限状态机(FSM) (二)

    cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式

  8. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴

    上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...

  9. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

  10. 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像

    Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...

随机推荐

  1. 如何创建C# Closure?

    JavaScript中一个重要的概念就是闭包,闭包在JavaScript中有大量的应用,但是你知道么?C#也可以创建Closure.下面就介绍一下如何在C#中创建神奇的闭包. 在这之前,我们必须先知道 ...

  2. Java 基础入门随笔(10) JavaSE版——单例设计模式

    设计模式:对问题行之有效的解决方式.其实它是一种思想. 1.单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性.(单个实例) 使用单例设计模式需求:必须对于多个程序使用同一个配置信息对 ...

  3. Nginx 通过 certbot 为网站自动配置 SSL 证书并续期

    一.背景知识 1.1.http 和 https 是什么? 简单来说,http 是一个传输网页内容的协议,比如你看到的 http 开头的网站 http://www.163.com ,其网页上的文字.图片 ...

  4. 梦想CAD控件 2019.05.05更新

    下载地址: http://www.mxdraw.com/ndetail_20141.html 1. 增加vs2017版本控件 2. 增加windows触摸屏支持 3. 增加手写签名功能 4. 修改PL ...

  5. ThinkPHP---拓展之jQuery的ajax

    [前言] 用Sublime开发时,推荐下载一个jQuery插件,可以智能化创建基本函数格式,支持自动生成,可以提高开发效率 (1)jQuery里ajax方法有几个? 答:有4个,分别为post.get ...

  6. 03Microsoft SQL Server 数据类型

    Microsoft SQL Server 数据类型 数据类型 Number 类型: 数据类型 描述 存储 bit  允许0,1或NULL    tinyint 允许从 0 到 255 的所有数字. 1 ...

  7. CentOS下安装微软雅黑字体

    CentOS下安装微软雅黑字体   微软雅黑下载地址:http://download.csdn.net/detail/u012547633/9796219 1.先从你本机 C:\Windows\Fon ...

  8. Spring 中无处不在的 Properties

    转自:https://javadoop.com/post/spring-properties?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  9. python_ 学习笔记(基础语法)

    python的注释 使用(#)对单行注释 使用('''或者""")多行注释,下面的代码肯定了python的牛逼 print("python是世界上最好的语言吗? ...

  10. linux free命令-显示内存的使用情况

    更多Linux 性能监测与优化 关注 Linux命令大全 free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区. 语法 free(选项) 选项 -b:以Byte为单 ...