在項目中為了寫一個有特殊效果的menu,於是想想,不就是幾個action嗎,回調一下就ok了,的確這樣實現了,關鍵在於這個項目中實在是灰常多的按鈕,寫了6、7個後,我吐血了,決定繼承CCmenu,自己定義一個,這樣就不用每個都寫了。
原理很簡單,新建一個類繼承自CCMenu,重寫它的touch事件,加入自己的效果。
- bool MyMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
- {
- CC_UNUSED_PARAM(event);
- if (m_eState != kCCMenuStateWaiting || ! m_bIsVisible)
- {
- return false;
- }
-
- for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
- {
- if (c->getIsVisible() == false)
- {
- return false;
- }
- }
-
- m_pSelectedItem = this->itemForTouch(touch);
- if (m_pSelectedItem)
- {
- m_eState = kCCMenuStateTrackingTouch;
- m_pSelectedItem->selected();
- //這裡加入自己想要的效果。。。。。。。。。。。。。。。。
- return true;
- }
- return false;
- }
還沒有結束,我想要的是讓menu裡面的item有特效,那麼我還應該重寫它的menuWithItems方法。
一定要記得改變他的初始化方法,原來的初始化方法返回的是系統的CCMenu,要自己改為返回自己定義的Menu
- MyMenu * MyMenu::menuWithItems(CCMenuItem* item, ...)
- {
- va_list args;
- va_start(args,item);
- MyMenu *pRet = new MyMenu();//這裡記得要注意
- if (pRet && pRet->initWithItems(item, args))
- {
- pRet->autorelease();
- va_end(args);
- return pRet;
- }
- va_end(args);
- CC_SAFE_DELETE(pRet)
- return NULL;
- }
-
- MyMenu* MyMenu::menuWithItem(CCMenuItem* item)
- {
- return menuWithItems(item, NULL);
- }
這樣你可以自己隨意改變裡面的m_pSelectedItem,要什麼效果,自己寫咯。