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

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

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

主要实现代码:

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