cocos2d-x 卡牌翻牌效果的实现

来源:互联网 发布:mac贴膜会影响散热吗 编辑:程序博客网 时间:2024/05/18 01:48

转自:cocos2d-x 卡牌翻牌效果的实现

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=428

card

刚有人问我cocos2dx能否实现卡牌的翻牌效果,其实cocos2dx有个action就是这个效果,晚上随便写了个效果。需要的可以看看。

上面的效果图是ipad模拟器,所以帧率只有30,实际是60.

这个能实现翻牌的action就是CCOrbitCamera。

static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX);

参数分别为旋转的时间,起始半径,半径差,起始z角,旋转z角差,起始x角,旋转x角差

下面是我封装的cardSprite,

请自己加入自己的工程,

用法

//创建翻牌sprite, 参数:卡片里面的图,卡片的封面,翻牌所花时间   CardSprite* card = CardSprite::create("1.png", "2.png", 2);   card->setPosition(ccp(size.width * .5, size.height * .5));   addChild(card);   card->openCard();//开始翻牌

CardSprite.h

//   //  CardSprite.h   //  Cocos2dev.com   //   //  Created by LiuYanghui on 13-6-17.   //   //       #ifndef __Test__CardSprite__   #define __Test__CardSprite__       #include "cocos2d.h"   USING_NS_CC;       class CardSprite : public CCSprite   {   public:   CardSprite();   ~CardSprite();   static CardSprite* create(const char* inCardImageName, const char* outCardImageName, float duration);   virtual bool init(const char* inCardImageName, const char* outCardImageName, float duration);   private:   bool m_isOpened;   CCActionInterval* m_openAnimIn;   CCActionInterval* m_openAnimOut;   void initData(const char* inCardImageName, const char* outCardImageName, float duration);   public:   void openCard();   };       #endif /* defined(__Test__CardSprite__) */

CardSprite.cpp

//   //  CardSprite.cpp   //  Cocos2dev.com   //   //  Created by LiuYanghui on 13-6-17.   //   //       #include "CardSprite.h"       #define kInAngleZ        270 //里面卡牌的起始Z轴角度   #define kInDeltaZ        90  //里面卡牌旋转的Z轴角度差       #define kOutAngleZ       0   //封面卡牌的起始Z轴角度   #define kOutDeltaZ       90  //封面卡牌旋转的Z轴角度差       enum {   tag_inCard = 1,   tag_outCard   };       CardSprite::CardSprite()   {   }       CardSprite::~CardSprite()   {   m_openAnimIn->release();   m_openAnimOut->release();   }       CardSprite* CardSprite::create(const char* inCardImageName, const char* outCardImageName, float duration)   {   CardSprite *pSprite = new CardSprite();   if (pSprite && pSprite->init(inCardImageName, outCardImageName, duration))   {   pSprite->autorelease();   return pSprite;   }   CC_SAFE_DELETE(pSprite);   return NULL;   }       bool CardSprite::init(const char* inCardImageName, const char* outCardImageName, float duration)   {   if (!CCSprite::init())   {   return false;   }   initData(inCardImageName, outCardImageName, duration);   return true;   }       #pragma mark - initData   void CardSprite::initData(const char* inCardImageName, const char* outCardImageName, float duration)   {   m_isOpened = false;   CCSprite* inCard = CCSprite::create(inCardImageName);   inCard->setPosition(CCPointZero);   inCard->setVisible(false);   inCard->setTag(tag_inCard);   addChild(inCard);   CCSprite* outCard = CCSprite::create(outCardImageName);   outCard->setPosition(CCPointZero);   outCard->setTag(tag_outCard);   addChild(outCard);   m_openAnimIn = (CCActionInterval*)CCSequence::create(CCDelayTime::create(duration * .5),   CCShow::create(),   CCOrbitCamera::create(duration * .5, 1, 0, kInAngleZ, kInDeltaZ, 0, 0),   NULL);   m_openAnimIn->retain();   m_openAnimOut = (CCActionInterval *)CCSequence::create(CCOrbitCamera::create(duration * .5, 1, 0, kOutAngleZ, kOutDeltaZ, 0, 0),   CCHide::create(),   CCDelayTime::create(duration * .5),   NULL);   m_openAnimOut->retain();   }       #pragma mark - public func   void CardSprite::openCard()   {   CCSprite* inCard = (CCSprite*)getChildByTag(tag_inCard);   CCSprite* outCard = (CCSprite*)getChildByTag(tag_outCard);   inCard->runAction(m_openAnimIn);   outCard->runAction(m_openAnimOut);   }


=================================================

另外如果直接这么用的话还有点问题

就是翻转的时候只显示一半

参考:cocos2dx-CCOrbitCamera类的问题解决

CCOrbitCamera是用来翻转轨迹的类,但是在使用中,如果后面有一个背景会遇到一个小问题,例如:中间图片少了半张。

其实是内置的一个函数问题,文档描述如下。

/** enables/disables OpenGL depth test */ void setDepthTest(bool bOn);


加上一句话即可解决问题。

 CCDirector::sharedDirector()->setDepthTest(false);


运行结果如下:


国内论坛确实问不出什么东西来。争取好东西大家分享。


原创粉丝点击