[cocos2d]场景切换以及切换进度显示
本文主要分两个部分叙述,第一是场景切换,第二是场景切换的进度显示。
一、场景切换
参考learn-iphone-and-ipad-cocos2d-game-development 第五章内容
cocos2d可以使用CCDirector replaceScene替换场景。切换场景时节点会调用CCNode的三个方法
onEnter //节点调用init方法后调用此方法(使用了CCTransitionScene的话,将在过渡效果后调用此方法)
onEnterTransitionDidFinish //调用onEnter后调用此方法(使用了CCTransitionScene,将在过渡效果后调用此方法
onExit//节点调用dealloc方法前调用此方法(使用CCTransitionScene,将在过渡效果结束后调用此方法)
对于两个Scene,scene1和scene2
调用次序为
1.scene:scene2
2.init scene2
3.onEnter scene2
4.过渡效果
5.onExit scene1
6.onEnterTransitionDidFinish scene2
7.dealloc scene1
由此可见scene1在scene加载完后调用dealloc,这意味着scene1的内存会一直保存到scene2生成完。
当场景使用的内存较多的时候,切换就需要谨慎起来了。
解决方法:
1、scene2的onEnterTransitionDidFinish里面schedule一个方法,在update里面分配内存,这样的话就会在下一帧或者更后的时候分配内存,此时scene1的内存已经释放了。
2、scene1的onExit里面释放尽量多的内存
3、使用中间场景
4、等等
中间场景使用方法:
scene1切换到loadingScene,loadingScene 在init的时候schedule一个方法,在update方法里面切换到scene2
#import <Foundation/Foundation.h>
#import "cocos2d.h" typedef enum
{
TargetSceneINVALID = ,
TargetSceneScene1,
TargetSceneScene2,
TargetSceneMAX,
} TargetScenes; @interface LoadingScene : CCLayer
{
TargetScenes targetScene_;
} +(id) sceneWithTargetScene:(TargetScenes)targetScene;
-(id) initWithTargetScene:(TargetScenes)targetScene; @end
LoadingScene.h
#import "LoadingScene.h"
#import "Scene1.h"
#import "Scene2.h" @interface LoadingScene (PrivateMethods)
-(void) update:(ccTime)delta;
@end @implementation LoadingScene{ } +(id) sceneWithTargetScene:(TargetScenes)targetScene;
{
CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self); return [[[self alloc] initWithTargetScene:targetScene] autorelease];
//或者这样
//return [[[LoadingScene alloc] initWithTargetScene:targetScene] autorelease];
} -(id) initWithTargetScene:(TargetScenes)targetScene
{
if ((self = [super init]))
{
targetScene_ = targetScene; CCLabelTTF* label = [CCLabelTTF labelWithString:@"Loading ..." fontName:@"Marker Felt" fontSize:];
CGSize screenSize = [[CCDirector sharedDirector] winSize];
label.position = CGPointMake(screenSize.width / , screenSize.height / );
[self addChild:label];
//在加载目标场景前至少等1帧
//因为:1、直接加载会崩溃 2、精灵(也就是label)不是显示
[self scheduleUpdate];
}
return self;
} -(void) update:(ccTime)delta
{ // 因为要切换场景,所以这里不是必要的。这样做是以防万一。
[self unschedule:_cmd]; // 根据需求加载目标场景,这样就代码可以用在多种情况下了
switch (targetScene_)
{
case TargetSceneMainScene:
[[CCDirector sharedDirector] replaceScene:[Scene1 scene]];
break;
case TargetSceneExamScene:
[[CCDirector sharedDirector] replaceScene:[Scene2 scene]];
break; default:
// 如果使用了不恰当的数值,这会警告你
NSAssert2(nil, @"%@: unsupported TargetScene %i", NSStringFromSelector(_cmd), targetScene_);
break;
} // Tip: example usage of the INVALID and MAX enum values to iterate over all enum values
for (TargetScenes i = TargetSceneINVALID + ; i < TargetSceneMAX; i++)
{
} } -(void) dealloc
{
CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
// don't forget to call "super dealloc"
[super dealloc];
} @end
LoadingScene.m
#import "Scene1.h"
#import "LoadingScene.h" @implementation Scene1 +(id)scene{
CCScene *scene = [CCScene node];
Scene1*layer = [Scene1 node];
[scene addChild:layer];
return scene;
} -(id)init{
if ((self = [super init])) {
CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self); CGSize size = [[CCDirector sharedDirector] winSize]; CCLabelTTF *titlelabel = [CCLabelTTF labelWithString:@"游戏" fontName:@"Heiti SC" fontSize:];
titlelabel.color = ccBLUE; titlelabel.position = CGPointMake(size.width * 0.5f, size.height * 0.7f);
[self addChild:titlelabel];
CCLabelTTF *label = [CCLabelTTF labelWithString:@"点击开始游戏" fontName:@"Heiti SC" fontSize:];
label.color = ccYELLOW;
label.position = CGPointMake(size.width * 0.5f, size.height * 0.4f);
[self addChild:label];
[self setTouchEnabled:YES];
}
return self;
}
Scene1.m
二、进度显示(针对中间场景)
有了中间场景的方法了,那么直接把进度条加到中间场景里面就ok了么。
但是如果仔细观察切换场景的过程,会发现loadingScene的帧率是不动的,这意味着在切换场景的过程中loadingScene是不刷新的。无论你如何修改进度条的百分比,loadingScene还是保持在切换scene2前的状态,直到进入scene2而loadingScene释放。
待续
[cocos2d]场景切换以及切换进度显示的更多相关文章
- Unity3D 场景切换加载进度条实现
需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using Syste ...
- LNMP下wordpress无法切换主题,只显示当前主题解决方法
最近在lnmp下发现wordpress后台无法切换主题,只能显示当前主题,开始还以为是文件没传完,又重置了一遍,还是一样.百度得知,原来军哥的LNMP安装包默认关闭了scandir函数,为了安全考虑. ...
- 解决微信小程序的wx-charts插件tab切换时的显示会出现位置移动问题-tab切换时,图表显示错乱-实现滑动tab
解决Echarts在微信小程序tab切换时的显示会出现位置移动问题 tab切换时,图表显示错乱 <canvas class="kcanvas" canvas-id=" ...
- 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态
查看本章节 查看作业目录 需求说明: 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态.点击列表的项,切 ...
- fijkplayer问题反馈:暂停时拖动进度光标,在窗口模式与全屏模式间切换后,进度光标不能及时更新、正常跟进
fijkplayer-0.8.4很优秀,造福苍生,非常感谢! 使用fijkplayer-0.8.4开发的过程中遇到以下问题,特此记录.提交上传:https://github.com/befovy/fi ...
- python-web自动化-元素操作:windows窗口切换 / alert切换 / iframe切换
1. windows窗口切换:切换到要操作的窗口 有多个窗口: 1. 触发新窗口的出现 2. 得知道新窗口是谁 -- 依据窗口的window_handle来识别窗口 3. 得到窗口的window_ha ...
- vue + element-ui 制作tab切换(切换vue组件,踩坑总结)
本篇文章使用vue结合element-ui开发tab切换vue的不同组件,每一个tab切换的都是一个新的组件. 1.vue如何使用element-ui 上一篇文章已经分享了如何在vue中使用eleme ...
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...
- Retrofit2文件上传下载及其进度显示
序 前面一篇文章介绍了Retrofit2的基本使用,这篇文章接着介绍使用Retrofit2实现文件上传和文件下载,以及上传下载过程中如何实现进度的显示. 文件上传 定义接口 1 2 3 @Multip ...
随机推荐
- (转)CSS字体大小: em与px、pt、百分比之间的对比
CSS样式最混乱的一个方面是应用程序中文本扩展的font-size属性.在CSS中,你可以用四个不同的单位度量来显示在web浏览器中的文本 大小.这四个单位哪一种最适合Web? 这个问题引起了广泛的争 ...
- Unity3D 关于运动模型
首先,要让一个物体在3D世界里面运动起来. 要在一个具有碰撞器的面和一个具有碰撞器的体. 要具有碰撞器属性,不然其他物体会穿过的. 默认的碰撞器是一个具有阻碍效果的,如果让碰撞器具有了一个触发器属性I ...
- Oracel 数据库函数
-- Oracle 函数 学习 -- 数值函数 ,(四舍五入, 取整,常用计算,三角) -- 1.四舍五入 round(n[,m]) ,省略m :表示 0 ;m>0 ;小数点后m位 ;m< ...
- xcode编译运行报错纪录(持续更新)
---恢复内容开始--- 1. Undefined symbols for architecture i386: "_deflate", referenced from: -[NS ...
- 网卡添加VLAN TAG
#modprobe 8021q 用命令 lsmod | grep 8021q 来检查 以配置网卡eth0为例,添加vlan号:1002 ================================ ...
- (hdu)5547 Sudoku (4*4方格的 数独 深搜)
Problem Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game ...
- cakephp recursive -1,0,1,2 速查
-1 : model本身 0 :model本身 + belongTo + hasOne 1 :model本身 + belongTo + hasOne + hasMany 2: :model ...
- .net ajax式上传文件
今天在这里介绍一下ajax上传文件.其实也不算是真的使用xmlhttprequest上传,只是使用了iframe实现了无刷新上传而已,最多也只算 是仿ajax上传文件.然而网上关于使用xmlhttpr ...
- jQuery插件综合应用(四)头像设置
一.操作流程 会员点击头像设置,弹出一个层,在层中,有上传图片的按钮,用户点击按钮上传图片,图片在服务器端按大小压缩保存(方便剪切).保存后,在前端显示,然后用户可修剪图片.选择图片区域,点击提交,保 ...
- 下载APP 2个二维码合并到一个二维码
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...