微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cocos2dx 利用CCOrbitCamera实现扑克牌翻牌效果

【注意】CCSpriteBatchNode不支持CCOrbitCamera动画。如果不需要用到CCSpriteBatchNode的话可以用下面这种方式:


#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    HelloWorld *layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
    if ( !cclayer::init() )
    {
        return false;
    }
    size = CCDirector::sharedDirector()->getWinSize();
    
    //加一背景
    cclayerColor* background = cclayerColor::create(ccc4(255,180,255,255),size.width,size.height);
    this->addChild(background);
    
    actionIsDone = true;//标示动作是否完成
    
    createPoker(); //创建扑克
    
    return true;
}

//创建扑克
void HelloWorld::createPoker()
{
    //扑克牌正面
    CCSprite* pokerFront = CCSprite::create("poker_front.png");
    pokerFront->setVisible(false);
    pokerFront->setPosition(ccp(size.width/2,size.height/2));
    this->addChild(pokerFront,1,123);
  
    //扑克牌反面
    CCSprite* pokerBack = CCSprite::create("poker_back.png");
    pokerBack->setPosition(pokerFront->getPosition());
    this->addChild(pokerBack,321);
}
//翻牌动作
void HelloWorld::startOrbitaction()
{
    //扑克牌正面
    CCSprite* pokerFront = (CCSprite*)this->getChildByTag(123);
    //扑克牌反面
    CCSprite* pokerBack = (CCSprite*)this->getChildByTag(321);
    
    float orbitTime = 1;
    if (pokerFront->isVisible() == false && actionIsDone == true) {
        actionIsDone = false;
        //第一个参数是旋转的时间,第二个参数是起始半径,第三个参数半径差,第四个参数是起始Z角,第五个参数是旋转Z角差,第六个参数是起始X角,最后一个参数旋转X角差,
        CCOrbitCamera* orbitFront = CCOrbitCamera::create(orbitTime,270,90,0);
        CCSequence* sequenceFront = CCSequence::createWithTwoActions(CCShow::create(),orbitFront);
        CCTargetedAction* targetFront = CCTargetedAction::create(pokerFront,sequenceFront);

        CCOrbitCamera* orbitBack = CCOrbitCamera::create(orbitTime,0);
        pokerBack->runAction(CCSequence::create(orbitBack,CCHide::create(),targetFront,CCCallFunc::create(this,callfunc_selector(HelloWorld::actionIsDownFunc)),NULL));
    }else if(pokerFront->isVisible() == true && actionIsDone == true){
        actionIsDone = false;
        CCOrbitCamera* orbitFront = CCOrbitCamera::create(orbitTime,orbitFront);
        CCTargetedAction* targetFront = CCTargetedAction::create(pokerBack,sequenceFront);
        
        CCOrbitCamera* orbitBack = CCOrbitCamera::create(orbitTime,0);
        pokerFront->runAction(CCSequence::create(orbitBack,NULL));
    }
}

void HelloWorld::actionIsDownFunc()
{
    actionIsDone = true;
}

bool HelloWorld::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent)
{
    //翻牌动作
    startOrbitaction();
    return true;
}

void HelloWorld::ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent){}
void HelloWorld::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent){}
void HelloWorld::onEnter()
{
    CCDirector::sharedDirector()->getTouchdispatcher()->addTargetedDelegate(this,false);
    cclayer::onEnter();
}
void HelloWorld::onExit()
{
    CCDirector::sharedDirector()->getTouchdispatcher()->removeDelegate(this);
    cclayer::onExit();
}
HelloWorld::~HelloWorld(){}



第二种方式:如果考虑到性能问题要用到CCSpriteBatchNode的话,那么可以使用CCRotateto来实现类似的功能

//扑克牌正面(带数字的是正面)
    CCSprite* pokerFront = CCSprite::createWithSpriteFrameName("card_fg.png");
    // 数字
    CCSprite* pokerNumber = CCSprite::createWithSpriteFrameName("18.png");
    //扑克牌反面
    CCSprite* pokerBack = CCSprite::createWithSpriteFrameName("card_bg.png");
    
    pokerFront->setPosition(ccp(m_size.width/2,m_size.height/2));
    pokerBack->setPosition(ccp(m_size.width/2,m_size.height/2));
    pokerNumber->setPosition(ccp(m_size.width/2,m_size.height/2));
    
    m_spriteBatchNode->addChild(pokerFront);
    m_spriteBatchNode->addChild(pokerNumber);
    m_spriteBatchNode->addChild(pokerBack);
    
    
    CCRotateto* rtFont1 = CCRotateto::create(0.f,0.f,-90.f);
    CCRotateto* rtNumber1 = CCRotateto::create(0.f,-90.f);
    
    // 先将前景和数字旋转到要进行反过来使用的位置待用
    pokerFront->runAction(rtFont1);
    pokerNumber->runAction(rtNumber1);
    
    // 将牌的背面向Y轴旋转90度,这时候该面刚好旋转到被隐藏的位置
    CCRotateto* rtBack = CCRotateto::create(0.5f,90.f);
    // 讲牌的正面和数组从刚才的位置旋转到0度,这样子刚好和牌的背面动画衔接起来
    CCRotateto* rtFont2 = CCRotateto::create(0.5f,0.f);
    CCTargetedAction* ta = CCTargetedAction::create(pokerFront,rtFont2);
    CCRotateto* rtNumber2 = CCRotateto::create(0.5f,0.f);
    CCTargetedAction* taa = CCTargetedAction::create(pokerNumber,rtNumber2);
    
    pokerBack->runAction(CCSequence::create(rtBack,CCSpawn::create(ta,taa,nullptr),nullptr));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建