Cocos2d—X游戏开发之CCTableView详解(十一)

时间:2022-01-31 10:07:56

本来很早就想写关于CCTableView的文章,但是在基本功能实现之后呢,项目需求增加导致对这个控件的研究必须更加深入一点.

好的,现在开始介绍一下这个控件,在Cocos2d—X引擎中,这是一个仿制iOS里面的NSTableView的一个控件。

S1,使用这个控件需要首先引入扩展库文件

#include "cocos-ext.h"

S2,然后使类继承CCTableView的2个代理,

class ServerPrizeList :public CCLayer,public CCTableViewDataSource,public CCTableViewDelegate

首先看下 dataSource ,这个里面的方法将是我们使用的主要方法:

class CCTableViewDataSource
{
public:
virtual ~CCTableViewDataSource() {} /**
* cell size for a given index
* 每个单元格的尺寸,可以根据idx来个性化定制单元格的尺寸
* @param idx the index of a cell to get a size
* @return size of a cell at given index
*/
virtual CCSize tableCellSizeForIndex(CCTableView *table, unsigned int idx) {
return cellSizeForTable(table);
};
/**
* cell height for a given table.
* 一般使用这个方法,定制单元格尺寸,不可以根据idx来定制
* @param table table to hold the instances of Class
* @return cell size
*/
virtual CCSize cellSizeForTable(CCTableView *table) {
return CCSizeZero;
};
/**
* a cell instance at a given index
* 这个方法使数据源的主要方法,初始化数据在这个方法里面
* @param idx index to search for a cell
* @return cell found at idx
*/
virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx) = 0;
/**
* Returns number of cells in a given table view.
* 返回tableView的单元格数量
* @return number of cells
*/
virtual unsigned int numberOfCellsInTableView(CCTableView *table) = 0; };

然后,看下CCTableViewDelegate的方法:

class CCTableViewDelegate : public CCScrollViewDelegate
{
public:
/**
* Delegate to respond touch event
* 实现点击单元格的触摸事件响应,使主要使用方法
* @param table table contains the given cell
* @param cell cell that is touched
*/
virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell) = 0; /**
* Delegate to respond a table cell press event.
* 设置单元格高亮的状态
* @param table table contains the given cell
* @param cell cell that is pressed
*/
virtual void tableCellHighlight(CCTableView* table, CCTableViewCell* cell){}; /**
* Delegate to respond a table cell release event
* 设置单元格非高亮的状态
* @param table table contains the given cell
* @param cell cell that is pressed
*/
virtual void tableCellUnhighlight(CCTableView* table, CCTableViewCell* cell){}; /**
* Delegate called when the cell is about to be recycled. Immediately
* after this call the cell will be removed from the scene graph and
* recycled.
* 循环使用某个单元格
* @param table table contains the given cell
* @param cell cell that is pressed
*/
virtual void tableCellWillRecycle(CCTableView* table, CCTableViewCell* cell){}; };

当然,还要实现2个方法:

//因为cctableview继承自ccscrollview,所以要实现这两个方法,但是什么都不做
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);
virtual unsigned int numberOfCellsInTableView(CCTableView *table);

S3,然后让我们在。cpp文件里面实现这些代理方法。实现的方法大部分略过,主要使讲下

CCTableViewCell* ServerPrizeList::tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx)

按照官方网站的示例和其他文章的例子,在单元格中实现每个单元格的文字的多样化完全可行。

Cocos2d—X游戏开发之CCTableView详解(十一)

大家可以看到中间的文字是OK的,但是两边的问题就有了,左边是图片不能实现异样化,右边是兑换的idx获取不正确。

现在解决了兑换的idx的问题,开始是使用添加单元格的时候,把这个按钮的tag设置为单元格的idx。

但是问题是,idx在这个按钮里面是混乱且无序的。不能正确获取单元格的idx。

CCMenuItemImage *itemImage = CCMenuItemImage::create("22.png", "22.png", this, menu_selector(ServerPrizeList::menuItemCall2));

        //tag默认为-1,通过这个方法得到的tag,就是idx是无序的
if (itemImage->getTag() == -1) {
itemImage->setTag(idx);
}
itemImage->setPosition(ccp(tableCellSize.width*0.75, tableCellSize.height/2)); CCMenu *menu = CCMenu::create(itemImage,NULL);
menu->setPosition(CCPointZero);
pCell->addChild(menu, 1);

