歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> cocos2d-x中繼承CCMenu定義自己的menu

cocos2d-x中繼承CCMenu定義自己的menu

日期:2017/3/1 10:41:43   编辑:Linux編程
在項目中為了寫一個有特殊效果的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. for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
  9. {
  10. if (c->getIsVisible() == false)
  11. {
  12. return false;
  13. }
  14. }
  15. m_pSelectedItem = this->itemForTouch(touch);
  16. if (m_pSelectedItem)
  17. {
  18. m_eState = kCCMenuStateTrackingTouch;
  19. m_pSelectedItem->selected();
  20. //這裡加入自己想要的效果。。。。。。。。。。。。。。。。
  21. return true;
  22. }
  23. return false;
  24. }
還沒有結束,我想要的是讓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. MyMenu* MyMenu::menuWithItem(CCMenuItem* item)
  17. {
  18. return menuWithItems(item, NULL);
  19. }

這樣你可以自己隨意改變裡面的m_pSelectedItem,要什麼效果,自己寫咯。

Copyright © Linux教程網 All Rights Reserved