Cocos 2D-X——单指拖动 两指旋转、缩放

参考:

1、http://blog.csdn.net/somestill/article/details/10581277

2、http://www.ipastimes.com/post/14.html

引擎版本:

Cocos 2D-X V3.0rc0

下载:

APK:http://pan.baidu.com/s/1dEfHqLz 提取密码:ooxe

Demo:http://pan.baidu.com/s/1hqULMni 提取密码:7dtk

原理:

单指拖动——目标位置= 当前位置+ 触摸偏移量(touch->getDelta());

两指缩放——目标缩放系数= (移动后的两点间距离)/(移动前两点距离)* 移动前的缩放系数

两指旋转——

目标角度= 当前角度+ 角度偏移量;

角度偏移量= 移动后的两点构成的线段的角度- 移动前两点构成的线段的角度;

实现:

1、设置缩放系数的上限、下限:

#define MAX_SCALE 1.5
#define MIN_SCALE 0.5

2、添加多点触摸监听机制:


//触摸监听机制
void IndexScene::addListener()
{
	auto self= this;
	//多点触摸
	EventListenerTouchAllAtOnce* listener= <span style="color:#ff0000;">EventListenerTouchAllAtOnce</span>::create();
	
	listener->onTouch<span style="color:#ff0000;">es</span>Moved= CC_CALLBACK<span style="color:#ff0000;">_2</span>(IndexScene::onTouch<span style="color:#ff0000;">es</span>Moved, self);
	
	//添加监听机制
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, self);
}
3、重载Layer::onTouchesMoved()的方法:
//触摸移动
void IndexScene::onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event)
{
	auto self= this;
	Sprite* bg= <span style="color:#ff0000;">(Sprite*)</span>(self->getChildByTag(0));
	//单指拖动
	if(<span style="color:#ff0000;">1== touches.size()</span>)
	{
		Touch* touch= <span style="color:#ff0000;">static_cast<Touch*></span>(touches[0]);
		bg->setPosition(<span style="color:#ff0000;">bg->getPosition()+ touch->getDelta(</span>));
	}else if(<span style="color:#ff0000;">2== touches.size()</span>)
	{
		/************************************************************************/
						/*旋转*/
		/************************************************************************/
		//上一次两点的方向向量[0指向1]
		Point prePoint= (touches[1]->get<span style="color:#ff0000;">Previous</span>Location()- touches[0]->get<span style="color:#ff0000;">Previous</span>Location());
		Point curPoint= (touches[1]->getLocation()- touches[0]->getLocation());

		//上一次两点的角度
		float preAngle= <span style="color:#ff0000;">CC_RADIANS_TO_DEGREES</span>(<span style="color:#ff0000;">atan2f</span>(prePoint.x, prePoint.y));
		float curAngle= <span style="color:#ff0000;">CC_RADIANS_TO_DEGREES</span>(<span style="color:#ff0000;">atan2f</span>(curPoint.x, curPoint.y));
		//目标角度
		float rotation= <span style="color:#ff0000;">ceilf(curAngle- preAngle)+ bg->getRotation()</span>;
		//确保精灵的旋转角在[0.360)区间内
		if(rotation>= 360)
		{
			rotation-= 360;
		}else if(rotation< 0){
			rotation+= 360;
		}
		bg->setRotation(rotation);

		/************************************************************************/
						/*缩放*/
		/************************************************************************/
		//上一次的两点的距离
		float preDistance= touches[0]->get<span style="color:#ff0000;">Previous</span>Location().getDistance(touches[1]->get<span style="color:#ff0000;">Previous</span>Location());
		//当前两点的距离
		float curDistance= touches[0]->getLocation().getDistance(touches[1]->getLocation());

		float percent= <span style="color:#ff0000;">curDistance/preDistance</span>;
		float scale= <span style="color:#ff0000;">percent* m_fScale</span>;
		
		if(MAX_SCALE<= scale)
		{
			m_fScale= MAX_SCALE;
		}else if(MIN_SCALE>= scale){
			m_fScale= MIN_SCALE;
		}else{
			m_fScale= scale;
		}
		bg->setScale(m_fScale);
		CCString* temp= CCString::createWithFormat("Nums:%d\r\nDistanse:%0.3f,%0.3f\r\nScale:%0.3f,%0.3f\r\nPervent:%0.2f\r\nRotation:%f,%f", touches.size(), preDistance,curDistance, m_fScale,scale, percent, rotation, bg->getRotation());
		m_pScale->setString(temp->getCString());
	}
}
扩展:
CC_RADIANS_TO_DEGREES: 弧度-->角度
CC_DEGREES_TO_RADIANS: 角度-->弧度
上述两个宏,是Cocos定义的两个弧度和角度相互转化的方法。

能力有限,仅供参考。

发布了2 篇原创文章 · 获赞 1 · 访问量 405
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览