多个菜单回调——UserObject自定义数据"/>
一个函供应多个菜单回调——UserObject自定义数据
一个简单的需求所以,在Cocos2d-x里我也想类似这么用,假设我有这样一个需求:有五个菜单和一个标签,点击不同的菜单,标签就显示不同的内容。
效果如下图所示:
3.一般的做法
正常情况下,我们会这么做,先声明几个函数:
一个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标签赋值。
- 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");
- }
更多推荐
一个函供应多个菜单回调——UserObject自定义数据
发布评论