【正文】
我们一个游戏通常都不可能只有一个场景,那么不同场景之间应该如何切换呢?bbframework框架在GameBase.lua文件里面提供了“enterScene()”函数来进行场景跳转。但是我们的“game.lua”文件里面定义的“game”对象是继承自GameBase类的,所以我们在游戏里面通常是调用“game:enterScene()”来进行场景跳转。
game:enterScene(sceneName, args, transitionType, time, more)
如上,该函数有5个参数,第一个参数是要跳转的场景的名称,也就是场景类声明时传到“local M = classScene()”函数的第一个参数,类型是字符串。第二个参数是要传递到新场景的一些信息,我们用一个table来包装。最终,这个table会被传递到场景类的构造函数的参数“params”那边。第三个参数是场景过度时的动画类型。有的时候我们在两个场景切换的时候希望当前场景能够逐渐淡化,并且新的场景能够淡显。这时候就需要用到transitionType这个参数,这个参数也是字符串类型,用于指明过渡动画的类型。当指定了第三个参数以后,我们就应该指定第四个参数,第四个参数是number类型,表示的时候过渡动画持续的时间。至于第五个参数,表示的是过渡动画携带的其他参数,我们暂且不去讨论。在这里值得注意的一点是,除了scenenName这个参数是必须参数之外,后面的4个参数都是可缺省的。但是当我们要指定过渡动画的时候,第二个参数就一定要指定,如果没有要传递到下一个场景的信息,我们通常在第二个参数的位置传递“nil”,作为一个占位符,这样后面的参数位置才能正确。
接下来我们列举部分bbframework所支持的场景过渡效果的transitionType:
crossFade 淡出当前场景的同时淡入下一个场景 fade 淡出当前场景到指定颜色,默认颜色为 ccc3(0, 0, 0),可用 wrapSceneWithTransition() 的最后一个参数指定颜色 fadeBL 从左下角开始淡出场景 fadeDown 从底部开始淡出场景 fadeTR 从右上角开始淡出场景 fadeUp 从顶部开始淡出场景 flipAngular 当前场景倾斜后翻转成下一个场景,默认从左边开始翻转,可以指定为: kCCTransitionOrientationLeftOver 从左边开始 kCCTransitionOrientationRightOver 从右边开始 kCCTransitionOrientationUpOver 从顶部开始 kCCTransitionOrientationDownOver 从底部开始 flipX 水平翻转,默认从左往右翻转,可用的附加参数同上 flipY 垂直翻转,默认从上往下翻转,可用的附加参数同上 zoomFlipAngular 倾斜翻转的同时放大,可用的附加参数同上 zoomFlipX 水平翻转的同时放大,可用的附加参数同上 zoomFlipY 垂直翻转的同时放大,可用的附加参数同上 jumpZoom 跳跃放大切换场景 moveInB 新场景从底部进入,现有场景同时从顶部退出 moveInL 新场景从左侧进入,现有场景同时从右侧退出 moveInR 新场景从右侧进入,现有场景同时从左侧退出 moveInT 新场景从顶部进入,现有场景同时从底部退出 pageTurn 翻页效果,如果指定附加参数为 true,则表示从左侧往右翻页 rotoZoom 旋转放大切换场景 shrinkGrow 收缩交叉切换场景 slideInB 新场景从底部进入,直接覆盖现有场景 slideInL 新场景从左侧进入,直接覆盖现有场景 slideInR 新场景从右侧进入,直接覆盖现有场景 slideInT 新场景从顶部进入,直接覆盖现有场景 splitCols 分成多列切换入新场景 splitRows 分成多行切换入新场景,类似百叶窗 turnOffTiles 当前场景分成多个块,逐渐替换为新场景
这里为了节省篇幅,我只列举一部分过渡效果,我们的bbframework是基于cocos2D-Lua(quick-cocos2d-x)的,所以同样支持quick原生的所有过渡动画。比如我要一个新场景从底部进入,现有场景同时从顶部退出的过渡效果,并且假设我们要跳转的场景叫做“Second”,过渡动画持续2.5秒,那么我们就通过下面这句代码就可以实现:
game:enterScene("Second", nil, "moveInB", 2.5)
说到场景跳转,我们不得不提一点,那就是我们游戏的第一个场景必须命名为“Gameplay”。因为bbframework的盒子里面默认会require脚本的“app.gameplay.scene.GameplayScene.lua”文件,并跳转到游戏的Gameplay场景。但是如果没有使用宝宝巴士的盒子,那就不用考虑和盒子的串联问题,命名就没有这个限制。
说完场景跳转,我们还遗漏了一点,那就是我们在玩大型一点的游戏就会发现,它在两个场景跳转的过程中进行了一次读条操作。这其实是为了让下一个场景运行的更加流畅所做的处理,在这里进行下一个场景的资源预加载,然后通过进度条来表示进度。那么我们的bbframework也同样封装了“game:enterSceneWithLoading()”函数,这个函数的参数和用法与“game:enterScene()”完全一致。不同的是它会跳转到一个读条场景进行资源加载和进度读条,等资源全部加载结束就会自动进入下一个场景。但是这个函数需要我们指定预加载的资源。我们可以在要跳转过去的新场景类的"getResourceNames()"函数里面返回我们要预加载的资源。
function M:getResourceNames() return "gameplay/img_1.png", "gameplay/node_1.png" end
getResourceNames()函数的用法如上所述,我们把要预加载的资源反正“return”语句里面,Lua是支持函数多返回值的,我们的bbframework的读条场景里面会获取这边返回的值进行资源预加载。如果没有使用读条,这里直接反悔空值即可。注意最后一个资源后面不能加逗号,因为资源不是在表里面的。
说到预加载,那么我们就来提一下我们应该如何手动的进行资源预加载,我们的bbframework在“UResource.lua”文件里面定义了“M.loadTexture(fileName)”函数来进行图片纹理的预加载。注意这里函数是通过“.”来定义的,都是静态调用。函数需要一个字符串(资源图片路径)作为参数。同时还提供了“M.loadTextureAsync(fileName, callback)”函数来进行异步资源加载。loadTextureAsync()函数有两个参数,第一个是要预加载的图片纹理路径,第二个是回掉函数对象。因为我用不上回调函数,所以我试过不传递第二个参数,但是框架里面给我报回调函数是空值的错误了,所以我通常都传递一个匿名函数进去,函数里面什么也不干。但是有人说他那边不传递是可以的,或许是我们bbframework框架没有更新的缘故吧。
前面说到的两个函数仅支持单张图片的加载,有的时候我们项目会把一部分图片通过工具压缩成一张大图(plist文件+png文件),然后我们又想预加载,这时候除了使用读条之外,bbframework在UResource里面还提供了“M.loadFrames(resource)”函数,这个函数需要一个字符串作为参数,这个参数是大图资源的文件路径,包括文件名,但是不包括后缀名。我们的bbframework会自动在参数字符串的后面加上“.plist”和“.png”作为后缀名。
有加载,就肯定也会出现需要卸载的情况。bbframework提供了“M.unloadTexture(fileName)”和“M.unloadFrames(resource)”两个函数进行资源卸载。前者用于卸载单图,后者用于卸载plist的大图。二者都需要传递资源路径作为参数,同样后者不需要加后缀名。
说完图片纹理资源的加载和卸载,我们接下来了解下音频文件的加载和卸载。bbframework对于声音的控制都交给“SoundBase.lua”文件,但是我们的“sound”对象是继承自“SoundBase”类的,所以我们可以直接通过sound对象来调用声音处理的函数。框架在SoundBase.lua里面提供了“M.preloadMusic(filename, isDirect)”函数作为背景音乐资源的预加载方式。该函数有两个参数,第一个是字符串类型的文件名称,第二个参数表示是否直接获取,类型是布尔值,可缺省,默认是“false”。同样的,还提供了“M.preloadSound(filename, isDirect)”函数进行音效的预加载,用法和preloadMusic()函数一样。另外,还有“M.unloadMusic(filename, isDirect)”和“M.unloadSound(filename, isDirect)”用于背景音乐和音效资源的卸载。
对于场景过渡和资源加载的问题我们就介绍到这里,还有不明白的可以自行参考“GameBase.lua”、“display.lua”、“UResurce.lua”和“SoundBase.lua”文件。至此我们的《bbframework入门之路》系列博客就完整收官了,作为第一次写这种技术博客,自认写的不是很好,很多表述不够清楚明白。但是平哥委以重任,我也只好硬着头皮,同时厚着脸皮写下去。从中我也受益匪浅。另外,对于前面博文里面提到的例如“A”、“D”之类的标签,我会在下一篇里面特别贴出,其实他们都是一些全局的常亮,表示的都是框架里面常用的一些类对象,为了提高开发效率,摈弃非人类的编程语法而生的。
【脚注】
宝宝巴士-快乐童年!
原文:http://www.cnblogs.com/babybus-ios/p/bbframework-009.html