cocos2d-x CCListView

时间:2022-09-22 11:08:28

转自:http://blog.csdn.net/onerain88/article/details/7641126

cocos2d-x 2.0 版更新了,把opengl 1.1 替换为opengl 2.0,这个版本只能在iphone 3gs,android 2.2 以上版本才能跑,并且android的模拟器也不支持!

这次更新终于更新了几个UI控件,比如Button,Slider,ListView(本来打算自己写个ListView的,这下省事了,看到注释,这里要感谢网龙公司了,当然,还要感谢cocos2d-x的整合)。

但是这个tests中没有加入对ListView的使用教程,只有在CCTextureWatcher中有简单的提到,但是CCTextureWatcher是缓存图片纹理的查看类,并不是单纯的ListView的教程介绍,考虑到以后肯定会用到,所以先记录一下简单的用法和原理。

1.CCListView的设计,主要分为3部分

(1)ListView容器

ListView容器就是盛放Cell的大容器,CCListView继承于CCLayerColor,主要是处理显示样式,监听触摸事件,更新的操作。

(2)Cell子容器

CCListViewCell也是继承于CCLayerColor,它处理的就很单纯了,就是负责ListView中每一项(Item)的显示

(3)代理方法

CCListViewDelegate定义了关于CCListView的回调接口,这个和ios app开发中TabView的原理是一样的。

(可能从android刚刚转到cocos2d-x的开发的我们不是很习惯这种设计,其实和android是非常类似的,Cell子容器和代理方法,不就是android中的ListView的各种adapter吗?只是adapter整合了它们,在初始化adapter的时候会将数据和显示规则都定义好)

2.简单用法

(1)类定义

我想一般的用法会是自定义一个层作为ListView添加到其它层上,首先继承CCLayer,还要继承CCListViewDelegate,用来处理显示和回调CCListView,当然也可以继承于CCObject,但是要注意的是一定要定义一个visit()方法,用于更新!

#include "cocos2d.h"

#include "CCListView.h"

USING_NS_CC;
using namespace cocos2d::extension; class ListViewDemoLayer: public CCLayer, public CCListViewDelegate
{
private:
CCLabelTTF *m_InfoLabel; private:
// 存放的List数据
std::list<std::string> *m_pDataList;
CCListView *m_pListView;
bool m_bFresh; public:
ListViewDemoLayer();
~ListViewDemoLayer(); virtual bool init(); LAYER_NODE_FUNC(ListViewDemoLayer); virtual void visit(); public:
// 继承自CCListViewDelegate所需要实现的方法
virtual void CCListView_numberOfCells(CCListView *listView, CCListViewProtrolData *data);
virtual void CCListView_cellForRow(CCListView *listView, CCListViewProtrolData *data);
virtual void CCListView_didClickCellAtRow(CCListView *listView, CCListViewProtrolData *data);
virtual void CCListView_didScrollToRow(CCListView *listView, CCListViewProtrolData *data);
}; #endif

(PS:注意那鬼魅的命名作用域)

(2)自定义

用一个list<string>对象作为数据模拟显示,(如果是做道具店,装备商店列表,可能就是自定义类型的list了,因为数据结构会比较复杂,这里只是一个简单的字符串的例子而已)

// 初始化List数据
m_pDataList = new std::list<std::string>;
for (int i=; i<; i++) {
char info[];
sprintf(info, "Cell %d", i);
m_pDataList->push_back(info);
}

定义一个CCListView对象,这里最重要的是要记得一定要设置其ContentSize(),如果不设置,则默认为0,什么都没有

还定义了一个CCLabelTTF用于显示ListView的信息

visit()方法还是很重要的,这是在cocos2d-x引擎每帧更新的时候都会调用的(比如动画的变化。。。),我们在这里可以判断当前的ListView需要不需要更新,当ListView有增减项的时候,为了达到显示同步,是需要更新的,调用listView.reload()

void ListViewDemoLayer::visit()
{
CCLayer::visit();
if (m_bFresh) {
m_pListView->reload();
m_bFresh = false;
}
}

(3)CCListViewDelegate实现

virtual void CCListView_numberOfCells(CCListView *listView,CCListViewProtrolData *data);

返回ListView的条目数

virtual void CCListView_cellForRow(CCListView *listView,CCListViewProtrolData *data);

定义Cell的样式

在这里只简单的定义一个文本项,并且设置选中的背景色之类的

void ListViewDemoLayer::CCListView_cellForRow(cocos2d::extension::CCListView *listView, cocos2d::extension::CCListViewProtrolData *data)
{
CCSize listSize = m_pListView->getContentSize();
CCSize cellSize = CCSizeMake(listSize.width, listSize.height / ); CCListViewCell *cell = CCListViewCell::node();
cell->setOpacity();
cell->setContentSize(cellSize);
cell->setSelectionColor(ccc4(, , , ));
data->cell = cell; std::list<std::string>::iterator it = m_pDataList->begin();
for (int i=; i<data->nRow; ++i) {
++it;
}
CCLabelTTF *cellLabel = CCLabelTTF::labelWithString(((std::string) *it).c_str(), "Arial", );
cellLabel->setPosition(ccp(cellSize.width / , cellSize.height / ));
cell->addChild(cellLabel);
}

