Flash 菜鸟笔记 之 预载声音
Author: 晓亮
27
Dec
以下内容如果你觉得没用,那是因为你还不够菜
版本:As2
情境:如果声音导入到库中,并且希望通过attachSound来加载的话,就需要在第一帧导出。这时如果有loader的话,就会出现很长一段时间的空白,等到出现loader进度已经走了很多。
我尝试了两种解决方法,现在记录下来,以备日后总结。
1、另建一个swf,将原来的文件以MovieClipLoader加载到新建的swf的MovieClip中,通过myMCL.onLoadProgress获取以加载的字节及总字节数,作为进度。
2、用loadSound加载声音,用_root.getBytesLoaded()与song.getBytesLoaded()之和除以_root.getBytesTotal()与song.getBytesTotal()之和,从而得到一个总的进度。
第一种方法比较麻烦,而且还需要改动原来文件中涉及到_root的地方,因为在原来的文件被新文件加载后,原来的_root就变成了一个MovieClip。另外还出现了一些难以解决的问题,如:这种方法总是提前很多载入MC,这就造成了一边还在走进度,一边已经开始播放的情况;原来文件库中的声音通过attachSound无论如何也加载不上了;若用loadSound来加载声音,就还要等待声音加载完全再播放,如果以流格式播放则又无法控制…水平实在太有限了,所以最终还是放弃。相关代码记录如下:
myMCL = new MovieClipLoader();
loadListener = new Object();
//开始加载时设置被加载的对象为隐藏的
loadListener.onLoadStart = function (loadTarget) {
loadTarget._visible = false;
}
//加载的过程控制进度的显示和加载完毕后的操作
loadListener.onLoadProgress = function(loadTarget, bytesLoaded, bytesTotal) {
percent.text = "还剩 " + String(100 - int((bytesLoaded 除以 bytesTotal)*100)) + "% ...";
if(bytesLoaded = bytesTotal){
loadTarget._visible = true;
myMCL.removeListener(loadListener);
percent._visible = false;
}
}
/* 一直不明白为什么写了onLoadComplete还要写onLoadInit,何况这两个的功能也可以通过在onLoadProgress事件中来控制。
loadListener.onLoadComplete = function(loadTarget) {
loadTarget._visible = true;
myMCL.removeListener(loadListener);
percent._visible = false;
}
loadListener.onLoadInit = function(loadTarget) {
loadTarget._visible = true;
myMCL.removeListener(loadListener);
}
*/
myMCL.addListener(loadListener);
myMCL.loadClip("main.swf","mainMovie"); //mainMovie是用来容纳main.swf的MC
第二种方法或许比较笨,却着实解决了问题,应加以纪念 
Leave a reply