直接上代码吧,参考了网上找的例子,自己做了小小的改动
主要实现代码:
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;
}