初级视频编辑室|草蜢非编论坛|初级视编室|草蜢视频编辑|会声会影|威力导演|电子相册

 找回密码
 加入初编室
搜索
查看: 995|回复: 3
打印 上一主题 下一主题

[Director 多媒体爱好者] Director中的定时time out对象

[复制链接]

296

主题

1132

帖子

2万

积分

超级版主

Rank: 8Rank: 8

论坛版主精华帖勋章

跳转到指定楼层
楼主
发表于 2014-11-23 21:15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
onekey onekey
  我们经常要作这样的事情,每隔一段时间就去触发一个事件。例如,当你组建一个shockwave电影时,可能会要每隔2秒钟去测试一下一个特定成员的mediaReady属性以便于判断何时它可以使用。一旦它准备好了,就不需要再判断了。

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

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

timeout ("thetimeOutName").new (1000, #theHandlerToCall, theTarget)

  每一个定时对象都用一个字符串作为名字来标识。上例中定时对象的名字是‘‘thetimeOutName‘‘.new方法中的第二个参数用来指出,当指定时间间隔之后,需要执行的句柄。这个句柄名被储存在对象的timeoutHandler属性中。注意你必须把句柄名写成符号形式。

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

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

  在消息窗口中试着输入以下代码:

timeout ("thetimeOutName").new (1000, #theHandlerToCall, theTarget)
put the timeoutlist
-- [timeOut(‘‘thetimeOutName‘‘)]

  以下是一个电影中的代码(带注释)

on prepareMovie
--创建定时对象
timeout ("annoyTheUser").new (5000, #callAlert)
end


on callAlert
alert "Click the button"
end

on buttonClicked
--点击按钮时,从timeoutlist中清除掉这个定时对象。
timeout ("annoyTheUser").forget ()
end


  定时对象在进行异步操作时尤其有用,例如在netlingo中的很多调用,典型的调用这样写:

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

  定时对象可以周期性地检查是否操作已经进行,以往我们需要不听地在exitframe句柄中判断,现在你可以用一个定时对象来检查,在调用getNetText后面加上一个定时对象,然后在电影脚本中加入一个句柄,调用这个句柄时就检查是否进行了某种操作。

  代码如下:

timeout ("checkNetOperation").new (1000, #checktheNetOperation)

on checktheNetOperation
if netdone (gnetid) then
--if the operation is done kill the timeout object
timeout ("checkNetOperation").forget ()
if neterror (gnetid) = "OK" then
res=netTextResult (gnetid)
--do the rest of the processing
process res
end if
end if
end

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


楼主热帖
河边已是一首歌
回复

使用道具 举报

206

主题

4527

帖子

7万

积分

初编室元帅

Rank: 14Rank: 14Rank: 14Rank: 14

活跃会员帅哥会员百帖纪念荣誉勋章论坛万元户

沙发
发表于 2014-11-23 21:55:05 | 只看该作者
谢谢楼主提供分享!!

206

主题

4527

帖子

7万

积分

初编室元帅

Rank: 14Rank: 14Rank: 14Rank: 14

活跃会员帅哥会员百帖纪念荣誉勋章论坛万元户

板凳
发表于 2014-11-23 21:55:29 | 只看该作者
谢谢楼主提供分享!!

131

主题

5846

帖子

12万

积分

初编室元帅

Rank: 14Rank: 14Rank: 14Rank: 14

帅哥会员活跃会员论坛万元户百帖纪念荣誉勋章

地板
发表于 2015-1-21 11:44:00 | 只看该作者
逛一逛,看一看,顶一顶。
您需要登录后才可以回帖 登录 | 加入初编室

本版积分规则

手机版|小黑屋|初级视频编辑室

GMT+8, 2024-12-27 17:19 , Processed in 0.089283 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表