cocos2d开发学习4:场景过渡效果,以及过渡场景的作用

cocos2d开发学习四:场景过渡效果,以及过渡场景的作用
前面我们也提到,其实游戏场景是个抽象概念,
对于场景的一些内容和需要学习,最基本就是掌握他对整个游戏流程的控制和影响

这边是我大致罗列的关于场景的三个要点
1.多场景结构
2.场景切换的过渡动画

3.过渡场景的作用。

一:多场景
对于第一点,其实没什么说的,就是在一个游戏中我们可能运用多个场景,
更好的展现游戏逻辑
二:场景切换过渡效果
场景过渡效果cocos2d提供了CCTransitionScene类

追踪下Node中几个方法

-(void)onEnter
{
    /*init后会调用;
        若是加了CCTransitionScene后,在过渡场景开始后调用
     */
    [super onEnter];
    CCLOG(@"执行了~~onEnter");
}

- (void)onEnterTransitionDidFinish
{
    /*onEnter以后将会调用此方法
     若使用CCTransitionScene,将会在过渡效果结束以后调用此方法
     */
    [super onEnterTransitionDidFinish];
    CCLOG(@"执行了~~onEnterTransitionDidFinish");
   
}

- (void)onExitTransitionDidStart
{
    CCLOG(@"执行了~~onExitTransitionDidStart");
    [super onExitTransitionDidStart];
}

- (void)onExit
{
    // 节点调用dealloc方法之前将会调用此方法
    //如果使用了CCTransitionScene,将会在过渡效果结束以后调用此方法
    CCLOG(@"执行了~~onExit");
    [super onExit];
}
然后执行时的调用

2012-07-17 16:45:32.893 LoadingSim[2896:1be03] 执行了~~onEnter
2012-07-17 16:45:32.893 LoadingSim[2896:1be03] 执行了~~onEnterTransitionDidFinish
2012-07-17 16:45:37.928 LoadingSim[2896:1be03] 执行了~~onExitTransitionDidStart
2012-07-17 16:45:42.958 LoadingSim[2896:1be03] 执行了~~onExit

tips:1.如果你想在覆写以上几个方法时,不能忘了调用super方法。
       2.上面的四句log,只是我们只是追踪了A场景跳转到B场景时,A对这4个方法的log,
如果我们打印出B场景这4个方法,则会发现b的init,onEnter方法执行都比A的onExit在前,A的dealloc方法是在最后执行了,这也就是一直说的场景转换前内存会突然彪起来的问题,前者还没没有dealloc,后者已经init,初始化各种内存了。
资料上在A的onExit方法中可以尽可能多的释放内存A占用的内存空间。
在B场景的中,各种节点内存的分配尽可能放在onEnterTransitionDidFinish(打印可以看到该方法执行在A的onExit)之后但是这个还是需要和前者的onExit配合,如果前者没有在onExit中执行更多内存释放,那么其实最后A内存的释放还是在dealloc中,而A的delloc还是在B的onEnterTransitionDidFinish后面,那么一点意义也没有~
资料上也提到用个预约方法来调节此间的过渡时间。

场景的过渡效果只是说添加一个场景转换效果,提供更柔和的视觉效果。

三。过渡场景的应用
过渡场景的最核心的作用我觉得有两点
1.防止两个场景切换时,新场景需要加载内容过多造成的延时和卡顿现象。(这个很好理解,就比如玩魔兽世界读进度条场景界面的概念~)
2.优化场景切换的内存作用。简单来说,就是比如A场景是内存占了100mb,转换到B场景时,B场景需要内存也是100mb,因为我们知道在场景转换是,A场景的内存释放是在B场景加载之前,那么此间内存可能到达200mb峰值,诺是添加进过渡场景tempScene,temp需要的内存是10mb(因为基本只是一个加载进度条么),那么A->temp->B,内存的峰值就可降到110mb。

更多内容可以参考上传的那个学习教程电子书。

注意几点:
1.因为现在cocos2d-iPhone已经更新到2.+上部分类改动
     比如: CCLabel被CCLabelTTF替代。
     CCSlideInBTransition变成了CCTransitionSlideInT
还有部分类名改动~