添加一个层时,如果层子节点有CCMenu,在响应CCMenu事件回调事件做法。
重写注册触摸函数,CCMenu注册触摸。写了个测试层,代码如下:
TestLayer.h
#ifndef _TEST_LAYER_H_ #define _TEST_LAYER_H_ #include "cocos2d.h" class CTestLayer : public cocos2d::CCLayer { public: CTestLayer(void); ~CTestLayer(void); bool init(); void onEnter(); void TestClick(CCObject* pSender); virtual void registerWithTouchDispatcher(); virtual bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent * pEvent); virtual void ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent * pEvent); virtual void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event); LAYER_NODE_FUNC(CTestLayer); }; #endif
TestLayer.cpp
#include "TestLayers.h" USING_NS_CC; CTestLayer::CTestLayer(void) { } CTestLayer::~CTestLayer(void) { } bool CTestLayer::init() { if (!CCLayer::init()) return false; return true; } void CTestLayer::onEnter() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCMenuItemImage* item = CCMenuItemImage::itemFromNormalImage("bt_skin_ft.png", "bt_skin_ft.png",this, menu_selector(CTestLayer::TestClick)); item->setAnchorPoint(ccp(0.5,0.5)); item->setPosition(ccp(size.width / 2 ,size.height / 2)); CCMenu* menu = CCMenu::menuWithItem(item); menu->setPosition(ccp(0,0)); addChild(menu); setIsTouchEnabled(true); //给当前层注册触摸,当前层就可以捕获触摸事件,不是此层的节点将不会收到触发 registerWithTouchDispatcher(); //点击menu时,将回调上面的TestClick函数 menu->registerWithTouchDispatcher(); } void CTestLayer::TestClick(CCObject* pSender) { } bool CTestLayer::ccTouchBegan(CCTouch *touch, CCEvent * pEvent) { //如果为false 层将不能接受任何触摸事件 return true; } void CTestLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { } void CTestLayer::ccTouchMoved(CCTouch* touch, CCEvent* event) { } void CTestLayer::registerWithTouchDispatcher() { //注册单点触摸,第三个参数 表示接收所有触摸事件, CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,kCCMenuTouchPriority,true); } void CTestLayer::TestClick(CCObject* pSender) { } bool CTestLayer::ccTouchBegan(CCTouch *touch, CCEvent * pEvent) { return true; } void CTestLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { } void CTestLayer::ccTouchMoved(CCTouch* touch, CCEvent* event) { } void CTestLayer::registerWithTouchDispatcher() { //注册触摸事件,第三个参数表示接受所有触摸 CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,kCCMenuTouchPriority,true); }