Cocos2dx游戏教程(九):“见缝插针”,场景切换效果介绍

他来了,他来了,他带着炫酷的效果来了,前面我们一直想知道场景怎么切换,效果是什么,在这一节中将会给大家介绍Cocos2dx场景切换的效果。

一、游戏代码实现

前面我们已经介绍了游戏场景的跳转,现在结合游戏逻辑具体介绍下

1、将AppDelegate中的场景跳转还原到WelcomeScene

auto scene = WelcomeScene::createScene();

2、在welcomeScene.h中加上

//初始化第一次登录数据
void initFirstLoginData();
//跳转到菜单界面
void replace2MenuScene();

3、游戏实现

上章已经介绍过如何获取游戏数据信息,现在我们看下在WelcomeScene::init()的最终实现

// on "init" you need to initialize your instance
bool WelcomeScene::init()
{
	//
	// 1. super init first
	if (!Layer::init())
	{
		return false;
	}

	auto visibleSize = Director::getInstance()->getWinSize();
	Vec2 origin = Director::getInstance()->getVisibleOrigin();

	// add "HelloWorld" splash screen"
	auto sprite = Sprite::create("scene/welcome.jpg");

	// position the sprite on the center of the screen
	sprite->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));

	// add the sprite as a child to this layer
	this->addChild(sprite, 0);

	//初始化
	initFirstLoginData();

	//跳转到菜单界面
	replace2MenuScene();

	return true;
}
//跳转到载入场景
void WelcomeScene::replace2MenuScene() {
	Director::getInstance()->replaceScene(GameMenuScene::createScene());
}

现在我们运行下看看,是不是直接就跳转了?
如果想多看一会怎么办?
带着这些问题我们一起去看一下cocos2dx为我么准备的绚丽效果

二、场景切换效果

首先我们看一下使用方式,以淡化到另一场景为例

auto scene = GameMenuScene::createScene();
Director::getInstance()->replaceScene(TransitionCrossFade::create(2.0f, scene));

我们看下切换效果
在这里插入图片描述

这就是场景切换的效果啦
代码是最好的老师,我们打开Transition的源代码,我们可以看到如下的效果,大家可以试一试哦,看看是不是自己喜欢的效果呢

//慢慢淡化到另一场景
TransitionCrossFade::create(时间,目标场景); 
 
//本场景变暗消失后另一场景慢慢出现
TransitionFade::create(时间,目标场景); 
 
//本场景右上角到左下角方块消失到另一场景
TransitionFadeBL::create(时间,目标场景); 
 
//本场景从上到下横条消失到另一场景
TransitionFadeDown::create(时间,目标场景); 
 
//本场景左下角到右上角方块消失到另一场景 
TransitionFadeTR::create(时间,目标场景); 
 
//本场景从下到上横条消失到另一场景
TransitionFadeUp::create(时间,目标场景); 

//本场景翻转消失到另一场景(斜上方)
TransitionFlipAngular::create(时间,目标场景,样式 );
 
//本场景翻转消失到另一场景(X轴)
TransitionFlipX::create(时间,目标场景,样式);
 
//本场景翻转消失到另一场景(Y轴) 
TransitionFlipY::create(时间,目标场景); 
 
//本场景跳动消失后另一场景跳动出现
TransitionJumpZoom::create(时间,目标场景); 

//另一场景由整体从下面出现
TransitionMoveInB::create(时间,目标场景); 
 
//另一场景由整体从左面出现
TransitionMoveInL::create(时间,目标场景); 
 
//另一场景由整体从上面出现
TransitionMoveInT::create(时间,目标场景); 
 
//另一场景由整体从右面出现
TransitionMoveInR::create(时间,目标场景); 
 
//翻页切换,bool为true是向前翻。
TransitionPageTurn::create(时间,目标场景,bool); 
 
//本场景从左到右消失同时另一场景出现
TransitionProgressHorizontal::create(时间,目标场景);
 
//本场景从中间到四周消失同时另一场景出现
TransitionProgressInOut::create(时间,目标场景); 
 
//本场景从四周到中间消失同时另一场景出现 
TransitionProgressOutIn::create(时间,目标场景); 
 
//本场景逆时针消失到另一场景
TransitionProgre***adialCCW::create(时间,目标场景); 
 
//本场景顺时针消失到另一场景
TransitionProgre***adialCW::create(时间,目标场景); 
 
//本场景从上到下消失同时另一场景出现
TransitionProgressVertical::create(时间,目标场景); 
 
//本场景旋转消失后另一场景旋转出现 
TransitionRotoZoom::create(时间,目标场景); 
 
//本场景缩小切换到另一场景放大
TransitionShrinkGrow::create(时间,目标场景); 

//本场景向上滑动到另一场景 
TransitionSlideInB::create(时间,目标场景); 
 
//本场景向右滑动到另一场景
TransitionSlideInL::create(时间,目标场景); 

//本场景向左滑动到另一场景
TransitionSlideInR::create(时间,目标场景); 
 
//本场景向下滑动到另一场景
TransitionSlideInT::create(时间,目标场景); 

//本场景三矩形上下消失后另一场景三矩形上下出现
TransitionSplitCols::create(时间,目标场景); 

//本场景三矩形左右消失后另一场景三矩形左右出现 
TransitionSplitRows::create(时间,目标场景); 

//本场景小方块消失到另一场景
TransitionTurnOffTiles::create(时间,目标场景); 
 
//本场景翻转消失到另一场景(斜上方)
TransitionZoomFlipAngular::create(时间,目标场景,样式); 
 
//本场景翻转消失到另一场景(X轴)
TransitionZoomFlipX::create(时间,目标场景,样式); 
 
//本场景翻转消失到另一场景(Y轴)
TransitionZoomFlipY::create(时间,目标场景,样式);

聊到场景切换特效,那么就不得不讨论一下在场景切换之间内存处理的顺序是怎么样的
假设从A场景切换到B场景,调用各场景方法的顺序为:
如果没有切换效果(transition),则先调用B的init(),接着调用A的onExit(),然后调用B的onEnter()
如果有切换效果(transition),则为先调用B的init(),接着调用B的onEnter(),然后调用A的onExit()
也就是说,在调用了场景切换的特效时,A的生存周期会长一些,而这很可能会造成卡顿
最终解决方法:把init的一些加载放在onEnter()中使得更快的执行完init,把之前的场景释放
把一些资源的初始化放到onEnter中进行,那么究竟应该把那些资源放到onEnter中初始化,而那些资源又只能放到init中呢?
(1)像背景图这种只能放到init中,像场景切换时要看到的一些精灵,必须放到init中,不然场景切换时会看不到精灵。
(2)象精灵的一些动画,动作,可以放到onEnter中来初始化。

疑问?
如果我们不使用这种效果就不能够延迟跳转了么,当然是可以的,还可以将原来的方法换成如下使用

//跳转场景
this->runAction(Sequence::create(
	DelayTime::create(2.5f),
	CallFunc::create(CC_CALLBACK_0(WelcomeScene::replace2MenuScene, this)),
	NULL));

下一节将会给将会为大家开启动作篇(不是动作片,自己体会啊~)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值