笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址:http://www.benmutou.com/blog/archives/596

正文:

1.Java的菜单点击事件实现方式

我是个Java中毒比较深的人,所以,一般菜单或按钮的点击事件我都是传一个匿名内部类进去,而且还能支持参数,类似这样:

exitBtn1.setOnClickListener(new ExitEvent(0) );exitBtn2.setOnClickListener(new ExitEvent(1) );exitBtn3.setOnClickListener(new ExitEvent(2) );Class ExitEvent {ExitEvent(int iCode) {}}

我有三个按钮,分别对应不同的回调事件,但是我只需要使用同一个类去做处理。

2.一个简单的需求

所以,在Cocos2d-x里我也想类似这么用,假设我有这样一个需求:有五个菜单和一个标签,点击不同的菜单,标签就显示不同的内容。

效果如下图所示:

3.一般的做法

正常情况下,我们会这么做,先声明几个函数:

class HelloWorld : public cocos2d::CCLayer{public:virtual bool init();static cocos2d::CCScene* scene();CREATE_FUNC(HelloWorld);private:CCLabelTTF* m_numLab;void numClick1(CCObject* pSender);void numClick2(CCObject* pSender);void numClick3(CCObject* pSender);void numClick4(CCObject* pSender);void numClick5(CCObject* pSender);};

一个m_numLab标签,五个回调函数。

实现如下:

bool HelloWorld::init(){bool bRet = false;do{CC_BREAK_IF(! CCLayer::init());/* 数字标括签 */m_numLab = CCLabelTTF::create("", "Arial", 85);m_numLab->setColor(ccGREEN);m_numLab->setPosition(ccp(250, 200));this->addChild(m_numLab);CCMenuItemLabel* item1 = CCMenuItemLabel::create(CCLabelTTF::create("one", "Arial", 35), this, menu_selector(HelloWorld::numClick1));CCMenuItemLabel* item2 = CCMenuItemLabel::create(CCLabelTTF::create("two", "Arial", 35), this, menu_selector(HelloWorld::numClick2));CCMenuItemLabel* item3 = CCMenuItemLabel::create(CCLabelTTF::create("three", "Arial", 35), this, menu_selector(HelloWorld::numClick3));CCMenuItemLabel* item4 = CCMenuItemLabel::create(CCLabelTTF::create("four", "Arial", 35), this, menu_selector(HelloWorld::numClick4));CCMenuItemLabel* item5 = CCMenuItemLabel::create(CCLabelTTF::create("five", "Arial", 35), this, menu_selector(HelloWorld::numClick5));CCMenu* numMenu = CCMenu::create(item1, item2, item3, item4, item5, NULL);numMenu->setPosition(ccp(250, 80));numMenu->alignItemsHorizontallyWithPadding(10);this->addChild(numMenu);bRet = true;} while (0);return bRet;}void HelloWorld::numClick1( CCObject* pSender ){m_numLab->setString("1");}void HelloWorld::numClick2( CCObject* pSender ){m_numLab->setString("2");}void HelloWorld::numClick3( CCObject* pSender ){m_numLab->setString("3");}void HelloWorld::numClick4( CCObject* pSender ){m_numLab->setString("4");}void HelloWorld::numClick5( CCObject* pSender ){m_numLab->setString("5");}

很简单,创建了五个CCMenuItemLabel菜单对象,每个菜单对象对应一个回调函数,每个回调函数都对m_numLab标签进行赋值操作,不同的回调函数赋不同的值。

4.一个看起来更舒服的实现方式

嗷~!但是,我不喜欢要那么多函数,明明就是类似的功能,非得要我搞这么多函数,我才不要。(小若:这些函数明明就是你自己写的O O!)

没关系,Cocos2d-x有一个很好用的东西,叫做userObject,它是CCNode的一个特别的地方,CCNode允许我们绑定一个CCObject类型或其子类型的对象到其身上,只要这个CCNode没有被释放,我们就可以随时取出绑定的userObject对象(小若:就是绑定自定义数据嘛~Box2D也有~)。

