翻牌效果可以使用CCOrbitCamera实现,这是一个CCAction,使精灵视角按照球面坐标轨迹 围绕屏幕中心进行旋转。【关于CCOrbitCamera】
翻牌需要两个精灵,一个表示牌的正面,一个表示牌的背面。当执行翻牌动作的时候:初始化正面的角度为向左90度、背面为0度——背面向右旋转90度——正面向右旋转90度,这就实现了一个翻牌的效果。
api说明:
t:动作时长
radius:球的半径
deltaRadius:球半径偏移量
angleZ:开始时z轴角度
deltaAngleZ:z轴角度偏移量
angleX:开始时x轴角度
deltaAngleX:x轴角度偏移量
static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX);
实现
#ifndef __POKERSPRITE_H__
#define __POKERSPRITE_H__
#include "cocos2d.h"
USING_NS_CC;
/*
具有翻牌效果的CCSprite
*/
class PokerSprite:public CCSprite
{
public:
/**
* 创建一个PokerSprite
* front 牌的正面
* back 牌的背面
*/
static PokerSprite* create(const char* front, const char* back);
/**
* 创建一个PokerSprite
* front 牌的正面
* back 牌的背面
*/
static PokerSprite* create(CCSprite* front, CCSprite* back);
/* 翻牌
* duration 动作时长(秒)
*/
void open(float duration=1.5);
protected:
bool initWithSprite(CCSprite* fornt, CCSprite* back);
bool initWithTexture(CCTexture2D* fornt, CCTexture2D* back);
private:
CCSprite* front; // 正面
CCSprite* back; // 背面
};
#endif
#include "PokerSprite.h"
PokerSprite* PokerSprite::create(const char* front, const char* back){
PokerSprite* pSrpite = new PokerSprite();
if (pSrpite->initWithTexture(CCTextureCache::sharedTextureCache()->addImage(front),CCTextureCache::sharedTextureCache()->addImage(back)))
{
pSrpite->autorelease();
return pSrpite;
}
delete pSrpite;
return NULL;
}
PokerSprite* PokerSprite::create(CCSprite* front, CCSprite* back){
PokerSprite* pSrpite = new PokerSprite();
if (pSrpite->initWithSprite(front,back))
{
pSrpite->autorelease();
return pSrpite;
}
delete pSrpite;
return NULL;
}
bool PokerSprite::initWithTexture(CCTexture2D* ptFront, CCTexture2D* ptBack){
front = CCSprite::createWithTexture(ptFront);
back = CCSprite::createWithTexture(ptBack);
if (front && back && CCSprite::init())
{
this->setContentSize(back->getContentSize());
//扑克牌正面
front->setVisible(false);
CCPoint pos = ccp(this->getContentSize().width/2,this->getContentSize().height/2);
front->setPosition(pos);
this->addChild(front);
//扑克牌背面
back->setPosition(pos);
this->addChild(back);
return true;
}
return false;
}
bool PokerSprite::initWithSprite(CCSprite* pFornt, CCSprite* pBack){
if (pFornt && pBack && CCSprite::init())
{
front = pFornt;
back = pBack;
this->setContentSize(back->getContentSize());
//扑克牌正面
front->setVisible(false);
CCPoint pos = ccp(this->getContentSize().width/2,this->getContentSize().height/2);
front->setPosition(pos);
this->addChild(front);
//扑克牌背面
back->setPosition(pos);
this->addChild(back);
return true;
}
return false;
}
void PokerSprite::open(float duration){
if (front && back)
{
front->stopAllActions();
back->stopAllActions();
// 正面z轴起始角度为90度(向左旋转90度),然后向右旋转90度
CCOrbitCamera* orbitFront = CCOrbitCamera::create(duration*0.5,1,0,90,-90,0,0);
// 正面z轴起始角度为0度,然后向右旋转90度
CCOrbitCamera* orbitBack = CCOrbitCamera::create(duration*0.5,1,0,0,-90,0,0);
front->setVisible(false);
// 背面向右旋转90度->正面向左旋转90度
back->runAction(CCSequence::create(CCShow::create(),orbitBack,CCHide::create(),
CCTargetedAction::create(front,CCSequence::create(CCShow::create(),orbitFront,NULL)),NULL));
}else{
CCLOG("[ERROR] PokerSprite front or back not init.");
}
}
调用示例
示例代码:
CCSize size = CCDirector::sharedDirector()->getVisibleSize();
//创建PokerSrpite,指定正面和背面所使用的图片路径
poker = PokerSprite::create("front.png", "back.png");
//创建PokerSrpite,指定正面和背面所使用的CCSprite
//CCSprite* front = CCSprite::create("front.png")
//front->addChild(img);
//poker = PokerSprite::create(front, CCSprite::create("back.png"));
// 设置位置
poker->setPosition(ccp(size.width0.5, size.height0.5));
// 添加到Layer
addChild(poker);
//调用翻牌动作
poker->open();
效果图
项目地址:https://coding.net/u/linchaolong/p/Cocos2d-x_PokerSprite/git