原创地址:<a target=_blank href="http://cn.cocos2d-x.org/tutorial/show?id=2183">http://cn.cocos2d-x.org/tutorial/show?id=2183</a>
cpp
#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.");
}
}
#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
调用:
CCSize size = CCDirector::sharedDirector()->getVisibleSize();
//创建PokerSrpite,指定正面和背面所使用的图片路径
poker = PokerSprite::create("10.png", "27.png");
//创建PokerSrpite,指定正面和背面所使用的CCSprite
//CCSprite* front = CCSprite::create("front.png")
//front->addChild(img);
//poker = PokerSprite::create(front, CCSprite::create("back.png"));
// 设置位置
poker->setPosition(ccp(size.width*0.5, size.height*0.5));
// 添加到Layer
addChild(poker);
//调用翻牌动作
poker->open();