Cocos2d-x学习之实现类似android的菜单栏tabbar效果

来源:互联网 发布:hadoop2.7.1 windows 编辑:程序博客网 时间:2024/05/22 09:01

直接上代码吧,参考了网上找的例子,自己做了小小的改动

主要实现代码:

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;}






原创粉丝点击