cocos2d-x中继承CCMenu定义自己的menu


在项目中为了写一个有特殊效果的menu,于是想想,不就是几个action吗,回调一下就ok了,的确这样实现了,关键在于这个项目中实在是灰常多的按钮,写了6、7个后,我吐血了,决定继承CCmenu,自己定义一个,这样就不用每个都写了。  

原理很简单,新建一个类继承自CCMenu,重写它的touch事件,加入自己的效果。

  1. bool MyMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)  
  2. {  
  3.     CC_UNUSED_PARAM(event);  
  4.     if (m_eState != kCCMenuStateWaiting || ! m_bIsVisible)  
  5.     {  
  6.         return false;  
  7.     }  
  8.       
  9.     for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())  
  10.     {  
  11.         if (c->getIsVisible() == false)  
  12.         {  
  13.             return false;  
  14.         }  
  15.     }  
  16.       
  17.     m_pSelectedItem = this->itemForTouch(touch);  
  18.     if (m_pSelectedItem)  
  19.     {  
  20.         m_eState = kCCMenuStateTrackingTouch;  
  21.         m_pSelectedItem->selected();  
  22.         //这里加入自己想要的效果。。。。。。。。。。。。。。。。   
  23.         return true;  
  24.     }  
  25.     return false;  
  26. }  
还没有结束,我想要的是让menu里面的item有特效,那么我还应该重写它的menuWithItems方法。

一定要记得改变他的初始化方法,原来的初始化方法返回的是系统的CCMenu,要自己改为返回自己定义的Menu

  1. MyMenu * MyMenu::menuWithItems(CCMenuItem* item, ...)  
  2. {  
  3.     va_list args;  
  4.     va_start(args,item);  
  5.     MyMenu *pRet = new MyMenu();//这里记得要注意   
  6.     if (pRet && pRet->initWithItems(item, args))  
  7.     {  
  8.         pRet->autorelease();  
  9.         va_end(args);  
  10.         return pRet;  
  11.     }  
  12.     va_end(args);  
  13.     CC_SAFE_DELETE(pRet)  
  14.     return NULL;  
  15. }  
  16.   
  17. MyMenu* MyMenu::menuWithItem(CCMenuItem* item)  
  18. {  
  19.     return menuWithItems(item, NULL);  
  20. }  

这样你可以自己随意改变里面的m_pSelectedItem,要什么效果,自己写咯。

相关内容