Cocos2d-x学习之实现相仿android的菜单栏tabbar效果
Cocos2d-x学习之实现类似android的菜单栏tabbar效果
用到的类
XYMenu.cpp
直接上代码吧,参考了网上找的例子,自己做了小小的改动
主要实现代码:
CCMenuItemImage *pMainHome = CCMenuItemImage::create("main_1.png","main_1_sel.png", this,menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pMainHome); CCMenuItemImage *pMainLocation = CCMenuItemImage::create("main_2.png","main_2_sel.png", this,menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pMainLocation); CCMenuItemImage *pMainSearch = CCMenuItemImage::create("main_3.png","main_3_sel.png", this,menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pMainSearch); CCMenuItemImage *pMainLogin = CCMenuItemImage::create("main_4.png","main_4_sel.png", this,menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pMainLogin); CCMenuItemImage *pMainMore = CCMenuItemImage::create("main_5.png","main_5_sel.png", this,menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pMainMore); XYMenu* pMenu = XYMenu::create(pMainHome,pMainLocation,pMainSearch,pMainLogin,pMainMore,NULL); pMenu->setPosition(CCPointZero); CC_BREAK_IF(! pMenu); this->addChild(pMenu, 2);
用到的类
XYMenu.h
#ifndef __Test2__XYMenu__ #define __Test2__XYMenu__ #include "cocos2d.h" USING_NS_CC; class XYMenu : public CCMenu { public: int iCount; XYMenu(void); ~XYMenu(void); void setSelectedItem(CCMenuItem *item); bool getInit(CCArray* pArrayOfItems); static XYMenu *create(CCMenuItem *item, ...); static XYMenu* createWithItems(CCMenuItem *firstItem, va_list args); static XYMenu* createWithArray(CCArray* pArrayOfItems); virtual bool ccTouchBegan(CCTouch* touch,CCEvent* event); virtual void ccTouchEnded(CCTouch* touch, CCEvent* event); virtual void ccTouchCancelled(CCTouch *touch, CCEvent* event); virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); private: CCMenuItem *m_curHighlighted; }; #endif /* defined(__Test2__XYMenu__) */
XYMenu.cpp
#include "XYMenu.h" XYMenu::XYMenu() { } XYMenu::~XYMenu() { } bool XYMenu::getInit(CCArray* pArrayOfItems) { CCSize s = CCDirector::sharedDirector()->getWinSize(); CCMenuItem* m_pItem = NULL; CCObject* _object; CCArray* ItemArray = pArrayOfItems; int count = ItemArray->count(); int i = 0; CCARRAY_FOREACH(ItemArray, _object) { m_pItem = (CCMenuItem*)_object; if (m_pItem) { if (!i) { setSelectedItem(m_pItem); } m_pItem->setPosition(ccp(s.width/count/2+s.width/count*i,m_pItem->getContentSize().height/2)); m_pItem->setTag(i); i++; } } return true; } void XYMenu::setSelectedItem(CCMenuItem *item) { if (item != m_pSelectedItem) { if (m_pSelectedItem != NULL) { m_pSelectedItem->unselected(); } m_pSelectedItem = item; m_pSelectedItem->selected(); } } XYMenu* XYMenu::create(CCMenuItem *item, ...) { va_list args; va_start(args,item); XYMenu *pRet = XYMenu::createWithItems(item, args); pRet->iCount = 0; va_end(args); return pRet; } XYMenu* XYMenu::createWithItems(CCMenuItem* item, va_list args) { CCArray* pArray = NULL; if( item ) { pArray = CCArray::create(item, NULL); CCMenuItem *i = va_arg(args, CCMenuItem*); while(i) { pArray->addObject(i); i = va_arg(args, CCMenuItem*); } } return XYMenu::createWithArray(pArray); } XYMenu* XYMenu::createWithArray(CCArray* pArrayOfItems) { XYMenu *pRet = new XYMenu(); if (pRet && pRet->initWithArray(pArrayOfItems) && pRet->getInit(pArrayOfItems)) { pRet->autorelease(); } else { CC_SAFE_DELETE(pRet); } return pRet; } bool XYMenu::ccTouchBegan(CCTouch *touch,CCEvent *event) { CCLog("touched-----begin+++%d",iCount); iCount++; CC_UNUSED_PARAM(event); if (m_eState != kCCMenuStateWaiting ) return false; for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent()) { if (c->isVisible() == false) return false; } CCMenuItem *curSelection = this->itemForTouch(touch); if (curSelection != NULL) { curSelection->selected(); m_curHighlighted = curSelection; if (m_curHighlighted) { if (m_pSelectedItem != curSelection) { m_pSelectedItem->unselected(); } m_eState = kCCMenuStateTrackingTouch; return true; } } return false; } void XYMenu::ccTouchMoved(CCTouch *touch,CCEvent *event) { CCLog("touched-----move"); CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchMoved] -- invalid state"); CCMenuItem *curSelection = this->itemForTouch(touch); if (m_curHighlighted != curSelection && curSelection != NULL) { m_curHighlighted->unselected(); curSelection->selected(); m_curHighlighted = curSelection; return; } } void XYMenu::ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) { CCLog("touched-----end+++%d",iCount); iCount++; CC_UNUSED_PARAM(touch); CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchEnded] -- invalid state"); CCMenuItem *curSelection = this->itemForTouch(touch); if (curSelection != m_curHighlighted && curSelection != NULL) { m_pSelectedItem->selected(); m_curHighlighted->unselected(); m_curHighlighted = NULL; m_eState = kCCMenuStateWaiting; return; } m_pSelectedItem = m_curHighlighted; m_curHighlighted->activate(); m_curHighlighted = NULL; m_eState = kCCMenuStateWaiting; } void XYMenu::ccTouchCancelled(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) { CCLog("touched-----cancel+++%d",iCount); iCount++; CC_UNUSED_PARAM(touch); CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchCancelled] -- invalid state"); m_pSelectedItem->selected(); m_curHighlighted->unselected(); m_curHighlighted = NULL; m_eState = kCCMenuStateWaiting; }