Cocos2d-x之Touch事件处理机制

http://www.cppblog.com/Tongy0/archive/2013/03/10/198325.aspx


一、两种机制的四种不同的事件

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);处理打断事件

两者的区别: CCSetCCTouch ,一个事件集合一个单个事件。

事件分发的顺序: CCTargetedTouchDelegateCCStandardTouchDelegate

默认情况下所有 CCLayer 都没有启用触摸事件,需要 this->setIsTouchEnabled(true); 启用。

如需更改事件: void registerWithTouchDispatcher(void) {}

class MyLayer: public cocos2d:CCLayer {
public:
    virtual void registerWithTouchDispatcher(void);

    // addStandardDelegate()
    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);

    // addTargetedDelegate()
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
}

void MyLayer::registerWithTouchDispatcher(void) {
    // 委托,优先级
    CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, kCCMenuTouchPriority);
    // 委托,优先级,是否继续处理
    CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true);

    // 2.0版本以后
    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, kCCMenuHandlerPriority);
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
}

利用 ccTouchBeganccTouchesBegan 加以实现点击的回调

void MyLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {
    // 单点
    CCTouch *pTouch = (CCTouch*)(pTouches->anyObject());

    // 所有点
    for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++) {
        CCTouch *pCurTouch =  (CCTouch*)(*iterTouch);
    }

    // 获取点在视图中的坐标(左上角为原点)
    CCPoint touchLocation = pTouch->getLocationInView();
    // 把点的坐标转换成OpenGL坐标(左下角为原点)
    touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);
    // 把OpenGL的坐标转换成CCLayer的坐标
    CCPoint local = convertToNodeSpace(touchLocation)
    // 大小为100x100,坐标为(0, 0)的矩形
    CCRect * rect = CCRectMake(0, 0, 100, 100);
    // 判断该坐标是否在rect矩形内
    bool flag = rect.containsPoint(local)
    if(flag) {
        // 回调
    } else {
        // 不执行
    }
}

http://blog.sina.com.cn/s/blog_6c97abf10102v6hs.html


移动时代,手机很重要的一部分就是可以人机交互,玩家通过手指在屏幕上移动点击与游戏进行互动,传达信息。相比PC上鼠标的输入,这种触控能带给用户更真实的体验,所以触摸事件也是游戏中不可缺少的部分,并且随着手机硬件的不断提升,现在市场上大部分手机屏幕也支持多点触摸。本节视频将介绍在引擎中如何响应单点和多点触摸事件。

11111111111111 单点触控

class MyScene : public CCLayer
{
public:
 MyScene(void);
 ~MyScene(void);
 virtual bool init();
 static CCScene *scene();

 void menuCallback(CCObject* pSender);

 virtual voidonEnter();
 virtual void onExit();

 virtual boolccTouchBegan(CCTouch *pTouch,CCEvent*event); //第一次触屏事件
 virtual void ccTouchMoved(CCTouch *pTouch,CCEvent*event); //滑动操作
 virtual void CCTouchEnded(CCTouch *pTouch,CCEvent*event); //当离开屏幕时候,响应的事件
 virtual void ccTouchCancelled(CCTouch*pTouch,CCEvent *event); //取消

 CCSprite *sp;

 CREATE_FUNC(MyScene);

};
//
void MyScene:: onEnter()
{
 CCLayer::onEnter();
 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
  //1,委托目标,2,值越小,优先级别越高,如果0,按钮最先被响应。3,是否拦截后面的操作

}

void MyScene::onExit()
{
 CCLayer::onExit();
 CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

bool MyScene:: ccTouchBegan(CCTouch *pTouch,CCEvent*event) //第一次触屏事件
{
 CCPoint pos =pTouch->getLocation();//返回OPenGL坐标
 
 sp =CCSprite::create("icon.png"); //创建一个精灵
 sp->setPosition(pos);
 addChild(sp);

 CCLOG("TouchBegan");


 returntrue;//true,继续响应后面的,false,就不响应后面的了
}

void MyScene::ccTouchMoved(CCTouch *pTouch,CCEvent*event) //滑动操作
{
 CCPoint pos =pTouch->getLocation();//返回OPenGL坐标
 sp->setPosition(pos);

 CCLOG("TouchMoved");
}
void MyScene::CCTouchEnded(CCTouch *pTouch,CCEvent*event) //当离开屏幕时候,响应的事件
{
 CCLOG("TouchEnded");
}
void MyScene::ccTouchCancelled(CCTouch *pTouch,CCEvent*event) //取消
{
 CCLOG("TouchCancelled");
}

//多点触控 

 

virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *event);
 virtual void ccTouchesMoved(CCSet*pTouches,CCEvent *event);
 virtual void ccTouchesEnded(CCSet*pTouches,CCEvent *event);

 

//

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

 CCSetIterator iter = pTouches->begin();
 for(;iter != pTouches->end(); iter++)
 {
  CCTouch *pTouch =(CCTouch*)(*iter);
  CCPoint pos =pTouch->getLocation();

  CCSprite *sp =CCSprite::create("icon.png");
  sp->setPosition(pos);
  addChild(sp);
 }

 

}

//

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{

 //多点触控也可设置成单点触控

CCTouch *touch =(CCTouch*)pTouches->anyObject();
 CCPoint pos = touch->getStartLocation();
 CCSprite *sp =CCSprite::create("icon.png");
 sp->setPosition(pos);
 addChild(sp);

}

 

void MyScene::ccTouchesMoved(CCSet *pTouches,CCEvent *event)
{

}

void MyScene::ccTouchesEnded(CCSet *pTouches,CCEvent *event)
{

}

//333333333333333

void MyScene::ccTouchesBegan(CCSet *pTouches,CCEvent*event)//得到每个触摸点
{
 
 CCSetIterator iter = pTouches->begin();
 for(;iter != pTouches->end(); iter++)
 {
  CCTouch *pTouch =(CCTouch*)(*iter);
  CCPoint pos =pTouch->getLocation();

  pTouch->getID();//可以得到有几个点

  
 }
 //CCTouch *touch =(CCTouch*)pTouches->anyObject();
 //CCPoint pos =touch->getStartLocation();
 //CCSprite *sp =CCSprite::create("icon.png");
 //sp->setPosition(pos);
 //addChild(sp);
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值