上一篇 | 下一篇

Shockwave预载技术(一)

发布: 2007-1-25 14:01 | 作者: Lingoworkshop | 来源: 译自lingoworkshop.com | 查看: 292次

  原著:Lingoworkshop奥古多媒体:n]Bgt"L3K#X|
  翻译:alphachi
m oa#f0EO 奥古多媒体8M R*C.l B4` _Tjc
  当我们要预载一个Shockwave影片时,通常需要做到:(1)指定预载元素的URL;(2)了解预载工作的当前状态;(3)知道预载何时结束。因此本教程的第一部分将会创建一个“Preloader”剧本,用来从一个指定的URL预载文件。预载工作或许要花一些时间,所以我们将创建某种“进度条”,告诉用户离下载完成还有多长时间。本教程的第二部分将对创建动态进度条的方法进行介绍。
y6b \!u-sjb0V6nZ
.uj]h UM   第一部分:“Preloader”父代剧本
G9zeLKx W Xy
5Z%y}T~%_/z   preloadNetThing()函数在Lingo词典中的解释如下:“将一个文件从Internet预载到本地缓存,以便稍候能够无延迟地使用。”此函数会返回一个网络ID号,但不会停止影片的播放。奥古多媒体$p0i9r5o0|*f(X;s
奥古多媒体 m-h2I:mpcG#@'a+P:t
  除了开始下载进程之外,preloadNetThing()函数单独不会做任何事情。我们可以使用getStreamStatus(ID)知道已下载了多少字节,还可以使用netDone(ID)检测网络操作是否已经完成。一般情况下,我们可以在任何时候调用这些函数,甚至在超时对象的配合下使整个过程更加容易。无需在一个全局变量中存储此网络ID,也不用在各处安插用于监测影片运行状态的剧本,我们只需创建一个简洁的自包容剧本即可开始下载并监视其进度。考虑下面这个名为“Preloader”的父代剧本:
t}!S-?c5w{ 奥古多媒体 g:v,Eqk+I*zV P*B
"Preloader" Parent Script (v.1) 奥古多媒体ya%f%l"VNS
奥古多媒体)Hj^+Gh1}8F3VU
property myNetID
H@?sB%h?4n 奥古多媒体%X0r0C1g_e
on new (me, netAddress)
D_i6h1_*Y lA   myNetID = preloadNetThing(netAddress)奥古多媒体8To]B"N@
  aTimerObj = timeout(me.string).new(100, #Timer_CheckProgress, me)
[7u&w@)vw'GH end 奥古多媒体r AC'~{zA*t

UZ6v]#{j&Z!eK on Timer_CheckProgress (me, aTimer)
2E |(MD3?n   finished = netDone(myNetID)奥古多媒体/[0rHU*d!dL;_ wj
  if finished then
-LciJN%o     put "All done!!"
tr'c^ ?ycH\mG     aTimer.forget()奥古多媒体:G |%m4Q8TQz
  else put "Still downloading..."
5Qt#ByNb W-V end
奥古多媒体u,~M,FX5nN+{"{-H
奥古多媒体 n^g!G F2J
  当影片运行时,在消息窗口中输入下面的代码来创建此剧本的一个新的实例:奥古多媒体4g'M1w#^2D6Td7aD({

Y4q\+g0x script("Preloader").new("http://www.lingoworkshop.com/Tutorials/Preloader/Main.dcr")
X Rq!j&E2w V'n;C/{ 奥古多媒体 i|1jT0y%Ic
  新的对象一旦被创建,将会调用preloadNetThing()函数,它使用指定的URL作为一个参数。此函数返回的网络ID被存储在一个名为“myNetID”的属性变量中。接下来,一个超时对象会被创建,它会每100毫秒调用一次此对象的Timer_CheckProgress处理程序。
jt3R r%ty
#j`]&V M~y   此剧本中的new处理程序不会像平时那样返回对象的引用(参数“me”),这是由于对象需要一个持久的引用以保持其活动状态,否则Director会认为已经不再需要此对象而将其从内存中移除。在这个例子中,超时对象保存了此对象的一个引用,因此我们也无需在其他任何地方二次存储了。
}+M9U4x:raPX
1h5\,p.E?[   当Timer_CheckProgress处理程序被超时对象调用时,“Preloader”对象将使用netDone(ID)检测预载是否已经完成。一旦完成,它便利用被作为参数传递给超时对象的引用去掉超时对象本身(超时对象总是将一个引用发送给自己作为参数)。“Preloader”对象去掉超时对象时,超时对象便被破坏了——而由于超时对象掌握着“Preloader”对象唯一的引用,此时“Preloader”对象自然也就被破坏了。
e j4AJ"Z8p9}^$b-R 奥古多媒体K^,Qp'nA8i6SaNG
  这样一来,“Preloader”父代剧本便拥有了创建简洁的自包容对象的能力,而这些对象能够预载文件并在任务完成后破坏自己。下一步我们将让对象拥有彼此进行交互的能力。奥古多媒体%ZE3|*?!g [
奥古多媒体 E)m(E1B#@1[8["Df6MP{
  为了能够只需少量改动即可将其用于各种项目,我们需要让剧本尽可能的一般化。可以在返回调用处理程序和作为起始参数指定的目标处创建一个“Callback System”,考虑“Preloader”父代剧本的下面这个版本:奥古多媒体e-IWMg?

(ljp wU D @5gE "Preloader" Parent Script (v.2)
5J#a+qx2Y 奥古多媒体t CZ2Z#ZD/\ b5CE
property myNetID, myCallBackObj, myCompletionMsg
dqCxDF-N ]Q
7?1c^cC!qw on new (me, netAddress, CallBackObj, CompletionMsg)
/i|i Kg/` UE   myCallBackObj = CallBackObj
xH7UzOy"T9g&O   myCompletionMsg = CompletionMsg奥古多媒体 s#@;YTF@
  myNetID = preloadNetThing(netAddress)
Op V ~ V&N7_?0R_   aTimerObj = timeout(me.string).new(100, #Timer_CheckProgress, me)
9@(l1j}8i/E j end
*g*[L-R8B p H 奥古多媒体9Sv0gn(r;qX:E0{$T
on Timer_CheckProgress (me, aTimer)
soI:R1K fy6yFE6L$h]   finished = netDone(myNetID)
Q&NP Z(y:bZ7}   if finished then
Q\2x)zW:Jh     aTimer.forget()奥古多媒体tNX%CqQ~ tg
    call(myCompletionMsg, [myCallBackObj])奥古多媒体 t c\B2B'O z
  else put "Still downloading..."
,G]j!LUWmc end
|)q+R*A*[,o7| m"aE
奥古多媒体L7`*rz'U0M4S$yr-hh
奥古多媒体0["\j,H/v DaM aF
  这个版本添加了两个起始参数——一个是对象的引用,预载完成时我们将向其发送一个消息;另一个是发送此消息时使用的处理程序名称。当预载完成时,“Preloader”剧本将调用目标对象中的这个处理程序。要想了解整个工作过程,可以创建一个附带下面这个名为“PreloaderInterface”的行为的角色:
U!H$^!^tG;eX 奥古多媒体(e6Y VMEP6q.q'N:k
on beginSprite me奥古多媒体/X cV/EM8H&}q
  if the runMode = "Author" then clearcache()
a2Y\U"B#X){   urlToLoad = "http://www.lingoworkshop.com/Tutorials/Preloader/Main.dcr"
l9p{,G K5a   script("Preloader").new(urlToLoad, me, #mHandlePreloadCompletion)奥古多媒体Jc8bQ et7jk8B{
end 奥古多媒体 `/Wl*v u/EM
奥古多媒体3cV,a0NR6ZZG
on mHandlePreloadCompletion (me)奥古多媒体7hxE Y8{9ICj
  alert "All Done"
s{pX\"o M(W end

!Ay~3`-r-P4tR 奥古多媒体e+c)D1ha S^/|
  在角色被点击时,此行为将创建一个“Preloader”剧本的新的实例,然后连同特定的处理程序名称一起,将一个引用传递给这个行为(参数“me”)。当预载完成时,“Preloader”对象将调用此行为的处理程序。

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


最新歌曲
转机 放生 黄玫瑰 摇啊摇 那滋味 擦肩而过 你若成风 幸福一辈子 依然在一起 吻得太逼真 感动天感动地 坐上火车去拉萨 怎么会狠心伤害我
心碎 冲动 小太阳 别碰我 蒲公英 爱情小偷 只要不亏 一定要爱你 等爱的玫瑰 无情的温柔 北极星的眼泪 最后一次的温柔 亲爱的那不是爱情
光荣 火花 下雨天 我可以 樱花草 为你写诗 独家记忆 再见小时候 寂寞才说爱 忘不掉的伤 爱上你是个错 第三者的第三者 孤独的时候可以抱你
假如 城府 是非题 有缘人 舍不得 我的答铃 只欠秋天 外滩十八号 越爱越难过 123木头人 爱走了心碎了 爱上你是我的错 爱情里没有谁对谁错