【Cocos2d-x】实现翻牌效果

本文介绍了如何使用Cocos2d-x的CCOrbitCamera实现翻牌效果。翻牌通过两个精灵,一个代表正面,一个代表背面,通过设定不同旋转角度来达到翻转效果。详细阐述了API的使用,包括动作时长、球面坐标参数,并提供了调用示例及实际效果图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻牌效果可以使用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


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值