Shockwave 预载技术(1)
Shockwave 预载技术原著:Lingoworkshop
翻译:alphachi
当我们要预载一个Shockwave影片时,通常需要做到:(1)指定预载元素的URL;(2)了解预载工作的当前状态;(3)知道预载何时结束。因此本教程的第一部分将会创建一个“Preloader”剧本,用来从一个指定的URL预载文件。预载工作或许要花一些时间,所以我们将创建某种“进度条”,告诉用户离下载完成还有多长时间。本教程的第二部分将对创建动态进度条的方法进行介绍。
第一部分:“Preloader”父代剧本
preloadNetThing()函数在Lingo词典中的解释如下:“将一个文件从Internet预载到本地缓存,以便稍候能够无延迟地使用。”此函数会返回一个网络ID号,但不会停止影片的播放。
除了开始下载进程之外,preloadNetThing()函数单独不会做任何事情。我们可以使用getStreamStatus(ID)知道已下载了多少字节,还可以使用netDone(ID)检测网络操作是否已经完成。一般情况下,我们可以在任何时候调用这些函数,甚至在超时对象的配合下使整个过程更加容易。无需在一个全局变量中存储此网络ID,也不用在各处安插用于监测影片运行状态的剧本,我们只需创建一个简洁的自包容剧本即可开始下载并监视其进度。考虑下面这个名为“Preloader”的父代剧本:
"Preloader" Parent Script (v.1)
property myNetID
on new ( me , netAddress)
myNetID = preloadNetThing (netAddress)
aTimerObj = timeout ( me . string ). new ( 100 , # Timer_CheckProgress, me )
end
on Timer_CheckProgress ( me , aTimer)
finished = netDone (myNetID)
if finished then
put "All done!!"
aTimer. forget ()
else put "Still downloading..."
end
当影片运行时,在消息窗口中输入下面的代码来创建此剧本的一个新的实例:
script ( "Preloader" ). new ( "http://www.lingoworkshop.com/Tutorials/Preloader/Main.dcr" )
新的对象一旦被创建,将会调用preloadNetThing()函数,它使用指定的URL作为一个参数。此函数返回的网络ID被存储在一个名为“myNetID”的属性变量中。接下来,一个超时对象会被创建,它会每100毫秒调用一次此对象的Timer_CheckProgress处理程序。
此剧本中的new处理程序不会像平时那样返回对象的引用(参数“me”),这是由于对象需要一个持久的引用以保持其活动状态,否则Director会认为已经不再需要此对象而将其从内存中移除。在这个例子中,超时对象保存了此对象的一个引用,因此我们也无需在其他任何地方二次存储了。
当Timer_CheckProgress处理程序被超时对象调用时,“Preloader”对象将使用netDone(ID)检测预载是否已经完成。一旦完成,它便利用被作为参数传递给超时对象的引用去掉超时对象本身(超时对象总是将一个引用发送给自己作为参数)。“Preloader”对象去掉超时对象时,超时对象便被破坏了——而由于超时对象掌握着“Preloader”对象唯一的引用,此时“Preloader”对象自然也就被破坏了。
这样一来,“Preloader”父代剧本便拥有了创建简洁的自包容对象的能力,而这些对象能够预载文件并在任务完成后破坏自己。下一步我们将让对象拥有彼此进行交互的能力。
为了能够只需少量改动即可将其用于各种项目,我们需要让剧本尽可能的一般化。可以在返回调用处理程序和作为起始参数指定的目标处创建一个“Callback System”,考虑“Preloader”父代剧本的下面这个版本:
"Preloader" Parent Script (v.2)
property myNetID, myCallBackObj, myCompletionMsg
on new ( me , netAddress, CallBackObj, CompletionMsg)
myCallBackObj = CallBackObj
myCompletionMsg = CompletionMsg
myNetID = preloadNetThing (netAddress)
aTimerObj = timeout ( me . string ). new ( 100 , # Timer_CheckProgress, me )
end
on Timer_CheckProgress ( me , aTimer)
finished = netDone (myNetID)
if finished then
aTimer. forget ()
call (myCompletionMsg, [myCallBackObj])
else put "Still downloading..."
end
这个版本添加了两个起始参数——一个是对象的引用,预载完成时我们将向其发送一个消息;另一个是发送此消息时使用的处理程序名称。当预载完成时,“Preloader”剧本将调用目标对象中的这个处理程序。要想了解整个工作过程,可以创建一个附带下面这个名为“PreloaderInte易做图ce”的行为的角色:
on beginSprite me
if the runMode = "Author" then clearcache ()
urlToLoad = "http://www.lingoworkshop.com/Tutorials/Preloader/Main.dcr"
script ( "Preloader" ). new (urlToLoad, me , # mHandlePreloadCompletion)
end
on mHandlePreloadCompletion ( me )
alert "All Done"
end
在角色被点击时,此行为将创建一个“Preloader”剧本的新的实例,然后连同特定的处理程序名称一起,将一个引用传递给这个行为(参数“me”)。当预载完成时,“Preloader”对象将调用此行为的处理程序。
[1]