CCStandardTouchDelegate 默认事件
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); 处理按下事件virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); 处理按下并移动事件
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); 处理松开事件
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);处理打断事件
CCTargetedTouchDelegate
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);处理用户按下事件,true表示继续处理, 否则false.
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);处理按下并移动事件
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);处理松开事件
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);处理打断事件
两者的区别: CCSet 与 CCTouch ,一个事件集合一个单个事件。
事件分发的顺序: CCTargetedTouchDelegate → CCStandardTouchDelegate 。
默认情况下所有 CCLayer 都没有启用触摸事件,需要 this->setIsTouchEnabled(true); 启用。
如需更改事件: void registerWithTouchDispatcher(void)
2. 代码实现
我用的是 cocos2d-x 2.1 版本,它的各阶段API都有不同程度的修改,所以看准版本号
- HelloWorld.h 代码片段
- class HelloWorld : public cocos2d::CCLayer
- {
- public:
- // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
- virtual bool init();
- virtual void registerWithTouchDispatcher(void);
- virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
- virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
- HelloWord.cpp 代码片段
- void HelloWorld::registerWithTouchDispatcher()
- {
- CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority,true);
- }
- bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCLOG("touch began.");
- return true;
- }
- void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCLOG("touch moved.");
- //获取触摸点初始化坐标
- CCPoint beginPoint = pTouch->getLocationInView();
- beginPoint = CCDirector::sharedDirector()->convertToGL(beginPoint);
- pSprite->setPosition(beginPoint); // 这个是一张图片的精灵对象,达到图片根据手指移动进行拖动的效果。
- }