cocos2dx-多点触控
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,Tahoma"> 4.当用户手指在离开手机屏幕上时响应的回调函数 virtual void ccTouchesEnded(CCSet * touchs,Tahoma"> 这里不再使用参数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,242)">virtual void ccTouchesEnded(CCSet * set,80)">//写上生命周期函数 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,242)">sp3->setPosition(ccp(30,242)">sp4->setPosition(ccp(30,242)">sp5->setPosition(ccp(30,242)">this->addChild(sp1,1); this->addChild(sp2,2); this->addChild(sp3,3); this->addChild(sp4,4); this->addChild(sp5,5); //开启多点 this->setTouchEnabled(true); 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); if(mytouch->getID()==2){ CCSprite * sp=(CCSprite * )this->getChildByTag(3); if(mytouch->getID()==3){ CCSprite * sp=(CCSprite * )this->getChildByTag(4); if(mytouch->getID()==4){ CCSprite * sp=(CCSprite * )this->getChildByTag(5); } 4.用户按住或拖动屏幕事件 void Touchsdemo::ccTouchesMoved(CCSet * set,Tahoma"> 5.用户离开屏幕事件 void Touchsdemo::ccTouchesEnded(CCSet * set,242)"> int a[6]={0,0};//创建一个数组 a[1]=1; a[2]=1; a[3]=1; a[4]=1; 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吧。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |