翻牌效果可以使用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);
实现
PokerSprite.h
#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
PokerSprite.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()) { //扑克牌正面 front->setVisible(false); this->addChild(front); //扑克牌背面 this->addChild(back); return true; } return false; } bool PokerSprite::initWithSprite(CCSprite* pFornt, CCSprite* pBack){ if (front && back && CCSprite::init()) { front = pFornt; back = pBack; //扑克牌正面 front->setVisible(false); this->addChild(front); //扑克牌背面 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
时间: 2024-10-24 23:00:38