【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中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...
随机推荐
- C++ const学习
概念 const就是为了直接表达“不变化的值”这一概念.也就是说该值只可读,不可直接写. 由于不可以修改,所以const常量在声明的时候必须初始化 const int a; //error exter ...
- Struts工作机制
Struts工作机制? 为什么要使用Struts?工作机制:Struts的工作流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config. ...
- PHP 在表单POST提交后数据分页实现,非GET,解决只有第一页显示正确的问题
//PHP 在表单POST提交后数据分页实现,非GET,使用SESSION,分页代码部分不在详述,主要为POST后的 除第一页之外的显示问题 //以下为ACTION页面 内容,仅为事例,当判断到页面未 ...
- Python+selenium学习(一) 打开Firefox浏览器,IE浏览器和Chrome浏览器
from selenium import webdriver # open Firefox #driver=webdriver.Firefox() # Open IE #driver=webdrive ...
- Redis系列(六)--为什么这么快?
Redis作为一个基于key-value的NoSQL数据库,最显著的特点存取速度非常快,官方说可以达到10W OPS,但是Redis为何这么快? 1.开发语言 Redis使用C语言进行编写的,而Uni ...
- Spring Boot 与消息
一.消息概述 在大多数应用中,可以通过消息服务中间件来提升系统的异步通信.扩展解耦和流量削峰等能力. 当消息发送者发送消息后,将由消息代理接管,消息代理保证消息传递到指定目的地. 消息队列主要有两种形 ...
- bzoj 4026 dC Loves Number Theory 主席树+欧拉函数
题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n)代 ...
- IOS上MediaPlayer framework实现视频播放
播放电影文件: iOS sdk中可以使用MPMoviePlayerController来播放电影文件.但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件. • H.264 ...
- 洛谷——P2261 [CQOI2007]余数求和
P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...
- Jmeter - 获取返回结果中的字段值
Jmeter测试场景:一个web系统,需要先发送登录请求,获取到登录Token之后,后续每次请求都需要在请求头中附带Token才有权限操作.现在需要在Jmeter中自动获取每次登录请求返回的Token ...