Cocos2D游戏之旅(四):卡牌翻转效果的实现(下)

前端之家收集整理的这篇文章主要介绍了Cocos2D游戏之旅(四):卡牌翻转效果的实现(下)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

晓石头的博客

邮箱:178673693@qq.com

转载请注明出处,原文连接:http://www.jb51.cc/article/p-kpmqaxpj-vx.html

上篇讲解了用ScaleTo缩放卡牌,达到翻转的效果

条条大道通罗马,RotateBy旋转卡牌同样能够实现,而且效果更棒,就看你喜欢哪种了!


效果对比图

一、先谈思路:

ScaleTo缩放卡牌实现翻转的思路移步:卡牌翻转效果的实现(上)

理解了ScaleTo的思路,再看RotateBy就一目了然了。


一共两张图片

1、正面


1、背面


产生卡牌盖住的效果

第一步:将正面旋转90度;产生卡牌翻转到中间的效果

第二步:将一开始就旋转90度的背面再旋转90度,产生卡牌盖住的效果

产生卡牌翻开的效果

第三步:将背面旋转90度,背面隐藏起来。

第四步:正面有270度旋转至360,恢复至卡牌打开的原状。

二、再说实现

bool HelloWorld::init()
{
    if (!Layer::init())
    {
        return false;
    }
    Size visibleSize = Director::getInstance()->getVisibleSize();

	/* 添加背景 */
	CCSprite* bk = CCSprite::create("bk.png");
	bk->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));
	this->addChild(bk);

	/* 卡牌状态标志位 */
	cardFlag = 0;
	touchable = 1;

	/* 创建第一个精灵 */
	sprite1 = Sprite::create("card.png");
	sprite1->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));
	this->addChild(sprite1);

	/* 创建第二个精灵 */
	sprite2 = Sprite::create("bkCard.png");
	sprite2->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));
	this->addChild(sprite2);

	/* 第二个精灵默认x旋转至90度,于是第二个精灵在一开始是看不见的*/
	sprite2->setRotationY(90);
	

	/* 触摸事件 */
	EventListenerTouchOneByOne* event = EventListenerTouchOneByOne::create();
	/* true表示触摸事件不向下传递,如果有两种重叠的卡牌,就只有第一张能接受到触摸事件。false则两张卡牌都能接受到触摸事件 */
	event->setSwallowTouches(true);

	event->onTouchBegan = [=](Touch* touch,Event* event){
		/* 取出绑定的精灵 */
		auto target = static_cast<Sprite*>(event->getCurrentTarget());
		/* 将触摸点的屏幕坐标转换成openGL里的坐标 */
		Point point = Director::getInstance()->convertToGL(touch->getLocationInView());

		/* 判断触摸点是否在精灵范围内 */
		/* 在范围为则返回true,执行onTouchEnded,否则false,不执行onTouchEnded */
		/* touchable控制触摸是否有效,避免动作执行完成前又触摸,产生动作混乱的效果 */
		if (target->getBoundingBox().containsPoint(point) && 1 == touchable)
		{
			touchable = 0;
			return true;
		}
		else
		{
			return false;
		}
	};

	event->onTouchEnded = [=](Touch* touch,Event* event){
		switch (cardFlag % 4)
		{
			/* 旋转方式盖住卡牌 */
		case 0:
			sprite2->setRotationY(90);
			sprite2->setScaleX(1.0f);
			closeCard();
			break;

			/* 旋转方式打开卡牌 */
		case 1:
			openCard();
			break;

			/* 缩放方式盖住纸牌 */
		case 2:
			sprite2->setRotationY(0);
			sprite2->setScaleX(0.0f);
			closeCard2();
			break;

			/* 缩放方式打开纸牌 */
		case 3:
			openCard2();

		default:
			break;
		}
		cardFlag++;

		auto funcSettouchable = [&](){
			touchable = 1;
		};

		CallFunc* callFuncTouch = CallFunc::create(funcSettouchable);

		/* 用顺序动作保证动作完成后再让触摸有效 */
		/* touchable用于控制触摸是否有效 */
		Sequence* sequence = Sequence::create(CCDelayTime::create(1.2f),callFuncTouch,NULL);
		this->runAction(sequence);
	};

	/* 注册监听事件,绑定精灵1 */
	_eventDispatcher->addEventListenerWithSceneGraPHPriority(event,sprite1);
	/* 注册监听事件,绑定精灵2,事件监听对象event复制了一份 */
	_eventDispatcher->addEventListenerWithSceneGraPHPriority(event->clone(),sprite2);

    return true;
}

void HelloWorld::closeCard()
{
	/* x方向旋转90度的动作 */
	RotateBy* rotateToHide = RotateBy::create(0.6f,90);

	/* 创建卡牌旋转90度的回调函数 */
	auto funcScaleToShow = [&](){
		RotateBy* rotateToShow = RotateBy::create(0.6f,90);
		sprite2->runAction(rotateToShow);
	};

	/* 将回调函数封装为动作 */
	CallFunc* callFuncSpr2 = CallFunc::create(funcScaleToShow);

	/* 依次执行动作 */
	Sequence* sequence = Sequence::create(rotateToHide,callFuncSpr2,NULL);

	sprite1->runAction(sequence);
}

void HelloWorld::openCard()
{
	/* x方向旋转90度的动作 */
	RotateBy* rotateToHide = RotateBy::create(0.6f,90);

	/* 创建卡牌旋转90度的回调函数 */
	auto funcScaleToShow = [=](){
		/* 这里如果不这只是270度,卡牌翻转后和原来的画面是左右颠倒的 */
		sprite1->setRotationY(270);
		RotateBy* rotateToShow = RotateBy::create(0.6f,90);
		sprite1->runAction(rotateToShow);
	};

	/* 将回调函数封装为动作 */
	CallFunc* callFuncSpr2 = CallFunc::create(funcScaleToShow);

	/* 依次执行动作 */
	Sequence* sequence = Sequence::create(rotateToHide,NULL);

	sprite2->runAction(sequence);
}


void HelloWorld::closeCard2()
{
	/* x方向拉伸至0的动作 */
	ScaleTo* scaleToHide = ScaleTo::create(0.6f,0.0f,1.0f);

	/* 创建卡牌放大的回调函数 */
	auto funcScaleToShow = [=](){
		ScaleTo* scaleToShow = ScaleTo::create(0.6f,1.0f,1.0f);
		sprite2->runAction(scaleToShow);
	};

	/* 将回调函数封装为动作 */
	CallFunc* callFuncSpr2 = CallFunc::create(funcScaleToShow);

	/* 依次执行动作 */
	Sequence* sequence = Sequence::create(scaleToHide,NULL);

	sprite1->runAction(sequence);
}

void HelloWorld::openCard2()
{
	/* x方向拉伸至0的动作 */
	ScaleTo* scaleToHide = ScaleTo::create(0.6f,1.0f);

	auto funcScaleToShow = [=](){
		ScaleTo* scaleToShow = ScaleTo::create(0.6f,1.0f);
		sprite1->runAction(scaleToShow);
	};

	CallFunc* callFuncSpr1 = CallFunc::create(funcScaleToShow);

	Sequence* sequence = Sequence::create(scaleToHide,callFuncSpr1,NULL);

	sprite2->runAction(sequence);
}

代码免积分下载地址:http://download.csdn.net/detail/qiulanzhu/8976341

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