上一篇 | 下一篇

定时对象

发布: 2007-1-25 17:10 | 作者: David Berge | 来源: 译自director-online.com | 查看: 274次

  原著:David Berger   翻译:jerrowolf
$~/D,ZKR%e B 奥古多媒体GB} P3Aw.t@
  我们经常要作这样的事情,每隔一段时间就去触发一个事件。例如,当你组建一个shockwave电影时,可能会要每隔2秒钟去测试一下一个特定成员的mediaReady属性以便于判断何时它可以使用。一旦它准备好了,就不需要再判断了。

!\1?D3L|U7w2Ze M#V   编写这样的程序,一般会用全局变量或者对象和行为属性来跟踪时间变化。有时用到the timer。这样的脚本经常会对演员表进行操作,并且通过帧的步进来传递消息。这样的方法经常会产生bug,并且很难阅读。在Director8当中,我们可以利用定时对象来探索一个比较明智的解决方案。

-Mt,oES   基本的方法就是,你先创建一个定时对象。然后告知它在给定的时间间隔内执行什么样的句柄。定时对象会被加入到timeoutlist列表,这个列表是系统属性,是当前激活的定时对象的线形列表。列表中的每一个定时对象都会自动地执行,除非你用forget方法将其移除。创建定时对象使用new方法。

8n)h9_t*?mI6o timeout (‘‘thetimeOutName‘‘).new (1000, #theHandlerToCall, theTarget)

,y;l2d2x^K L   每一个定时对象都用一个字符串作为名字来标识。上例中定时对象的名字是‘‘thetimeOutName‘‘.new方法中的第二个参数用来指出,当指定时间间隔之后,需要执行的句柄。这个句柄名被储存在对象的timeoutHandler属性中。注意你必须把句柄名写成符号形式。 奥古多媒体Kyn+fj m:Q7x.G,r

  第一个参数指出经过多长时间才执行timeoutHandler句柄。也就是时间间隔。格式是毫秒,在上例中,每隔一秒钟执行一次句柄。这个时间存储在对象的period属性当中。

cLZR9UL+[D   第三个参数指定timeoutHandler句柄的位置。他被存储在定时对象的the target 属性当中,如果the target为空,则Director会在电影脚本中寻找相应的句柄,我更喜欢建立一个父脚本,把我想要调用的句柄放在父脚本中,这样我可以从父脚本的一个实例当中调用句柄,你可以使用me来做为the target。

Xp B\RP\$t)F   在消息窗口中试着输入以下代码: 奥古多媒体a A` QT5[+u

timeout (‘‘thetimeOutName‘‘).new (1000, #theHandlerToCall, theTarget)
u `F!q%mgput the timeoutlist奥古多媒体W7xZ+LlO`
-- [timeOut(‘‘thetimeOutName‘‘)]

:IzJ!aJ'h0C&v6g   以下是一个电影中的代码(带注释) 奥古多媒体'L/\ M:An

on prepareMovie奥古多媒体`ShC j{0W g
--创建定时对象奥古多媒体4CYzTZV9M.a`
timeout (‘‘annoyTheUser‘‘).new (5000, #callAlert)
o4A r3g'S$zend 奥古多媒体.Q!RS7mZN`6m


4wL!\5g_ e%a-C.\ion callAlert奥古多媒体5t{roD:]W{M.o
alert ‘‘Click the button.‘‘
5D)lOoehy Kmend

4b\6`.\h$Xn on buttonClicked奥古多媒体Q;h+He ~1o+Y%q
--点击按钮时,从timeoutlist中清除掉这个定时对象。奥古多媒体+i,D"rkS
timeout (‘‘annoyTheUser‘‘).forget ()奥古多媒体h#\cZ y
end 奥古多媒体OP;GiW @+f


.h1nS(}c9e QjkL  定时对象在进行异步操作时尤其有用,例如在netlingo中的很多调用,典型的调用这样写: 奥古多媒体uYB5@]8HA

gnetid = getnettext (‘‘http://www.mysite.com/mytext.htm‘‘)

{ T:V:z6MLs5r   定时对象可以周期性地检查是否操作已经进行,以往我们需要不听地在exitframe句柄中判断,现在你可以用一个定时对象来检查,在调用getNetText后面加上一个定时对象,然后在电影脚本中加入一个句柄,调用这个句柄时就检查是否进行了某种操作。 奥古多媒体7V:M8L+V2r"}9w

  代码如下:

2t5B!KVe'a timeout (‘‘checkNetOperation‘‘).new (1000, #checktheNetOperation)

({ }"wO/T4x%s.rH on checktheNetOperation
2@z7\:Hd!Neif netdone (gnetid) then
U vOZl2~kUS--if the operation is done kill the timeout object
-G%z4H4\9{rtimeout (‘‘checkNetOperation‘‘).forget ()
tBw|0a^,?if neterror (gnetid) = ‘‘OK‘‘ then奥古多媒体ga k7C(V)kO
res=netTextResult (gnetid)
;x l`Z6A S8?i v `--do the rest of the processing 奥古多媒体$H1s,c}z4Vn*h
process res
J6@8o7R+@ [i"yend if
~:W9I$d8e `end if
2yGacW+Uend 奥古多媒体*]M5a-Jp7}Xv

  我还经常使用定时对象来在两个shockwave电影之间传递信息。第一个电影中添加了一个定时对象,它每隔几秒钟调用一个句柄,这个句柄用来检查由getPref方法指定名字的文件是否存在,当第二个电影需要传递数据时,它将数据写入指定文件中,当第一个电影从文件中取得数据时,马上通过forget方法去掉定时对象。总之,定时对象非常有用,如果你还在使用Director7,那么,赶紧升级来体验一下这些新东西吧。奥古多媒体 M0z5r%sD#@

af-XY-X(~0]D

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


音乐
落叶 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 如果爱能早些说出来
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 为你而活 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
城府 假如 花海 兰亭序 爱太痛 舍不得 你若成风 女人如烟 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错