NewsRhzhi | 先创资讯 | 旧版入口
rhzhi.net
网站首页 | NewsRhzhi | 先创资讯 | 操作系统 | 工具软件 | 办公软件 | 网站设计 | 组网专栏 | 平面设计 | 多 媒 体 | 程序开发 | 硬件资料 | 聊天软件
您现在的位置: 先创网 >> 媒体动画 >> Director >> 文章正文
Shockwave 预载技术(1)
网络文摘
2005-10-16 11:38:15文/佚名
    

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

打印此页 投稿与建议 返回顶部
栏 目 索 引
软件应用 SOFTWARE
Win XP | NT/2003
Win2000 | DOS/Win9x
PowerPoint | Office
Excel | Word
网络软件 | 实用软件
媒体软件 | 系统软件
常用软件 | 办公软件
聊天软件 | 网络安全
新软试用 | Vista
设计在线 DESIGN
Dreamweaver | 3DMax
Photoshop | Flash
平面设计 | 网页设计
多 媒 体 | 精品画廊
精彩专区 SPECIAL
Q Q 专区 | 热门专题
组网玩网 | 程序开发
应用集锦 |

没有任何图片文章
相关文章
关于我们 - 联系方式 - 合作伙伴 - 网站大事记 - 网站地图 - 我要投稿
Copyright ©1997-2008 先创网 All Rights Reserved.
先创科技 版权所有