后来,看到

tableCellTouched(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)

突然有了灵感,可以获取按钮的父类的父类,就是Cell来获取点击的idx,哈哈,问题终于解决了。

CCTableViewCell *cell = (CCTableViewCell*)(((CCMenuItemImage*)pSender)->getParent()->getParent());
//getIdx()这个方法可以获取点击单元格的数组下标
CCLog("idx: %d",cell->getIdx());

现在,还有左边的问题要解决,如有大神看到,欢迎赐教啊。

2013-07-24 18:03:26.122  问题已经解决,贴图如下:


Cocos2d—X游戏开发之CCTableView详解(十一)

Cocos2d—X游戏开发之CCTableView详解(十一)的更多相关文章

  1. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  2. Android开发之InstanceState详解(转)---利用其保存Activity状态

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  3. Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)

    Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...

  4. Android开发之MdiaPlayer详解

    Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...

  5. IOS开发之UINavigationController详解

    UINavigationController是IOS编程中比较常用的一种容器view controller,很多系统的控件(如UIImagePickerViewController)以及很多有名的AP ...

  6. ios开发之 NSObject详解

    NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Obje ...

  7. Cocos2d—X游戏开发之CCScrollView(滑动视图)(十二)

    CCScrollView在Cocos2d-X引擎中主要使用在图片尺寸远大于屏幕尺寸的时候使用. 总体来说,使用起来比较简单. 一个是CCScrollView控件本身,一个是CCScrollViewDe ...

  8. android开发之service详解

    service作为android的四大组件之一,其重要性可想而知,在开发中,我们经常把一些不需要与用户进行交互的工作放在service中来完成,service运行在后台,这样有些人可能会产生错觉,以为 ...

  9. Android开发之InstanceState详解&lpar;转)

    本文来自:http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html 本文介绍Android中关于Activity的两个神秘方法: ...

随机推荐

  1. List&lt&semi;Map&lt&semi;String&comma;Object&gt&semi;&gt&semi;使用Java代码遍历

    List<Map<String,Object>>的结果集怎么使用Java代码遍历以获取String,Object的值: package excel; import java.u ...

  2. java 多线程(wait&sol;notify&sol;notifyall)

    package com.example; public class App { /* wait\notify\notifyAll 都属于object的内置方法 * wait: 持有该对象的线程把该对象 ...

  3. 快速入门系列--MVC--04模型

    model元数据 闲来继续学习蒋金楠大师的ASP.NET MVC框架揭秘一书,当前主要阅读的内容是Model元数据的解析,即使是阅读完的现在,仍然有不少细节不是特别明白.好在这部分内容主要是关于Raz ...

  4. c&num;中的partial关键字&lpar;转&rpar;

    c#中的partial关键字 Partial:      这是C#2.0的新特性 Partial关键字起到把一个class分段组合作用,能用于多个接口或一个继承 代码片断: namespace Com ...

  5. &lbrack;pjsip&rsqb;Pjlib中的链表结构

    Pjlib的链表结构跟常见的链表结构有所区别,如下图所示: 图1:一般链表结构 图2:pjlib中的链表结构 可以看到一般的双向链表是链表节点包含数据域,而pjlib中是数据域包含链表节点.一般的链表 ...

  6. selenium for python 所有方法

    先列出selenium所有方法,然后挨个使用!说明 add_cookieapplication_cachebackcapabilitiesclosecommand_executorcreate_web ...

  7. 通过AJAX与ASP&period;NET结合实现的仿GridView增删改查功能

    jQurey代码部分: 1.    <script type="text/javascript"> 2.            var flag = 0; 3. 4.  ...

  8. Android 软件盘 动态设置 layout

    总体来说分为三种方法: 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: ...

  9. OpenCV五学习: 如何使用命令来启动或关闭OpenCV的CPU指令系统CV&lowbar;SSE2&comma;CV&lowbar;SSSE4和其他优化

    在这个博客.我想分享一下OpenCV源代码CPU指令系统CV_SSE2和其他相关知识 一个.    CV_SSE系列指令集的预编译符号定义在opencv2/core/internal.hpp这个头文件 ...

  10. SICP 习题 (1&period;37)解题总结

    SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式.无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达.只是我建议大家还 ...