Cocos2dx实现翻牌效果(CCScaleTo与CCOrbitCamera两种 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

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

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:60


开端在网上找解决的办法找了良久,根本上就是一种解决筹划,就是用CCOrbitCamera这个Action类来模仿实现翻牌的效不雅。
然则我在应用的效不雅中始终不如人意。
用CCOrbitCamera类实现倒是能实现,然则如不雅将牌移动到左上、左下或者其他不在屏幕中间的地位那这个效不雅就不可了,翻牌的地位就缺点了,类似3D的了。
找了半天终于知道是什么原因了,Cocos2dX琅绫擎有如许的一句话,
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection3D);
就是这个3D,Cocos2DX支撑透视投影和正交投影两种模式,于是乎我把kCCDirectorProjection3D改成kCCDirectorProjection2D,对了,有感到了。
如许一设置翻牌的动作就不是3D感了,就是正常的┞封种翻牌的感到了。
然则项目中其他的图片出现懂得齿,这就不克不及忍了。
在用了很多办法都不克不及清除锯齿的时刻我测验测验到去读Cocos2dx关于设置setProjection函数的内容,看是否可以或许将锯齿避免,让翻改变得天然。
最终我掉败了,确切照样太菜了不可。
我于是找替代筹划来实现翻牌的动作,就找到了CCScaleTo来实现,这过程确切照样比较艰辛。
下面我把两种筹划的关键代码都贴出来,便利大年夜家看看吧。
1. 起首照样用CCOrbitCamera类实现翻牌的效不雅(我封装成了一个函数)。

这琅绫擎有个-90,-360是扭转的角度,可以本身测验测验改了看会有什么效不雅。
void HelloWorld::showObtAniUseScaleTo(CCSize visibleSize)
{
	if (m_pCardFront != NULL){
		this->removeChild(m_pCardFront);
	}
	if (m_pCardBack != NULL){
		this->removeChild(m_pCardBack);
	}
	// 加载牌的┞俘反两面
	m_pCardFront = CCSprite::create("CardFront.png");
	m_pCardBack  = CCSprite::create("CardBack.png");
	// 把牌反转了
	m_pCardFront->setFlipX(true);
	m_pCardFront->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));
	m_pCardBack->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));
	this->addChild(m_pCardFront,5);
	this->addChild(m_pCardBack,5);
	// 动画序列(延时,隐蔽,延时,隐蔽)
	CCSequence *pBackSeq = CCSequence::create(CCDelayTime::create(0.5f),CCHide::create(),CCDelayTime::create(0.5f),CCHide::create(),NULL);
	CCScaleTo* pScaleBack = CCScaleTo::create(1.2f,-1,1);
	CCSpawn* pSpawnBack = CCSpawn::create(pBackSeq,pScaleBack,NULL);
	m_pCardBack->runAction(pSpawnBack);

	// 动画序列(延时,显示,延时,显示)
	CCSequence *pFrontSeq = CCSequence::create(CCDelayTime::create(0.5f),CCShow::create(),CCDelayTime::create(0.5f),CCShow::create(),NULL);
	CCScaleTo* pScaleFront = CCScaleTo::create(1.2f,-1,1);
	CCSpawn* pSpawnFront = CCSpawn::create(pFrontSeq,pScaleFront,NULL);
	m_pCardFront->runAction(pSpawnFront);
}

下面是运行的效不雅图:
因为项目须要实现翻牌的效不雅,所以本身在完成的过程中将这篇文┞仿写下来,想想照样认为有点艰辛。
[img]http://img.blog.csdn.net/20150106165133718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGluZ2hxYWxleA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
[img]http://img.blog.csdn.net/20150106165220109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGluZ2hxYWxleA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
就是如许由后头翻转到正面,但留意,在“3D模式”下,position是设置在屏幕中心才会有这个效不雅,如不雅设置在其他地位就不是这个效不雅了,可以本身尝尝。
如不雅设置成2D模式就不会有这个情况了,然则不知道你本身的项目图片会不会出现锯齿,出现锯齿的情况我没有找到解决的办法。
2. 用CCScaleTo实现的翻转
就是因为有锯齿的情况出现我又没解决到,所以我在需找替代筹划,于是乎找到了CCScaleTo来实现。
下面是关键的代码:

这里重要就是要先把牌的┞俘面setFlipX(true)这个函数来翻转一下,然后再绕Y轴模仿个扭转出来,如不雅照样不怎么清跋扈还请看官本身写代码尝尝效不雅。
void HelloWorld::showObtAniU搜刮引擎优化rbitCamera( CCSize visibleSize )
{
	if (m_pCardFront != NULL){
		this->removeChild(m_pCardFront);
	}
	if (m_pCardBack != NULL){
		this->removeChild(m_pCardBack);
	}
	// 加载牌的┞俘反两面
	m_pCardFront = CCSprite::create("CardFront.png");
	m_pCardBack  = CCSprite::create("CardBack.png");
	/*m_pCardFront->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));
	m_pCardBack->setPosition(ccp(visibleSize.width/2-100,visibleSize.height/2+100));*/
	m_pCardFront->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
	m_pCardBack->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
	this->addChild(m_pCardFront,5);
	this->addChild(m_pCardBack,5);
	// 动画序列(延时,显示,延时,隐蔽)
	CCSequence *pBackSeq = CCSequence::create(CCDelayTime::create(0.5f),CCShow::create(),CCDelayTime::create(0.5f),CCHide::create(),NULL);
	//持续时光、半径初始值、半径增量、仰角初始值、仰角增量、离x轴的偏移角、离x轴的偏移角的增量
	CCOrbitCamera *pBackCamera = CCOrbitCamera::create(1.0f, 1, 0, 0, -90, 0, 0);
	CCSpawn* pSpawnBack = CCSpawn::create(pBackSeq,pBackCamera,NULL);
	m_pCardBack->runAction(pSpawnBack);

	// 动画序列(延时,隐蔽,延时,显示)
	CCSequence *pFrontSeq = CCSequence::create(CCDelayTime::create(0.5f),CCHide::create(),CCDelayTime::create(0.5f),CCShow::create(),NULL);
	CCOrbitCamera *pLandCamera = CCOrbitCamera::create(1.2f, 1, 0, 0, -360, 0, 0);
	CCSpawn* pSpawnFront = CCSpawn::create(pFrontSeq,pLandCamera,NULL);
	m_pCardFront->runAction(pSpawnFront);
}
膳绫擎的注释写得比较详尽了,其实不难,就是后头显示的时刻把正面隐蔽,正面显示了把后头隐蔽,就是这么个事。
CCScaleTo参数的设置重要就是为了绕Y来扭转,具体的各类情况也可以本身尝尝效不雅,实践是考验真谛的独一标准嘛,可以设置成(1,1),(1,-1)等等尝尝效不雅。
好了,差不多就是如许一个情况。
可以本身尝尝写个HelloWord调效不雅,加深印象。

相关案例查看更多