在使用CCScrollViewDelegate中,会遇到一个问题。如果在里面添加的是CCmenu就会导致无法实现拖动效果,只会触发到CCmenu的事件。这时候,需要自己重写一个CCmenu类,实现对触摸等级的改变和触摸事件的改写。
运用的方法是,首先降低CCmenu的触摸等级,然后在设置一个正方形(根据自己的按钮大小),如果然后再触摸事件中做判断,满足条件再启动事件。
例子:cpp文件
#include "FDMenu.h"
USING_NS_CC;
#include "cocos-ext.h"
using namespace extension;
FDMenu* FDMenu::create()
{
return FDMenu::create(NULL, NULL);
}
FDMenu * FDMenu::create(CCMenuItem* item, ...)
{
va_list args;
va_start(args,item);
FDMenu *pRet = new FDMenu();
if (pRet && pRet->initWithItems(item, args))
{
pRet->autorelease();
va_end(args);
return pRet;
}
va_end(args);
CC_SAFE_DELETE(pRet);
return NULL;
}
FDMenu* FDMenu::create(CCArray* pArrayOfItems)
{
FDMenu *pRet = new FDMenu();
if (pRet && pRet->initWithArray(pArrayOfItems))
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}
return pRet;
}
// 重写registerWithTouchDispatcher
void FDMenu::registerWithTouchDispatcher()
{
//这里优先级设为1,只要比CCScrollView低就可以
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);
}
bool FDMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
if(m_visibleRect.size.width&&m_visibleRect.size.height){
if(!m_visibleRect.containsPoint(pTouch->getLocation()))
return false;
}
m_bMoved=false;
return CCMenu::ccTouchBegan(pTouch,pEvent);
}
void FDMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){
//如果因为太灵敏的原因 可以在这里增加变量判断,如果滑动量大于一个值才返回false
m_bMoved=true;
CCMenu::ccTouchMoved(pTouch,pEvent);
}
void FDMenu::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){
if(!m_bMoved)
CCMenu::ccTouchEnded(pTouch,pEvent);
else{
m_eState = kCCMenuStateWaiting;
if(m_pSelectedItem){
m_pSelectedItem->unselected();
}
}
}
void FDMenu::setVisibleRect(CCRect rect)
{
m_visibleRect = rect;
}
CCRect FDMenu::getVisibleRect()
{
return m_visibleRect;
}
.h文件
#ifndef __FDMenu_h__
#define __FDMenu_h__
#include "cocos2d.h"
USING_NS_CC;
class FDMenu : public CCMenu
{
public:
/** creates an empty CCMenu */
static FDMenu* create();
/** creates a CCMenu with it's items */
static FDMenu* create(CCMenuItem* item, ...);
/** creates a CCMenu with a CCArray of CCMenuItem objects */
static FDMenu* create(CCArray* pArrayOfItems);
bool m_bMoved;
CCRect m_visibleRect;
void setVisibleRect(CCRect rect);
CCRect getVisibleRect();
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
};
#endif