cocos2dx 解决CCMenu和CCScrollViewDelegate 触摸问题

   在使用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


在调用的时候,直接实例化这个,操作方法和CCmenu一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值