码迷,mamicode.com
首页 > 其他好文 > 详细

【Cocos2d-x】实现翻牌效果

时间:2014-12-25 20:39:36      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

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


【Cocos2d-x】实现翻牌效果

标签:

原文地址:http://blog.csdn.net/linchaolong/article/details/42149805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!