cocos2d-x 3.3 之卡牌设计 NO.2 卡牌翻转

    上一篇文章讲了如何选取卡牌,这次说说怎么实现卡牌翻转的效果。

    假设我们已经点击了一张卡牌,并用指针Open_sel指向了这张卡牌,那么现在我们需要将这张卡牌翻转过来变成正面,效果如下(图片素材均来自网络,自己经过了处理):


    这个翻转效果借鉴了网上大神的代码,首先看看类的内容:

class OpenCard : public Sprite
{
public:
    OpenCard();
    ~OpenCard();
    static OpenCard* create(int loc_num,int num);
    virtual bool init(int loc_num,int num);
	void card_init_pic(int num);//加载资源
	void card_init_action();//加载动画
	void card_set_openCard();//打开卡牌
	void card_set_closeCard();//关闭卡牌
//数据
    ActionInterval* m_openAnimIn;//打开牌的背面
    ActionInterval* m_openAnimOut;//打开牌的正面
    ActionInterval* m_closeAnimIn;//关闭牌的背面
    ActionInterval* m_closeAnimOut;//关闭牌的正面
};
这是类中卡牌翻转需要的内容,ActionInterval是cocos2dx中的一种延时性动作,与 ActionInstant(瞬时动作)相对

一、创建

    首先我们需要创建卡牌精灵,有两个传入参数,一个是位置编号,一个是卡牌编号,这里不做讨论。

    创建的时候调用card_init_pic和card_init_action两个加载函数,我们来看看两个加载函数:

</pre></p><p><span style="font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"></span><pre name="code" class="cpp"><pre name="code" class="cpp">void OpenCard::card_init_pic(int num)
{
    Point point;
    point=card_set_locate();
    //创建正面卡牌
    Sprite* inCard = Sprite::create("card_face.png");
    inCard->setPosition(point);
    inCard->setVisible(false);//刚创建的时候正面卡牌不可见,只显示背面卡牌
    inCard->setTag(card_num_second);
    addChild(inCard);

	//创建背面卡牌
    Sprite* outCard = Sprite::create("card_back.png");
    outCard->setPosition(point);
    outCard->setTag(card_num);
    addChild(outCard);
}

 
void OpenCard::card_init_action()
{
    //打开牌
    m_openAnimIn = (ActionInterval*)Sequence::create(DelayTime::create(kRoundTime),//kRoudTime是翻转时间,正面卡牌得等背面卡牌翻转90度之后才能显示
                                                         Show::create(),//显示
                                                         OrbitCamera::create(kRoundTime, 1, 0, kInAngleZ, kInDeltaZ, 1,0),//翻转
                                                         NULL);
    m_openAnimIn->retain();//引用计数加一,必须加这句话,不然当你需要调用动画的时候它早就被系统释放了

    m_openAnimOut = (ActionInterval *)Sequence::create(OrbitCamera::create(kRoundTime, 1, 0, kOutAngleZ, kOutDeltaZ, 1,0),//翻转
                                                           Hide::create(),
                                                           DelayTime::create(kRoundTime),
                                                           NULL);

    m_openAnimOut->retain();
	//关闭牌
	m_closeAnimIn = (ActionInterval*)Sequence::create(DelayTime::create(kRoundTime),
                                                         Show::create(),
                                                         OrbitCamera::create(kRoundTime, 1, 0, kInAngleZ, kInDeltaZ, 1,0),
                                                         NULL);
    m_closeAnimIn->retain();
     
    m_closeAnimOut = (ActionInterval *)Sequence::create(OrbitCamera::create(kRoundTime, 1, 0, kOutAngleZ, kOutDeltaZ, 1,0),
                                                           Hide::create(),
                                                           DelayTime::create(kRoundTime),
                                                           NULL);

    m_closeAnimOut->retain();
}
好了,以上就是加载函数了,接下来我们就需要写一个播放动画的函数:

void OpenCard::card_set_openCard()
{
    Sprite* inCard = (Sprite*)getChildByTag(card_num_second);
    Sprite* outCard = (Sprite*)getChildByTag(card_num);
    inCard->runAction(m_openAnimIn);
    outCard->runAction(m_openAnimOut);
}


在成功选取卡牌后,只需Open_sel->card_set_openCard();一句就能翻转卡牌了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值