首页 > 网站 > 媒体动画 > 正文

Director基础教程:Shockwave 预载技术(1)

2024-09-08 19:27:08
字体:
来源:转载
供稿:网友
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”剧本将调用目标对象中的这个处理程序。要想了解整个工作过程,可以创建一个附带下面这个名为“preloaderinterface”的行为的角色:

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”对象将调用此行为的处理程序。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表