自己定义一个Menu继承CCMenu,在触摸事件中定义一个bool 变量 moved,根据moved的真假来判断是点击事件还是滑动,滑动的话就不会点击。
代码如下:
定义自己的MyMenu
class MyMenu:public CCMenu
{
public:
MyMenu();
~MyMenu();
static MyMenu* creat();
virtual void registerWithTouchDispatcher();
bool moved;
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
};
实现方法:
#include "MyMenu.h"
MyMenu::MyMenu()
{}
MyMenu::~MyMenu()
{}
MyMenu* MyMenu::creat()
{
MyMenu* pRet=new MyMenu;
if(pRet&&pRet->init())
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
void MyMenu::registerWithTouchDispatcher()
{
//注册触摸事件
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);
}
void MyMenu::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
{
}
void MyMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
//如果滑动就让moved=true
moved=true;
CCMenu::ccTouchMoved(pTouch, pEvent);
}
void MyMenu::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
if(!moved)
{
//让menu执行点击方法
CCMenu::ccTouchEnded(pTouch, pEvent);
}
else
{
//让menu不执行点击方法
m_eState=kCCMenuStateWaiting;
}
}
bool MyMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
//刚开始时moved为False
moved=false;
return CCMenu::ccTouchBegan(pTouch, pEvent);
}
//在HelloWorldScene中实现,可看到menu在移动的时候不会触摸点击方法
//位置宏
#define POS_CENTER ccp(winSize.width/2.0,winSize.height/2.0)
//尺寸宏
#define SIZE_SCROLL CCSizeMake(480,300)//ScrollView
#define SIZE_SCROLL_LAYER CCSizeMake(winSize.width*7,100)
//文件名宏
const char* const NAME_CHAPTER[7]={"Default.png","Default.png","Default.png","Default.png","Default.png","Default.png","Default.png"};
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
CCSize winSize=CCDirector::sharedDirector()->getWinSize();
CCScrollView* scrollView=CCScrollView::create();
scrollView->setViewSize(SIZE_SCROLL);
CCLayer* containerLayer=CCLayer::create();
containerLayer->setContentSize(SIZE_SCROLL_LAYER);
MyMenu* menu=MyMenu::creat();
for(int i=0;i<7;i++)
{
CCMenuItemImage* sp1=CCMenuItemImage::create(NAME_CHAPTER[i], NAME_CHAPTER[i]);
sp1->setTarget(this, menu_selector(HelloWorld::menuCloseCallback));
sp1->setScale(0.75);
sp1->setPosition(ccp(100+300*i, 50));
sp1->setAnchorPoint(CCPointZero);
menu->addChild(sp1);
}
menu->setPosition(CCPointZero);
menu->setAnchorPoint(CCPointZero);
containerLayer->addChild(menu);
scrollView->setContainer(containerLayer);
scrollView->setDirection(kCCScrollViewDirectionHorizontal);
scrollView->setContentOffset(ccp(-80,0));
scrollView->setPosition(ccp(20,20));
//scrollView->setAnchorPoint(CCPointZero);
this->addChild(scrollView);