由于项目需要实现翻牌的效果,所以自己在完成的过程中将这篇文章写下来,想想还是觉得有点艰辛。
开始在网上找解决的办法找了很久,基本上就是一种解决方案,就是用CCOrbitCamera这个Action类来模拟实现翻牌的效果。
但是我在使用的效果中始终不如人意。
用CCOrbitCamera类实现倒是能实现,但是如果将牌移动到左上、左下或者其他不在屏幕中心的位置那这个效果就不行了,翻牌的位置就错误了,类似3D的了。
找了半天终于知道是什么原因了,Cocos2dX里面有这样的一句话,
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection3D);
就是这个3D,Cocos2DX支持透视投影和正交投影两种模式,于是乎我把kCCDirectorProjection3D改成kCCDirectorProjection2D,对了,有感觉了。
这样一设置翻牌的动作就不是3D感了,就是正常的这种翻牌的感觉了。
但是项目中其他的图片出现了锯齿,这就不能忍了。
在用了很多办法都不能消除锯齿的时候我尝试到去读Cocos2dx关于设置setProjection函数的内容,看是否能够将锯齿避免,让翻转变得自然。
最终我失败了,确实还是太菜了不行。
我于是找替代方案来实现翻牌的动作,就找到了CCScaleTo来实现,这过程确实还是比较艰辛。
下面我把两种方案的关键代码都贴出来,方便大家看看吧。
1. 首先还是用CCOrbitCamera类实现翻牌的效果(我封装成了一个函数)。
- voidHelloWorld::showObtAniUSEOrbitCamera(CCSizevisibleSize)
- {
- if(m_pCardFront!=NULL){
- this->removeChild(m_pCardFront);
- }
- if(m_pCardBack!=NULL){
- this->removeChild(m_pCardBack);
- }
- //加载牌的正反两面
- m_pCardFront=CCSprite::create("CardFront.png");
- m_pCardBack=CCSprite::create("CardBack.png");
- /*m_pCardFront->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));
- m_pCardBack->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));*/
- m_pCardFront->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
- m_pCardBack->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
- this->addChild(m_pCardFront,5);
- this->addChild(m_pCardBack,5);
- //动画序列(延时,显示,延时,隐藏)
- CCSequence*pBackSeq=CCSequence::create(CCDelayTime::create(0.5f),CCShow::create(),CCDelayTime::create(0.5f),CCHide::create(),NULL);
- //持续时间、半径初始值、半径增量、仰角初始值、仰角增量、离x轴的偏移角、离x轴的偏移角的增量
- CCOrbitCamera*pBackCamera=CCOrbitCamera::create(1.0f,1,-90,0);
- CCSpawn*pSpawnBack=CCSpawn::create(pBackSeq,pBackCamera,NULL);
- m_pCardBack->runAction(pSpawnBack);
- //动画序列(延时,隐藏,延时,显示)
- CCSequence*pFrontSeq=CCSequence::create(CCDelayTime::create(0.5f),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCOrbitCamera*pLandCamera=CCOrbitCamera::create(1.2f,-360,248)"> CCSpawn*pSpawnFront=CCSpawn::create(pFrontSeq,pLandCamera,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> m_pCardFront->runAction(pSpawnFront);
- }