一个函供应多个菜单回调——UserObject自定义数据

一个简单的需求

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

效果如下图所示:

【笨木头原创专栏】一个函供应多个菜单回调——UserObject自定义数据

3.一般的做法

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

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

实现如下

  1. bool HelloWorld::init(){
  2. bool bRet = false;
  3. do{
  4. CC_BREAK_IF(! CCLayer::init());
  5. /* 数字标括签 */
  6. m_numLab = CCLabelTTF::create("", "Arial", 85);
  7. m_numLab->setColor(ccGREEN);
  8. m_numLab->setPosition(ccp(250, 200));
  9. this->addChild(m_numLab);
  10. CCMenuItemLabel* item1 = CCMenuItemLabel::create(CCLabelTTF::create("one", "Arial", 35), this, menu_selector(HelloWorld::numClick1));
  11. CCMenuItemLabel* item2 = CCMenuItemLabel::create(CCLabelTTF::create("two", "Arial", 35), this, menu_selector(HelloWorld::numClick2));
  12. CCMenuItemLabel* item3 = CCMenuItemLabel::create(CCLabelTTF::create("three", "Arial", 35), this, menu_selector(HelloWorld::numClick3));
  13. CCMenuItemLabel* item4 = CCMenuItemLabel::create(CCLabelTTF::create("four", "Arial", 35), this, menu_selector(HelloWorld::numClick4));
  14. CCMenuItemLabel* item5 = CCMenuItemLabel::create(CCLabelTTF::create("five", "Arial", 35), this, menu_selector(HelloWorld::numClick5));
  15. CCMenu* numMenu = CCMenu::create(item1, item2, item3, item4, item5, NULL);
  16. numMenu->setPosition(ccp(250, 80));
  17. numMenu->alignItemsHorizontallyWithPadding(10);
  18. this->addChild(numMenu);
  19. bRet = true;
  20. } while (0);
  21. return bRet;
  22. }
  23. void HelloWorld::numClick1( CCObject* pSender ){
  24. m_numLab->setString("1");
  25. }
  26. void HelloWorld::numClick2( CCObject* pSender ){
  27. m_numLab->setString("2");
  28. }
  29. void HelloWorld::numClick3( CCObject* pSender ){
  30. m_numLab->setString("3");
  31. }
  32. void HelloWorld::numClick4( CCObject* pSender ){
  33. m_numLab->setString("4");
  34. }
  35. void HelloWorld::numClick5( CCObject* pSender ){
  36. m_numLab->setString("5");
  37. }
  38. 很简单,创建了五个CCMenuItemLabel菜单对象,每个菜单对象对应一个回调函数,每个回调函数都对m_numLab标签进行赋值操作,不同的回调函数赋不同的值。
  39. 4.一个看起来更舒服的实现方式

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

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

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

 

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3. #include "cocos2d.h"
  4. #include "SimpleAudioEngine.h"
  5. USING_NS_CC;
  6. class HelloWorld : public cocos2d::CCLayer{
  7. public:
  8. virtual bool init();
  9. static cocos2d::CCScene* scene();
  10. CREATE_FUNC(HelloWorld);
  11. private:
  12. CCLabelTTF* m_numLab;
  13. void numClick(CCObject* pSender);
  14. };
  15. #endif  // __HELLOWORLD_SCENE_H__

 

  1. #include "HelloWorldScene.h"
  2. using namespace cocos2d;
  3. CCScene* HelloWorld::scene(){
  4. CCScene * scene = NULL;
  5. do{
  6. scene = CCScene::create();
  7. CC_BREAK_IF(! scene);
  8. HelloWorld *layer = HelloWorld::create();
  9. CC_BREAK_IF(! layer);
  10. scene->addChild(layer);
  11. } while (0);
  12. return scene;
  13. }
  14. bool HelloWorld::init(){
  15. bool bRet = false;
  16. do{
  17. CC_BREAK_IF(! CCLayer::init());
  18. /* 数字标括签 */
  19. m_numLab = CCLabelTTF::create("", "Arial", 85);
  20. m_numLab->setColor(ccGREEN);
  21. m_numLab->setPosition(ccp(250, 200));
  22. this->addChild(m_numLab);
  23. CCMenuItemLabel* item1 = CCMenuItemLabel::create(CCLabelTTF::create("one", "Arial", 35), this, menu_selector(HelloWorld::numClick));
  24. item1->setUserObject(CCString::create("1"));
  25. CCMenuItemLabel* item2 = CCMenuItemLabel::create(CCLabelTTF::create("two", "Arial", 35), this, menu_selector(HelloWorld::numClick));
  26. item2->setUserObject(CCString::create("2"));
  27. CCMenuItemLabel* item3 = CCMenuItemLabel::create(CCLabelTTF::create("three", "Arial", 35), this, menu_selector(HelloWorld::numClick));
  28. item3->setUserObject(CCString::create("3"));
  29. CCMenuItemLabel* item4 = CCMenuItemLabel::create(CCLabelTTF::create("four", "Arial", 35), this, menu_selector(HelloWorld::numClick));
  30. item4->setUserObject(CCString::create("4"));
  31. CCMenuItemLabel* item5 = CCMenuItemLabel::create(CCLabelTTF::create("five", "Arial", 35), this, menu_selector(HelloWorld::numClick));
  32. item5->setUserObject(CCString::create("5"));
  33. CCMenu* numMenu = CCMenu::create(item1, item2, item3, item4, item5, NULL);
  34. numMenu->setPosition(ccp(250, 80));
  35. numMenu->alignItemsHorizontallyWithPadding(10);
  36. this->addChild(numMenu);
  37. bRet = true;
  38. } while (0);
  39. return bRet;
  40. }
  41. void HelloWorld::numClick( CCObject* pSender ){
  42. CCMenuItemLabel* item = (CCMenuItemLabel*)pSender;
  43. CCString* text = (CCString*)item->getUserObject();
  44. m_numLab->setString(text->getCString());
  45. }

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

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

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

 


  1. bool HelloWorld::init(){
  2. bool bRet = false;
  3. do{
  4. CC_BREAK_IF(! CCLayer::init());
  5. /* 数字标括签 */
  6. m_numLab = CCLabelTTF::create("", "Arial", 85);
  7. m_numLab->setColor(ccGREEN);
  8. m_numLab->setPosition(ccp(250, 200));
  9. this->addChild(m_numLab);
  10. CCMenuItemLabel* item1 = CCMenuItemLabel::create(CCLabelTTF::create("one", "Arial", 35), this, menu_selector(HelloWorld::numClick1));
  11. CCMenuItemLabel* item2 = CCMenuItemLabel::create(CCLabelTTF::create("two", "Arial", 35), this, menu_selector(HelloWorld::numClick2));
  12. CCMenuItemLabel* item3 = CCMenuItemLabel::create(CCLabelTTF::create("three", "Arial", 35), this, menu_selector(HelloWorld::numClick3));
  13. CCMenuItemLabel* item4 = CCMenuItemLabel::create(CCLabelTTF::create("four", "Arial", 35), this, menu_selector(HelloWorld::numClick4));
  14. CCMenuItemLabel* item5 = CCMenuItemLabel::create(CCLabelTTF::create("five", "Arial", 35), this, menu_selector(HelloWorld::numClick5));
  15. CCMenu* numMenu = CCMenu::create(item1, item2, item3, item4, item5, NULL);
  16. numMenu->setPosition(ccp(250, 80));
  17. numMenu->alignItemsHorizontallyWithPadding(10);
  18. this->addChild(numMenu);
  19. bRet = true;
  20. } while (0);
  21. return bRet;
  22. }
  23. void HelloWorld::numClick1( CCObject* pSender ){
  24. m_numLab->setString("1");
  25. }
  26. void HelloWorld::numClick2( CCObject* pSender ){
  27. m_numLab->setString("2");
  28. }
  29. void HelloWorld::numClick3( CCObject* pSender ){
  30. m_numLab->setString("3");
  31. }
  32. void HelloWorld::numClick4( CCObject* pSender ){
  33. m_numLab->setString("4");
  34. }
  35. void HelloWorld::numClick5( CCObject* pSender ){
  36. m_numLab->setString("5");
  37. }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值