于是,木头投机取巧的编码方式又诞生了,完整的新实现方式如下:

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "SimpleAudioEngine.h"USING_NS_CC;class HelloWorld : public cocos2d::CCLayer{public:virtual bool init();static cocos2d::CCScene* scene();CREATE_FUNC(HelloWorld);private:CCLabelTTF* m_numLab;void numClick(CCObject* pSender);};#endif  // __HELLOWORLD_SCENE_H__
#include "HelloWorldScene.h"using namespace cocos2d;CCScene* HelloWorld::scene(){CCScene * scene = NULL;do{scene = CCScene::create();CC_BREAK_IF(! scene);HelloWorld *layer = HelloWorld::create();CC_BREAK_IF(! layer);scene->addChild(layer);} while (0);return scene;}bool HelloWorld::init(){bool bRet = false;do{CC_BREAK_IF(! CCLayer::init());/* 数字标括签 */m_numLab = CCLabelTTF::create("", "Arial", 85);m_numLab->setColor(ccGREEN);m_numLab->setPosition(ccp(250, 200));this->addChild(m_numLab);CCMenuItemLabel* item1 = CCMenuItemLabel::create(CCLabelTTF::create("one", "Arial", 35), this, menu_selector(HelloWorld::numClick));item1->setUserObject(CCString::create("1"));CCMenuItemLabel* item2 = CCMenuItemLabel::create(CCLabelTTF::create("two", "Arial", 35), this, menu_selector(HelloWorld::numClick));item2->setUserObject(CCString::create("2"));CCMenuItemLabel* item3 = CCMenuItemLabel::create(CCLabelTTF::create("three", "Arial", 35), this, menu_selector(HelloWorld::numClick));item3->setUserObject(CCString::create("3"));CCMenuItemLabel* item4 = CCMenuItemLabel::create(CCLabelTTF::create("four", "Arial", 35), this, menu_selector(HelloWorld::numClick));item4->setUserObject(CCString::create("4"));CCMenuItemLabel* item5 = CCMenuItemLabel::create(CCLabelTTF::create("five", "Arial", 35), this, menu_selector(HelloWorld::numClick));item5->setUserObject(CCString::create("5"));CCMenu* numMenu = CCMenu::create(item1, item2, item3, item4, item5, NULL);numMenu->setPosition(ccp(250, 80));numMenu->alignItemsHorizontallyWithPadding(10);this->addChild(numMenu);bRet = true;} while (0);return bRet;}void HelloWorld::numClick( CCObject* pSender ){CCMenuItemLabel* item = (CCMenuItemLabel*)pSender;CCString* text = (CCString*)item->getUserObject();m_numLab->setString(text->getCString());}

我们调用每一个CCMenuItemLabel菜单对象的setUserObject函数,绑定一个CCString对象到菜单身上。

然后,我们把五个回调函数缩减成一个,回调函数有一个pSender参数,这个参数代表触发这个回调函数的对象,也就是我们的CCMenuItemLabel菜单对象。

于是,重点来了,我们的CCMenuItemLabel菜单对象是绑定了一个CCString的,我们只需要调用它的getUserObject函数取出这个CCString即可。然后用这个CCString给m_numLab标签赋值。

呼,这样的实现方式才能让我心情愉悦~~

最后的最后,源代码下载地址:

下载地址1:http://www.bego.cc/file/21735596

下载地址2:http://filemarkets.com/file/musicvs/ad2177c7/

