【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);
}
效果图:
【Cocos2dx游戏开发】CCTableView实现滑动列表的更多相关文章
- cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发
cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622 ...
- Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇
懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...
- cocos2d-x游戏开发系列教程-前言
cocos2d-x游戏开发前景: 最近企业对于Cocos2D-X开发人才的用人需求很大,而且所提供的薪资相当可观. 为满足广大向往游戏开发行业同学的需求,特推出适合新手的Cocos2D-X手游开发教程 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...
- cocos2d-x 游戏开发之有限状态机(FSM) (三)
cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monk ...
- cocos2d-x 游戏开发之有限状态机(FSM) (一)
cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (二)
cocos2d-x 游戏开发之有限状态机(FSM) (二) 1 状态模式
- 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像
Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...
随机推荐
- 盒子模型,top和margin-top
1. 标准盒子模型: width只是内容的宽度. 元素的总宽度=width + padding*2 +border*2 +margin*2. IE盒子模型: width=内容的宽度 + padding ...
- Codeforces_765_D. Artsem and Saunders_(数学)
D. Artsem and Saunders time limit per test 2 seconds memory limit per test 512 megabytes input stand ...
- re模块,正则表达式
re模块 作用:取文本或者字符串内你所需要的东西 正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符则匹配失败. ^叫做元字符,元 ...
- 梦想CAD控件网页版线型
增加线型 主要用到函数说明: _DMxDrawX::AddLinetype 增加一个线型定义.详细说明如下: 参数 说明 BSTR pszName 线型名 BSTR pszLineDefine 线定义 ...
- docker常用命令理解
docker help Commands: attach Attach local standard input, output, and error streams to a running con ...
- ThinkPHP---TP功能类之公文管理功能2----------继续完善
[前言] 之前已经完成了公文的添加和列表展示功能,今天继续完善.做下公文的编辑和删除功能. [主体] (1)分析 控制器:DocController.class.php 方法:edit(将模板展示和数 ...
- Linux常用命令——压缩与解压缩命令
常用压缩格式: .zip .gz .bz2 .tar.gz .tar.bz2 1..zip格式压缩 zip 压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 ...
- Python字符的转义
参考原文 廖雪峰Python教程 字符的转义 字符串是以单引号' 或双引号" 括起来的任意文本,比如'abc',"xyz".''或""本身只是一种表示 ...
- Script:shell脚本生成随机字符串
#!/bin/bash # bash generate random alphanumeric string # # bash generate random character alphanumer ...
- 60s倒计时
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...