zoukankan      html  css  js  c++  java
  • cocos2dx-多点触控

    声  明


           本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。

    gl.paea.cn版权所有。




           hello,大家好,欢迎回到“和屌丝一起学cocos2dx”系列教程。上节我们说到了触控事件,不知道大家回去有没有测试呢?那个可爱的叮当猫是不是可以随着你的手指一起移动呢?哈哈,好了,这节我们说一下多点触控,估计大家早就迫不及待了吧。


    【一】:这个和单点有啥区别


    1.使用上的区别。

    这个不用多说,有些情况下我们是需要多点触控来实现更好的效果,比如,切水果。


    2.和单点的区别

    [1].单点使用监听类是CCtargetedTouchDelegate,而多点使用CCtangardTouchDelegate.

    [2].多点触控还需要多一个步骤就是注册多点触控。这里你可能会问,为啥单点触控都放在onEnter生命周期函数里,多点干嘛要单独写个。这里是因为,如果你放在onEnter里,可能会崩溃哦。

    [3].另外多点触控要有开启才能用,就是开启多点触控函数setTouchEnabled.

    [4].多点触控中的ccTouchesBegan不是布尔型哦。


    【二】:函数


    添加委托

    addStandardDelegate();


    开启多点触控(不写没有效果哦)

    setTouchEnabled();


    触屏事件:

    1.注册多点触控

    virtual void registerWithTouchDispatcher(void);

    2.当用户第一次触碰手机屏幕时响应的回调函数

    virtual void ccTouchesBegan(CCSet * touchs,CCEvent * event);

    3.当用户手指在手机屏幕上滑动时响应的回调函数

    virtual void ccTouchesMoved(CCSet * touchs,CCEvent * event);

    4.当用户手指在离开手机屏幕上时响应的回调函数

    virtual void ccTouchesEnded(CCSet * touchs,CCEvent * event);


    这里不再使用参数CCTouch,而是他们的集合。


    CCtouch

    1.getID()//得到当前触点的下标(0开始)


    【三】:示例


    1.新建项目Touchsdemo

    2.加载5张图片



    Touchsdemo.h


    //写上多点触控的回调函数

    virtual void registerWithTouchDispatcher(void);

    virtual void ccTouchesBegan(CCSet * set,CCEvent * e);

    virtual void ccTouchesMoved(CCSet * set,CCEvent * e);

    virtual void ccTouchesEnded(CCSet * set,CCEvent * e);

    //写上生命周期函数

    virtual void onEnter();

    virtual void onExit();



    Touchsdemo.cpp


    1.初始化函数中


    这里我们创建5个精灵,用于区分5点。

    //-new-//

    CCSize mysize=CCDirector::sharedDirector()->getWinSize();

    //添加5个精灵

    CCSprite* sp1 = CCSprite::create("1.png");

    CCSprite* sp2 = CCSprite::create("2.png");

    CCSprite* sp3 = CCSprite::create("3.png");

    CCSprite* sp4 = CCSprite::create("4.png");

    CCSprite* sp5 = CCSprite::create("5.png");

    sp1->setPosition(ccp(30,30));

    sp2->setPosition(ccp(30,30));

    sp3->setPosition(ccp(30,30));

    sp4->setPosition(ccp(30,30));

    sp5->setPosition(ccp(30,30));

    this->addChild(sp1,0,1);

    this->addChild(sp2,0,2);

    this->addChild(sp3,0,3);

    this->addChild(sp4,0,4);

    this->addChild(sp5,0,5);

    //开启多点

    this->setTouchEnabled(true);

    //-new-//



    2.注册监听


    void Touchsdemo::registerWithTouchDispatcher(void){

       //注册监听

       CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0);

    }



    3.实现接触屏幕事件


    void Touchsdemo::ccTouchesBegan(CCSet * set,CCEvent * e){

       CCSetIterator iter=set->begin();

       //这里的iter相当于系统分配的数字,

       //set->begin()获取第一个数字

       //set->end()就是最后一位

       for(;iter!=set->end();iter++){

           //这里呢,就是单点处理了,可以理解为把多点拆成单点来做

           CCTouch * mytouch=(CCTouch *)(* iter);

           CCPoint cp=mytouch->getLocation();

     //这里我们对5个触摸块进行处理

           if(mytouch->getID()==0){

               CCSprite * sp=(CCSprite * )this->getChildByTag(1);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==1){

               CCSprite * sp=(CCSprite * )this->getChildByTag(2);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==2){

               CCSprite * sp=(CCSprite * )this->getChildByTag(3);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==3){

               CCSprite * sp=(CCSprite * )this->getChildByTag(4);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==4){

               CCSprite * sp=(CCSprite * )this->getChildByTag(5);

               sp->setPosition(cp);

           }

       }

    }



    4.用户按住或拖动屏幕事件


    void Touchsdemo::ccTouchesMoved(CCSet * set,CCEvent * e){

       CCSetIterator iter=set->begin();

       for(;iter!=set->end();iter++){

           CCTouch * mytouch=(CCTouch *)(* iter);

           CCPoint cp=mytouch->getLocation();

    //这里我们对5个触摸块进行处理

           if(mytouch->getID()==0){

               CCSprite * sp=(CCSprite * )this->getChildByTag(1);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==1){

               CCSprite * sp=(CCSprite * )this->getChildByTag(2);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==2){

               CCSprite * sp=(CCSprite * )this->getChildByTag(3);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==3){

               CCSprite * sp=(CCSprite * )this->getChildByTag(4);

               sp->setPosition(cp);

           }

           if(mytouch->getID()==4){

               CCSprite * sp=(CCSprite * )this->getChildByTag(5);

               sp->setPosition(cp);

           }

       }

    }



    5.用户离开屏幕事件


    void Touchsdemo::ccTouchesEnded(CCSet * set,CCEvent * e){

       CCSetIterator iter=set->begin();

       int a[6]={0,0,0,0,0,0};//创建一个数组

       for(;iter!=set->end();iter++){

           CCTouch * mytouch=(CCTouch *)(* iter);

           CCPoint cp=mytouch->getLocation();

     //这里我们对5个触摸块进行处理

           if(mytouch->getID()==0){

               a[1]=1;

           }

           if(mytouch->getID()==1){

               a[2]=1;

           }

           if(mytouch->getID()==2){

               a[3]=1;

           }

           if(mytouch->getID()==3){

               a[4]=1;

           }

           if(mytouch->getID()==4){

               a[5]=1;

           }

       }

       for(int i=1;i<=5;i++){<>

          if(a[i]==1){

               CCSprite * sp=(CCSprite *)this->getChildByTag(i);

               sp->runAction(CCMoveTo::create(5,ccp(30,30)));

           }

       }

    }



    6.实现生命周期函数


    void Touchsdemo::onEnter(){

       CCLayer::onEnter();

    }

    void Touchsdemo::onExit(){

       CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);

       CCLayer::onExit();

    }



       好了我们看下效果,fuck。。电脑上只有一个点,好吧。我已经打包好了apk在demo里面,想看效果,直接下载demo吧。


  • 相关阅读:
    wcf第3步之报文分析及原生调用
    IBatis 批量插入数据之SqlBulkCopy
    MVC前后端数据被编码
    log4Net控制台输出
    这可能是由于服务终结点绑定未使用 HTTP 协议造成的 .这还可能是由于服务器中止了 HTTP 请求上下文
    IBatis存储过程返回值
    路由学习2
    restClient访问SSL
    hibernate多对多关系配置
    hibernate 一对多操作(级联操作)
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091977.html
Copyright © 2011-2022 走看看