【笨木头Cocos2d-x 042】一个函供应多个菜单回调——UserObject自定义数据相关推荐

  1. 转载自笨木头的Cocos2d-x Auto-batching分析

    今天早晨学习cpp-tests物理引擎实例,顺便学习了Cocos2d-x 3.0新引入的Auto-batching技术.期间,在结合秦春林著作有关论述的同时学习了笨木头同学的文章,完整引用如下: 近两 ...

  2. 笨木头的跑跑跑笔记三 精灵的运动动画

    Cocos2d-x游戏实例-<跑跑跑>制作教程(第三篇)--让主角跑 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://blog.csdn.net/music ...

  3. 【笨木头Lua专栏】基础补充08:协同程序之resume-yield间的数据返回

    这次要介绍几个事实上非常easy,可是一定要小心的返回值规则. 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明.原文地址: http://www.benmutou.com/archives/173 ...

  4. [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求

    原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...

  5. 【笨木头Unity】入门之旅007:Demo之四处找死(二)_主角移动和旋转

    上一篇我们仅仅是创建了场景和主角,暂时不具备任何玩法. 这次,我们来看看怎么让主角移动起来. 笨木头花心贡献,啥?花心?不,是用心. 转载请注明,原文地址:http://www.benmutou.co ...

  6. [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接

    最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西. 那为嘛我要学FireFly呢? 之前我自己写了一个网络游戏,服务端和客户端都自己写,虽然运行起来没什么大碍,但毕竟我对服务端没什么 ...

  7. [笨木头FireFly 02]入门篇_客户端发送请求,服务器处理请求

    好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不说话不交流,那游戏就玩不起来了,玩不起来那我就赚不到钱..啊不是,玩不起来那玩家就不能开心了,钱 ...

  8. 【笨木头Lua专栏】基础补充07:协同程序初探

    哎,周五晚上我都还这么努力看书,真是好孩子.(小若:不想吐槽了) 其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧. 结果一扫就不对劲了,因为这内容有点绕,有点小混 ...

  9. 【笨木头Unity】入门之旅010(完结):Demo之四处找死(五)_UI

    UI是游戏里必不可少的元素,在Unity里添加UI是比较轻松的事情,但要玩好它,可就不那么轻松了. 没关系,先入门. 笨木头花心贡献,啥?花心?不,是用心. 转载请注明,原文地址:http://www ...

最新文章

  1. hibernate oracle 读写分离_利用FDW进行ORACLE到Postgresql的数据迁移
  2. Does not match the target endianness, not loaded.问题解决方案
  3. 有没有python与机械结合的工作-Python3从零开始搭建一个语音对话机器人的实现...
  4. get_attribute中的value是什么类型的?_建设工程项目中都有什么类型的监理?
  5. 第十章 基本数据结构——链表
  6. Module build failed (from ./node_modules/babel-loader/lib/index.js) 错误解决
  7. 电商首页设计的时候,就应该考虑这个
  8. php嘲讽,PHP为何能够受到大家追捧,又为什么饱受嘲讽?
  9. 【零基础学Java】—递归(五十一)
  10. 机器学习基础(四十)—— 将距离转换为权重
  11. 使用C++刷算法题的简明教程
  12. js实现将网页下载为pdf
  13. div水平垂直居中方法汇总(共六种)
  14. illumina平台的一些扩增子测序项目介绍
  15. 四色定理c语言,阅读下列程序说明和C代码,将应填入(n)处。【程序5说明】著名的四色定理指出..._考试资料网...
  16. 深度学习分类常见评价指标:accuracy recall precision specificity sensitivity AUC ROC 曲线
  17. 莫明其妙的死机现象,莫明其妙的重启
  18. 硬盘是计算机的 奥鹏,奥鹏2016计算机应用基础一
  19. java 打印出如下图案(菱形)
  20. JanusGraph ,生产环境安装

热门文章

  1. list和tuple的区别:
  2. 自定义类型:结构体,枚举,联合
  3. 造纸行业仍处于“去库存”阶段
  4. 【面试】Java中级工程师社招简历
  5. 共享技术红利 美团点评全面开放云能力并发布三大类AI产品
  6. 5g信号频率是多少赫兹_1分钟看懂5G频谱(建议收藏)
  7. 架构师必备:云原生数据湖体系
  8. 记录自己考研二战失败后找工作的经历
  9. 【Codeforces Round #540 (Div. 3)】 A B C D1 D2 E F1
  10. 直指行业痛点 玩法创新才是游戏占领市场的根基