Cocos2dx实现翻牌效果(CCScaleTo与CCOrbitCamera两种方式)

本文主要是介绍Cocos2dx实现翻牌效果(CCScaleTo与CCOrbitCamera两种方式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于项目需要实现翻牌的效果,所以自己在完成的过程中将这篇文章写下来,想想还是觉得有点艰辛。

开始在网上找解决的办法找了很久,基本上就是一种解决方案,就是用CCOrbitCamera这个Action类来模拟实现翻牌的效果。

但是我在使用的效果中始终不如人意。

用CCOrbitCamera类实现倒是能实现,但是如果将牌移动到左上、左下或者其他不在屏幕中心的位置那这个效果就不行了,翻牌的位置就错误了,类似3D的了。

找了半天终于知道是什么原因了,Cocos2dX里面有这样的一句话,

CCDirector::sharedDirector()->setProjection(kCCDirectorProjection3D);

就是这个3D,Cocos2DX支持透视投影和正交投影两种模式,于是乎我把kCCDirectorProjection3D改成kCCDirectorProjection2D,对了,有感觉了。

这样一设置翻牌的动作就不是3D感了,就是正常的这种翻牌的感觉了。

但是项目中其他的图片出现了锯齿,这就不能忍了。

在用了很多办法都不能消除锯齿的时候我尝试到去读Cocos2dx关于设置setProjection函数的内容,看是否能够将锯齿避免,让翻转变得自然。

最终我失败了,确实还是太菜了不行。

我于是找替代方案来实现翻牌的动作,就找到了CCScaleTo来实现,这过程确实还是比较艰辛。

下面我把两种方案的关键代码都贴出来,方便大家看看吧。

1. 首先还是用CCOrbitCamera类实现翻牌的效果(我封装成了一个函数)。

[cpp]  view plain copy
  1. void HelloWorld::showObtAniUseOrbitCamera( CCSize visibleSize )  
  2. {  
  3.     if (m_pCardFront != NULL){  
  4.         this->removeChild(m_pCardFront);  
  5.     }  
  6.     if (m_pCardBack != NULL){  
  7.         this->removeChild(m_pCardBack);  
  8.     }  
  9.     // 加载牌的正反两面  
  10.     m_pCardFront = CCSprite::create("CardFront.png");  
  11.     m_pCardBack  = CCSprite::create("CardBack.png");  
  12.     /*m_pCardFront->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100)); 
  13.     m_pCardBack->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));*/  
  14.     m_pCardFront->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));  
  15.     m_pCardBack->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));  
  16.     this->addChild(m_pCardFront,5);  
  17.     this->addChild(m_pCardBack,5);  
  18.     // 动画序列(延时,显示,延时,隐藏)  
  19.     CCSequence *pBackSeq = CCSequence::create(CCDelayTime::create(0.5f),CCShow::create(),CCDelayTime::create(0.5f),CCHide::create(),NULL);  
  20.     //持续时间、半径初始值、半径增量、仰角初始值、仰角增量、离x轴的偏移角、离x轴的偏移角的增量  
  21.     CCOrbitCamera *pBackCamera = CCOrbitCamera::create(1.0f, 1, 0, 0, -90, 0, 0);  
  22.     CCSpawn* pSpawnBack = CCSpawn::create(pBackSeq,pBackCamera,NULL);  
  23.     m_pCardBack->runAction(pSpawnBack);  
  24.   
  25.     // 动画序列(延时,隐藏,延时,显示)  
  26.     CCSequence *pFrontSeq = CCSequence::create(CCDelayTime::create(0.5f),CCHide::create(),CCDelayTime::create(0.5f),CCShow::create(),NULL);  
  27.     CCOrbitCamera *pLandCamera = CCOrbitCamera::create(1.2f, 1, 0, 0, -360, 0, 0);  
  28.     CCSpawn* pSpawnFront = CCSpawn::create(pFrontSeq,pLandCamera,NULL);  
  29.     m_pCardFront->runAction(pSpawnFront);  
  30. }  
上面的注释写得比较详尽了,其实不难,就是背面显示的时候把正面隐藏,正面显示了把背面隐藏,就是这么个事。

这里面有个-90,-360是旋转的角度,可以自己尝试改了看会有什么效果。

下面是运行的效果图:

就是这样由背面翻转到正面,但注意,在“3D模式”下,position是设置在屏幕中间才会有这个效果,如果设置在其他位置就不是这个效果了,可以自己试试。

如果设置成2D模式就不会有这个情况了,但是不知道你自己的项目图片会不会出现锯齿,出现锯齿的情况我没有找到解决的办法。

2. 用CCScaleTo实现的翻转

就是因为有锯齿的情况出现我又没解决到,所以我在需找替代方案,于是乎找到了CCScaleTo来实现。

下面是关键的代码:

[cpp]  view plain copy
  1. void HelloWorld::showObtAniUseScaleTo(CCSize visibleSize)  
  2. {  
  3.     if (m_pCardFront != NULL){  
  4.         this->removeChild(m_pCardFront);  
  5.     }  
  6.     if (m_pCardBack != NULL){  
  7.         this->removeChild(m_pCardBack);  
  8.     }  
  9.     // 加载牌的正反两面  
  10.     m_pCardFront = CCSprite::create("CardFront.png");  
  11.     m_pCardBack  = CCSprite::create("CardBack.png");  
  12.     // 把牌反转了  
  13.     m_pCardFront->setFlipX(true);  
  14.     m_pCardFront->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));  
  15.     m_pCardBack->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));  
  16.     this->addChild(m_pCardFront,5);  
  17.     this->addChild(m_pCardBack,5);  
  18.     // 动画序列(延时,隐藏,延时,隐藏)  
  19.     CCSequence *pBackSeq = CCSequence::create(CCDelayTime::create(0.5f),CCHide::create(),CCDelayTime::create(0.5f),CCHide::create(),NULL);  
  20.     CCScaleTo* pScaleBack = CCScaleTo::create(1.2f,-1,1);  
  21.     CCSpawn* pSpawnBack = CCSpawn::create(pBackSeq,pScaleBack,NULL);  
  22.     m_pCardBack->runAction(pSpawnBack);  
  23.   
  24.     // 动画序列(延时,显示,延时,显示)  
  25.     CCSequence *pFrontSeq = CCSequence::create(CCDelayTime::create(0.5f),CCShow::create(),CCDelayTime::create(0.5f),CCShow::create(),NULL);  
  26.     CCScaleTo* pScaleFront = CCScaleTo::create(1.2f,-1,1);  
  27.     CCSpawn* pSpawnFront = CCSpawn::create(pFrontSeq,pScaleFront,NULL);  
  28.     m_pCardFront->runAction(pSpawnFront);  
  29. }  

这里主要就是要先把牌的正面 setFlipX(true)这个函数来 翻转一下,然后再绕Y轴模拟个旋转出来,如果还是不怎么清楚还请看官自己写代码试试效果。

CCScaleTo参数的设置主要就是为了绕Y来旋转,具体的各种情况也可以自己试试效果,实践是检验真理的唯一标准嘛,可以设置成(1,1),(1,-1)等等试试效果。

好了,差不多就是这样一个情况。

可以自己试试写个HelloWord调效果,加深印象。

这篇关于Cocos2dx实现翻牌效果(CCScaleTo与CCOrbitCamera两种方式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878995

相关文章

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小