• cocos2dX 事件之触摸事件和触摸事件集合


    今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 如今的手机游戏交互基本上都是通过触摸交互的, 所以大家明确这节的重要性了吧, 本节篇幅比較大, 所以我就不扯闲话了


    先来看看经常使用函数:

    触摸事件:

    addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息); //注冊单点触摸

    virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event); //触摸開始

    virtual void ccTouchMoved(CCTouch * touch,CCEvent * event); //触摸滑动

    virtual void ccTouchEnded(CCTouch * touch,CCEvent * event); //结束触摸

    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);//其它事件中断触摸


    触摸事件集合:

    virtual void registerWithTouchDispatcher( void); //注冊多点触摸

    addStandardDelegate(); //加入托付

    setTouchEnabled( bool); //开启多点触摸, 貌似使用了这个之后就不能使用单点

    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);


    我们先来实现触摸事件:

    在头文件中面声明我们要重写的函数:

    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//触摸開始函数
    <span style="white-space:pre">	</span>virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//触摸移动函数
    <span style="white-space:pre">	</span>virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//触摸结束函数

    开启单点触摸, 而且创建三个标签用来显示信息:

    注意: 一定要开启单点触摸, 不然没有效果

    	//开启单点触摸
    	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this, 0, false);
    
    	//创建三个标签
    	CCLabelTTF* begin = CCLabelTTF::create( "begin:-->X:0.0, -->Y:0.0", "Arial", 24);
    	CCLabelTTF* move = CCLabelTTF::create( "move:-->X:0.0, -->Y:0.0", "Arial", 24);
    	CCLabelTTF* end = CCLabelTTF::create( "end:-->X:0.0, -->Y:0.0", "Arial", 24);
    	begin->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 50));
    	move->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
    	end->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 50));
    	addChild( begin, 0, 101);
    	addChild( move, 0, 102);
    	addChild( end, 0, 103);

    我们来重写这三个函数:


    getLocationInView()取得坐标系是以左上角为原点的哦

    我们来看看效果:


    看, 我们截取到了触摸事件的消息了吧



    好了, 我们再来看看触摸事件集合:

    为什么有了触摸事件之后我们还要使用触摸事件集合呢?如今的手机基本都支持多点触控, 而CCTouch不能获取多点触摸的事件, 所以触摸事件集合就应运而生了

    我们 还是声明一下须要重写的函数:

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


    在init里面开启多点触摸

    //开启多点触摸
    	setTouchEnabled( true);


    实现重写的函数:

    void HelloWorld::registerWithTouchDispatcher()
    {
    	//注冊多点触摸
    	CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate( this, 0);
    }
    
    void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
    {
    	CCSetIterator iter = pTouches->begin();
    	for ( ; iter != pTouches->end(); ++iter)
    	{
    		CCTouch* pTouch = (CCTouch*)(*iter);
    		switch ( pTouch->getID())
    		{
    		case 0:{
    			CCLabelTTF* ttf1 = CCLabelTTF::create( "1", "Arial", 24);
    			ttf1->setPosition( pTouch->getLocation());
    			addChild( ttf1, 0, 101);
    			   }break;
    		case 1:{
    			CCLabelTTF* ttf1 = CCLabelTTF::create( "2", "Arial", 24);
    			ttf1->setPosition( pTouch->getLocation());
    			addChild( ttf1, 0, 102);
    			   }break;
    		case 2:{
    			CCLabelTTF* ttf1 = CCLabelTTF::create( "3", "Arial", 24);
    			ttf1->setPosition( pTouch->getLocation());
    			addChild( ttf1, 0, 103);
    			   }break;
    		case 3:{
    			CCLabelTTF* ttf1 = CCLabelTTF::create( "4", "Arial", 24);
    			ttf1->setPosition( pTouch->getLocation());
    			addChild( ttf1, 0, 104);
    			   }break;
    		case 4:{
    			CCLabelTTF* ttf1 = CCLabelTTF::create( "5", "Arial", 24);
    			ttf1->setPosition( pTouch->getLocation());
    			addChild( ttf1, 0, 105);
    			   }break;
    		default:
    			break;
    		}
    	}
    	
    }
    
    void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
    {
    	CCSetIterator iter = pTouches->begin();
    	for ( ; iter != pTouches->end(); ++iter)
    	{
    		CCTouch* pTouch = (CCTouch*)(*iter);
    		switch ( pTouch->getID())
    		{
    		case 0:{
    			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 101);
    			ttf->setPosition( pTouch->getLocation());
    			   }break;
    		case 1:{
    			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 102);
    			ttf->setPosition( pTouch->getLocation());
    			   }break;
    		case 2:{
    			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 103);
    			ttf->setPosition( pTouch->getLocation());
    			   }break;
    		case 3:{
    			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 104);
    			ttf->setPosition( pTouch->getLocation());
    			   }break;
    		case 4:{
    			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 105);
    			ttf->setPosition( pTouch->getLocation());
    			   }break;
    		default:
    			break;
    		}
    	}
    }
    
    void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
    {
    	CCSetIterator iter = pTouches->begin();
    	for ( ; iter != pTouches->end(); ++iter)
    	{
    		CCTouch* pTouch = (CCTouch*)(*iter);
    		switch ( pTouch->getID())
    		{
    		case 0:{
    			removeChildByTag( 101);
    			   }break;
    		case 1:{
    			removeChildByTag( 102);
    			   }break;
    		case 2:{
    			removeChildByTag( 103);
    			   }break;
    		case 3:{
    			removeChildByTag( 104);
    			   }break;
    		case 4:{
    			removeChildByTag( 105);
    			   }break;
    		default:
    			break;
    		}
    	}
    }





    看看效果:


    额, 电脑上仅仅能显示一个触摸点, 我刚刚在手上測试了一下, 能够同一时候操作多个点的, 我等会上传安装文件, 


    我们来看看代码:

    首先, 我们设置多点触控可用, 而且注冊了它, 这是必须的哦


    我们在開始触摸的时候传了两个參数, 第一个參数是个容器, 我们将它取出来, 将begin()取出来作为開始标志, end()取出来作为结束标志, 遍历了这个容器, 在遍历的过程中, 我们取出了每一个对象的ID, 我们全部的触摸点都在这个容器里面, 和数组下标同样, 也是从0開始的, 所以我们取出当ID等于0的时候, 我们就绘制出第一个标签, 我们这里依次取出了5个, 同理, 在移动里面, 我们依据ID改动了他们的位置, 在结束触摸里面, 我们依据标记, 移除了对应的对象


    下载安装文件

    好了, 今天的就到这里, 希望大家还是多多练习, 有什么疑问就加群: 223856254

  • 相关阅读:
    5.JavaSE之数据类型详解
    4.JavaSE之标识符
    2.Java程序运行机制
    1.HelloWorld 仪式感
    10.安装开发环境
    【模板】后缀数组
    Luogu P3808 【模板】AC自动机(简单版)
    Luogu P3375 【模板】KMP字符串匹配
    LNSY集训
    Luogu P2580 于是他错误的点名开始了 (Trie树模板)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5068773.html
Copyright © 2020-2023  润新知