#ifndef __SceneHello__CCRadioMenu__
#define __SceneHello__CCRadioMenu__
#include "cocos2d.h"
class CCRadioMenu : public cocos2d::Ccmenu{
public:
CCRadioMenu():cocos2d::Ccmenu(){}
cocos2d::CcmenuItem *_curHighlighted;
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch,cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch,cocos2d::CCEvent *pEvent);
virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch,cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch,cocos2d::CCEvent *pEvent);
void setSelectedItem_(cocos2d::CcmenuItem *item);
static CCRadioMenu* create(cocos2d::CcmenuItem* item,...);
};
#endif /* defined(__SceneHello__CCRadioMenu__) */
#include "CCRadioMenu.h"
using namespace cocos2d;
CCRadioMenu *CCRadioMenu::create(CcmenuItem *item,...){
va_list args;
va_start(args,item);
CCRadioMenu *pRet = new CCRadioMenu();
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*);
}
}
if (pRet && pRet->initWithArray(pArray))
{
pRet->autorelease();
va_end(args);
return pRet;
}
va_end(args);
CC_SAFE_DELETE(pRet);
return NULL;
}
void CCRadioMenu::setSelectedItem_(CcmenuItem *item){
m_pSelectedItem = NULL;
m_pSelectedItem = item;
}
bool CCRadioMenu::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent){
if (m_eState != kCcmenuStateWaiting) return false;
CcmenuItem *curSelection = this->itemForTouch(pTouch);
if (curSelection) {
curSelection->selected();
_curHighlighted = curSelection;
if (_curHighlighted) {
if (m_pSelectedItem != curSelection) {
m_pSelectedItem->unselected();
}
m_eState = kCcmenuStateTrackingTouch;
return true;
}
}
return false;
}
void CCRadioMenu::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent){
CCAssert(m_eState == kCcmenuStateTrackingTouch,"[Menu ccTouchEnded] -- invalid state");
CcmenuItem *curSelection = this->itemForTouch(pTouch);
if (curSelection != _curHighlighted && curSelection != NULL) {
m_pSelectedItem->selected();
_curHighlighted->unselected();
_curHighlighted = NULL;
m_eState = kCcmenuStateWaiting;
return;
}
m_pSelectedItem = _curHighlighted;
_curHighlighted->activate();
_curHighlighted = NULL;
m_eState = kCcmenuStateWaiting;
}
void CCRadioMenu::ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent){
CCAssert(m_eState == kCcmenuStateTrackingTouch,"[Menu ccTouchCancelled] -- invalid state");
m_pSelectedItem->selected();
_curHighlighted->unselected();
_curHighlighted = NULL;
m_eState = kCcmenuStateWaiting;
}
void CCRadioMenu::ccTouchMoved(CCTouch *pTouch,"[Menu ccTouchMoved] -- invalid state");
CcmenuItem *curSelection = this->itemForTouch(pTouch);
if (curSelection != _curHighlighted && curSelection != NULL) {
_curHighlighted->unselected();
curSelection->selected();
_curHighlighted = curSelection;
return;
}
}
用法:
CcmenuItemImage *menuItem_man = CcmenuItemImage::create(
"jsman_nor.png","jsman_pre.png",this,menu_selector(HelloWorld::selectMan));
menuItem_man->setPosition(ccp(size.width*0.3f,size.height*0.66f));
CcmenuItemImage *menuItem_man2 = CcmenuItemImage::create(
"jsman_nor.png",menu_selector(HelloWorld::selectMan));
menuItem_man2->setPosition(ccp(size.width*0.3f,size.height*0.3f));
CcmenuItemImage *menuItem_woman = CcmenuItemImage::create(
"jswoman_nor.png","jswoman_pre.png",menu_selector(HelloWorld::selectWomen));
menuItem_woman->setPosition(ccp(size.width*0.7f,size.height*0.66f));
CcmenuItemImage *menuItem_woman2 = CcmenuItemImage::create(
"jswoman_nor.png",menu_selector(HelloWorld::selectWomen));
menuItem_woman2->setPosition(ccp(size.width*0.7f,size.height*0.3f));
CCRadioMenu *radioMenu = CCRadioMenu::create(menuItem_man,menuItem_man2,menuItem_woman,menuItem_woman2,NULL);
radioMenu->setSelectedItem_(menuItem_man);
menuItem_man->selected();
radioMenu->setPosition(CCPointZero);
this->addChild(radioMenu,1);