晓石头的博客
邮箱: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