(PS:这个机制是类似于android中BaseAdapter的getView()方法的)

virtual void CCListView_didClickCellAtRow(CCListView *listView,CCListViewProtrolData *data);

ListView产生点击之后的回调

简单的修改一下显示文本,根据data->nRow得到当前项所在位置

void ListViewDemoLayer::CCListView_didClickCellAtRow(cocos2d::extension::CCListView *listView, cocos2d::extension::CCListViewProtrolData *data)
{
char info[];
sprintf(info, "No. %d Row", data->nRow);
m_InfoLabel->setString(info);
}

(PS:这个机制类似于android中ListView.setOnItemClickListener())

virtual void CCListView_didScrollToRow(CCListView *listView,CCListViewProtrolData *data);

ListView滑动产生的回调

3.效果

cocos2d-x CCListView

cocos2d-x CCListView

cocos2d-x CCListView的更多相关文章

  1. cocos2d-x多分辨率和随后的自适应CCListView的bug修复

    cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复 cocos2d-x是一款众所周知的跨平台的游戏开发引擎.因为其跨平台的特性.多分辨率支持也自然就有其需求. 因此.在某一次 ...

  2. 小尝试一下 cocos2d

    好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...

  3. 采用cocos2d-x lua 制作数字滚动效果样例

    require "Cocos2d"require "Cocos2dConstants"local testscene = class("testsce ...

  4. Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板

    很久没有写博客了,这段时间比较忙,又是搬家又是做自己的项目,还有太多琐碎的事情缠身,好不容易抽出时间把最近自己做的一些简单例子记录一下. 在我的项目中,我需要一个显示面板来显示游戏中的一个三维数据,例 ...

  5. iPhone开发与cocos2d 经验谈

    转CSDN jilongliang : 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE.开发框架uikit,还有开 ...

  6. cocos2d学习记录

    视频 - http://www.manew.com/forum-105-3.html一个论坛帖 - http://www.zhihu.com/question/21114802官网 - http:// ...

  7. Android下Cocos2d创建HelloWorld工程

    最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...

  8. 学生信息管理系统(cocos2d引擎)——数据结构课程设计

    老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite*  spBG = CCSprite::create("&qu ...

  9. cocos2d触碰例子代码

    // // TestLayer.h // MiniTD // // Created by OnePiece on 12-7-30. // Copyright 2012年 __MyCompanyName ...

随机推荐

  1. 忘记XP密码的解决方案

    仅供教学与研究用,后果自负! !! USE AT YOUR OWN RISK !! !! ONLY FOR EDUCATIONAL PURPOSE !! 介绍 获取SYSTEM权限.测试通过. 进入G ...

  2. 工厂食堂3D指纹考勤系统解决方案

    指纹考勤就餐管理系统利用3D活体指纹技术完成对正式员工就餐管理.就餐者只需办理完入职手续,并登记考勤指纹,就可通过考勤指纹在工厂食堂领餐. 大多数工厂食堂就餐是福利性的,只准员工就餐,不准员工带亲戚朋 ...

  3. 老版mapreduce跑streaming作业多路输出的方法

    1. 继承MultipleTextOutputFormat实现自己的输出类. 2. 重写generateFileNameForKeyValue方法,返回输出的名字,可通过"/"分割 ...

  4. &lbrack;原&rsqb; XAF How to Edit multiple objects in a ListViewAndDetailView

    2014年好久没有更新Blog了,工作调换了,很少用XAF,但还是很关注XAF的发展和学习,对中国的中小企业数据管理软件开发真的太实用了!! 功能比较简单,但很实用,直接上图和代码! ListView ...

  5. 使用CSS3制作漂亮的按钮

    我给大家介绍一下如何使用CSS3来制作一个圆角阴影.渐变色的漂亮的按钮,它不需要任何图片和javascript脚本,只需要CSS3就可以轻松实现按钮效果,并且可以适用于任意HTML元素,想div,sp ...

  6. compareTo&lpar;&rpar;

    从字面意思可知这个方法就是比较的意思. 所以该方法有如下两种情况: 1.比较前后的两个字符不相同: (1)     String str = "Hello World"; Stri ...

  7. iframe顶部跳转跨域问题

    $("#button").on("click", function () {                  //  top.location.locatio ...

  8. 第一天的php体验

    第一次了解php.以前对于程序猿的认知是很片面的.因为没有了解过.今天通过一天的了解交流,有了新的认知.对于这个主要应用于前端的语言还是很有兴趣的.毕竟可以亲眼看到自己做出来的网页,心里的成就感肯定满 ...

  9. &lbrack;模板&rsqb;&lbrack;Luogu3387&rsqb; 缩点 - Tarjan&comma; 拓扑&plus;DP

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  10. js 数组去重的几种方式及原理

    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,' ...