1. 事件介绍
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); // 这个是一张图片的精灵对象,达到图片根据手指移动进行拖动的效果。
}