Cocos2dx中没有附带滑动手势识别的函数,只提供四个触摸事件,一个是触摸开始、一个是触摸过程中、一个接触结束,还有一个是不怎么用的触摸被系统的电话打断。这在《【Cocos2dx】触摸事件》(点击打开链接)已经提到过了,这里不再赘述。然而,只是能够识别一个触摸按下动作而已,如果我要做到如下图一样的,识别用户的手势滑动方向这怎么做呢?
其实非常简单,首先,在头文件HelloWorldScene.h中声明该场景使用触摸事件,只使用到触摸开始与触摸结束的监听就可以了,然后用四个变量分别记录触摸开始的坐标与结束坐标:
#include "cocos2d.h" #include "math.h"//用到绝对值 USING_NS_CC; class HelloWorld:public cocos2d::CCLayer { public: virtual bool init(); static cocos2d::CCScene* scene(); CREATE_FUNC(HelloWorld); private: float startX,startY,endX,endY;//记录触摸开始坐标与结束坐标 CCLabelTTF *label;//文字 void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent);//开始触摸 void ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent);//结束触摸 };
之后在主文件HelloWorldScene.cpp中触摸开始、触摸结束事件利用CCTouch获取其触摸开始与结束的坐标,之后如下图:
先求触摸开始、结束坐标的,X方向与Y方向之差,看哪个大,则认为是哪个方向上的偏移,这两个数肯定是有大小的,之后看偏移数值的正负,看偏移是向左向右。这里的偏移量利用fabs来求浮点数的绝对值。具体代码如下:
#include "HelloWorldScene.h" CCScene* HelloWorld::scene() { CCScene *scene = CCScene::create(); HelloWorld *layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();//获取尺寸 label=CCLabelTTF::create("Please Touch!","Arial",24);//设定相应文本的位置 label->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));//放在屏幕的中央 this->addChild(label); //声明这个场景是存在触摸事件的 this->setTouchEnabled(true); return true; } //开始触摸 void HelloWorld::ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent){ CCTouch *touch=(CCTouch *)pTouches->anyObject(); //记录开始坐标 startX=touch->getLocation().x; startY=touch->getLocation().y; }; //结束触摸 void HelloWorld::ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent){ CCTouch *touch=(CCTouch *)pTouches->anyObject(); //记录结束坐标 endX=touch->getLocation().x; endY=touch->getLocation().y; //求开始与结束坐标之差 float offsetX=endX-startX; float offsetY=endY-startY; if(fabs(offsetX)>fabs(offsetY)){//根据X方向与Y方向的偏移量大小的判断 if(offsetX>0){ label->setString("Left!"); } else{ label->setString("Right!"); } } else{ if(offsetY>0){ label->setString("Up!"); } else{ label->setString("Down!"); } } };当然,还可以进一步规定,两个方向上的偏移量大于一定程度才认为是一个触摸手势。