zoukankan      html  css  js  c++  java
  • cocos2d触摸事件处理机制(2.x和3.x变化)

    2.x的触摸事件的版本号

    触摸事件处理有2种子。以下单点触摸的样本。(另一种多点触摸屏)。

    创建cocos2d 该项目。

    1. 重写下面虚函数。

      bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);  
      void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);  
      void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event); 


    //注意不要和ccTouchesBegan函数混淆,这是多点触屏的响应事件。顾名思义。加了es。
      void onEnter(); 
      void onExit(); //这个函数是点击关闭button运行的函数,能够在里面加入有必要的代码,再退出之前。

    ,这里主要是退出前进行移除触屏事件。

      //假设有学过MFC的话,这个函数就是类似于OnCancel()函数。

     //以下就是简单地说明步骤。

    2.然后为上面的函数加入内容。

    void HelloWorld::onEnter()
    {   
     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);  //注冊事件
     CCLayer::onEnter();
     
    }
    void HelloWorld::onExit()
    {
    
     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
     CCLayer::onExit();
    }
    bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)  
      {  
           CCLOG("ccTouchBegan");  //后台输出
           return true;  
       } 
    void HelloWorld::ccTouchMoved(CCTouch* touch, CCEvent* event){  
          CCLOG("ccTouchMoved");  
       } 
    void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event)  
     {  
        CCLOG("ccTouchEnded");  
     } 


    这里笔者感概一下、

    //有人说

    //“正确的应该使用setTouchEnabled(true)来注冊事件,对于上面的注冊事件的代码的简化。会出现逻辑问题,并且造成控制触屏事件的操作性减低”

    // 我说,不然。既然你使用了自己的方法去注冊事件,你就不是必需再次使用他们封装好的setTouchEnabled()函数。里面函数有他们的逻辑推断。(你能够

    不断寻找到那个函数的内容看看的)。我们也有自己的逻辑推断。

    所以不是正确与错的问题。而是你的游戏需求,需不须要。另外。我更喜欢懂其然,

    知其理,还有我想说,这个cocos2d框架已经减低非常大的门槛了,把非常多底层的操作封装,所以不懂opengl和dx的人也能够上手,这里我想说。

    对于不懂opengl和dx,还是有必要去加强基础。虽说。你不去学习。也没有什么大问题,可是非常多大问题通常是建立在细节上。

    经过了上面2个步骤,简单实现了单点触屏事件的处理。

    以下顺便也讲一下多点触屏事件的处理。

    步骤差点儿相同。只是就是重写函数有点差别。

    1.重写下面函数。

    <pre name="code" class="cpp">virtual <span style="font-family: Arial, Helvetica, sans-serif;">void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);</span>
    virtual <span style="font-family: Arial, Helvetica, sans-serif;">void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);</span>
    virtual <span style="font-family: Arial, Helvetica, sans-serif;">void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);</span>
    virtual void onEnter();virtual void onExit();

    
    

    2.为上面的函数加入内容。

    void HelloWorld::onEnter()
    {
    
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority -1,true); //这里和第一个有差别
     CCLayer::onEnter();
    }
    void HelloWorld::onExit()
    {
    
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
     CCLayer::onExit();
    }


    其它的3个事件响应内容自己写。笔者不再反复上面的了。

    3.x版本号的触屏事件

    谈到3.x版本号的cocos,这变化不是一般的大,各种处理方式都改变了,算了,你懂得,不谈他的变化有多大。下面是3.x版本号的触屏事件处理方式。

    尽管是改变比較大,但处理方式和思维给开发人员一个非常方便的处理方式。3.x的版本号我认为规范性比2.x好了好多。下面直接给代码。不进行解析
    多点触摸类似
    //单点触摸  
    	virtual bool onTouchBegan(Touch *touch, Event * pEvent);
    	virtual void onTouchMoved(Touch *touch, Event * pEvent);
    	virtual void onTouchEnded(Touch *touch, Event * pEvent); 
    	virtual void onTouchCancelled(Touch *touch, Event * pEvent);  
    
         auto dispatcher = Director::getInstance()->getEventDispatcher();  
    	auto TouchListener = EventListenerTouchOneByOne::create();   
    	TouchListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this);  
    	TouchListener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved,this);   
    	TouchListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded,this);   
    	TouchListener->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled,this);   
    	TouchListener->setSwallowTouches(true);  
    	dispatcher->addEventListenerWithSceneGraphPriority(TouchListener,this);
    
    bool HelloWorld::onTouchBegan(Touch *touch, Event * pEvent)
    {
    	CCLOG("onTouchBegan");
    	return 1;
    }
    void HelloWorld::onTouchMoved(Touch *touch, Event * pEvent)
    {
    	CCLOG("onTouchMoved");
    }
    void HelloWorld::onTouchEnded(Touch *touch, Event * pEvent)
    {
    	CCLOG("onTouchEnded");
    }
    void HelloWorld::onTouchCancelled(Touch *touch, Event * pEvent)
    {
    	CCLOG("onTouchCancelled");
    }
    




  • 相关阅读:
    Problem 1014 xxx游戏 暴力+拓扑排序
    Codeforces Beta Round #10 D. LCIS
    HDU 1423 Greatest Common Increasing Subsequence LCIS
    Codeforces Round #349 (Div. 1) A. Reberland Linguistics dp
    BZOJ 3875: [Ahoi2014]骑士游戏 dp+spfa
    Codeforces Round #360 (Div. 2) E. The Values You Can Make 01背包
    Codeforces Round #360 (Div. 2) D. Remainders Game 中国剩余定理
    UVALive 4872 Underground Cables 最小生成树
    POJ 1182 食物链 并查集
    山东省第六届ACM省赛
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4558690.html
Copyright © 2011-2022 走看看