Cocos2D游戏之旅(四):卡牌翻转效果的实现(下)
发布时间:2020-12-14 16:23:24 所属栏目:百科 来源:网络整理
导读:晓石头的博客 邮箱: 178673693@qq.com 转载请注明出处,原文连接: http://www.jb51.cc/article/p-kpmqaxpj-vx.html 上篇讲解了用 ScaleTo 缩放卡牌,达到翻转的效果。 条条大道通罗马, RotateBy 旋转卡牌同样能够实现,而且效果更棒,就看你喜欢哪种了!
晓石头的博客 邮箱:178673693@qq.com 转载请注明出处,原文连接:http://www.52php.cn/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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |