【Cocos2dx】手势识别

前端之家收集整理的这篇文章主要介绍了【Cocos2dx】手势识别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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!");
		}
	} 
};
当然,还可以进一步规定,两个方向上的偏移量大于一定程度才认为是一个触摸手势。

猜你在找的Cocos2d-x相关文章