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

卡牌翻牌效果

经过测试,利用cocos2dx引擎自带的setScaleX和setFlippedX即可实现,效果比较好。
详细代码如下:

//
// CCardNode.h
// SlotsBase
//
// Created by xujw on 16/5/27.
//
// 卡牌类,实现类似扑克翻牌效果,认翻牌时间为0.5s,建议时间为0.3-1.0f

#ifndef CCardNode_h
#define CCardNode_h

#include <stdio.h>
#include "cocos2d.h"
USING_NS_CC;

#define SKEW_DEGREE 10

class CCardNode:public Node
{
public:
    typedef enum
    {
        kCardFront = 0,kCardBack = 1,}ECardState;

    typedef struct CData
    {
        std::string dataStr;
        int dataInt;
        long dataLong;
        CData(const std::string &str,int idata,long ldata)
        {
            dataStr = str;
            dataInt = idata;
            dataLong = ldata;
        };
        CData(){}
    }CardData;

public:
    CCardNode();
    ~CCardNode();

    /** * 创建一张卡牌 * * @param frontSpFile 正面资源图片 * @param backSpFile 反面资源图片 * @param state 显示牌显示背面 * * @return 卡牌 */
    static CCardNode* createCard(const std::string &frontSpFile,const std::string &backSpFile,ECardState state=kCardBack);
    static CCardNode* createCard(const std::string &frontSpFile,ECardState state,CardData data);
    bool init(const std::string &frontSpFile,ECardState state);

    /** * 翻转卡牌 */
    void turnCard();
    void turnCard(float t);
    void turnCard(std::function<void(Ref*)> callBack,float turnTime=1.0f);

    inline void setTruncallback(std::function<void(Ref*)> callBack){_callBack = callBack;};
    inline void setTurnTime(float t){_turnTime = t;};
    inline void setCardData(CardData data){_cardData = data;};
    inline CardData getCardData() const{return _cardData;};
    inline ECardState getCardStata() const {return  _cardState;};

private:
    Sprite *_frontSp;
    Sprite *_backSp;
    float _turnTime;
    ECardState _cardState;
    std::function<void(Ref*)> _callBack;
    bool _isAct;
    CardData _cardData;
};

#endif /* CCardNode_h */

//
// CCardNode.cpp
// SlotsBase
//
// Created by xujw on 16/5/27.
//
//

#include "CCardNode.h"

CCardNode::CCardNode()
:_frontSp(nullptr),_backSp(nullptr),_turnTime(0.5f),_callBack(nullptr),_isAct(false),_cardState(kCardBack),_cardData("",-1,-1.0f)
{}
CCardNode::~CCardNode()
{
    this->removeFromParentAndCleanup(true);
}

CCardNode* CCardNode::createCard(const std::string &frontSpFile,CardData data)
{
    CCardNode *card = CCardNode::createCard(frontSpFile,backSpFile,state);
    card->setCardData(data);
    return card;
}

CCardNode* CCardNode::createCard(const std::string &frontSpFile,ECardState state)
{
    CCardNode *card = new(std::nothrow) CCardNode();
    if (card && card->init(frontSpFile,state))
    {
        card->autorelease();
        return card;
    }

    CC_SAFE_DELETE(card);
    return nullptr;
}

bool CCardNode::init(const std::string &frontSpFile,ECardState state)
{
    if (!Node::init())
    {
        return false;
    }

    _cardState = state;

    _frontSp = Sprite::create(frontSpFile);
    this->addChild(_frontSp);
    _backSp = Sprite::create(backSpFile);
    this->addChild(_backSp);

    bool disFront = _cardState==kCardFront?true:false;
    _frontSp->setVisible(disFront);
    _backSp->setVisible(!disFront);

    //MARK:设置node大小和锚点,方便计算是否点击到牌面
    this->setContentSize(_backSp->getContentSize());
    this->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
    _frontSp->setPosition(this->getContentSize()/2);
    _backSp->setPosition(_frontSp->getPosition());

    return true;
}

void CCardNode::turnCard()
{
    turnCard(_callBack,_turnTime);
}

void CCardNode::turnCard(float t)
{
    setTurnTime(t);
    turnCard(_callBack,_turnTime);
}

void CCardNode::turnCard(std::function<void (Ref *)> callBack,float t)
{
    if (_isAct)
    {
        return;
    }

    _isAct = true;
    setTurnTime(t);
    //MARK:为了每次翻牌都从右向左翻牌
    if (-1 == _frontSp->getScaleX())
    {
        _frontSp->setFlippedX(false);
        _frontSp->setScaleX(1);
    }
    if (-1 == _backSp->getScaleX())
    {
        _backSp->setFlippedX(false);
        _backSp->setScaleX(1);
    }

    if (_cardState == kCardFront)
    {
        cclOG("当前是正面,开始翻牌到背面!");
        Scaleto *firstPartSto = Scaleto::create(_turnTime/2,0,1);
        Sequence *firstSeq = Sequence::create(Spawn::create(firstPartSto,SkewTo::create(_turnTime/2,-SKEW_DEGREE),NULL),Hide::create(),CallFunc::create([=]()
           {
               _backSp->setVisible(true);
               _backSp->setFlippedX(true);
               _backSp->setScaleX(0);

               Scaleto *secondPartSto = Scaleto::create(_turnTime/2,1);
               Sequence *secondSeq = Sequence::create(Spawn::create(secondPartSto,0),CallFunc::create([=]()
                 {
                     //翻牌完成
                     _isAct = false;
                     _cardState = kCardBack;
                     if (_callBack)
                     {
                         _callBack(nullptr);
                     }
                 }),NULL);
               _backSp->runAction(secondSeq);

           }),NULL);

        _frontSp->runAction(firstSeq);
    }
    else
    {
        cclOG("当前是反面,开始翻牌到正面!");
        Scaleto *firstPartSto = Scaleto::create(_turnTime/2,CallFunc::create([=]()
           {
               _frontSp->setVisible(true);
               _frontSp->setScaleX(0);
               _frontSp->setFlippedX(true);

               Scaleto *secondPartSto = Scaleto::create(_turnTime/2,CallFunc::create([=]()
                 {
                     //翻牌完成
                     _isAct = false;
                     _cardState = kCardFront;
                     if (_callBack) {
                         _callBack(nullptr);
                     }
                 }),NULL);
               _frontSp->runAction(secondSeq);

           }),NULL);

        _backSp->runAction(firstSeq);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建