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

转自: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);


运行结果如下:


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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cocos2d-x实现流光效果可以使用shader来进行渲染。首先,我们需要创建一个自定义的shader,并将其应用于需要实现流光效果的节点上。 在使用Cocos2d-x的过程中,我们可以使用GLSL语言编写shader代码。在实现流光效果的shader中,我们可以通过改变像素的颜色和透明度来创建流动的效果。 首先,我们定义一个uniform变量time,用于控制流光的移动速度。然后,在片段着色器中,通过改变颜色和透明度的计算公式来实现流动的效果。我们可以使用sin函数或者其他数学函数来计算出每个像素点的颜色和透明度,然后将其应用到节点上。 在节点的渲染流程中,我们将这个自定义的shader应用到节点上,然后传入时间参数,即更新uniform变量time的值。随着时间的增加,我们就可以看到节点上的流光效果在不断地移动。 为了实现更加逼真的流光效果,我们可以尝试给流光添加一些额外的效果,比如模糊、叠加等。通过调整shader代码中的计算公式和传入的参数,我们可以根据自己的需求来调整流光效果的强度和样式。 总结起来,在Cocos2d-x实现流光效果需要创建一个自定义的shader,并将其应用于需要实现效果的节点上。通过改变颜色和透明度的计算公式、传入时间参数等,我们可以实现一个流光效果,使节点看起来具有流动的动画效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值