#82003/9/10 18:40:02
提问中讲的事件都是指的都是用户触发的事件,可以分几种,鼠标移动,键盘点击事件,鼠标点击事件。
我们现在以鼠标点击事件为例,上面的问题可以看为:点鼠标最一次点击后超过一定时间便触发相应处理。
那么怎么去得到这些判断,首先我们得了解 Director 的时间和超时。
Director 里缺省用 ticks 为时间单位,ticks 是秒的60分之一,但是 Director 的最小的计时单位为毫秒 milliseconds 是秒的 1000 分之一。
Director 里用分别用 the ticks 和 the milliseconds 记录开机以来的 ticks 数值和毫秒数值,再次提醒,Director 里缺省用 ticks 为时间单位。
用ctrl + m打开message窗口,分别输入put the ticks , put the milliseconds ,产生结果如下:
put the ticks
-- 1730146
put the milliseconds
-- 28837825
put (the ticks) / 60 - (the milliseconds) / 1000
-- 0
(在 Director 里用 time() 来记录当前时间,他只能精确到秒,所以一般不用来进行时间的运算,time() 按照机器用的时间格式,比如 hh:mm:ss)
出于讲述和使用的方便,下面都将用ticks来预算时间,the milliseconds 在一些更精细的场合使用,这里暂不叙述。
首先想到用户触发每一次鼠标点击事件可以纪录当前事件发生时的 ticks,比如:
on mouseup me
gtime = the ticks
end
那么,在记录每个事件 ticks 然后和当前 ticks 比较,当这个比较的差值等于期望的值(这里假设为 5 秒),正好说明最后一次用户鼠标点击事件距离现在 5 秒了,这时我们可以用程序执行跳转。
这样必须有两点
1、在每次用户鼠标点击事件的处理程序都得写上时间纪录程序。
2、需要一个程序一直监测对比 ticks 的值。
当然这样可以做到,我们可以在所有的on mouseup都加上时间纪录程序,而在 frame 循环里,或在“ on idle” movie脚本里监测对比ticks,程序为。
if the ticks = gtime + 5 * 60 then beep
注意到 oldloc 和 gtime 可能要在其他地方调用,我们也许要对变量使用 global 全局或 property 局部。
好像已经解决了问题,但是写程序很多时候注意到程序优化,怎么叫优化,依据体的情况而定,上面的程序有这么几个问题。
1、结构条理不清明晰,在每一个on mouseup都写上时间纪录是繁琐无条理的,很容易发生漏写等出错情况。
2、在判断语句里进行了两个变量的运算,要尽量减少可以不用的变量。
3、使用了过程的时间监测,这也将在复杂的程序里导致混乱,最好有一个像定时器的对象来实现这一功能。
4、要保持尽量少在 on idle 里写代码习惯。
针对这么几点,先到lingo找找有没有相关语句可以直接实现(不行的话只有自写代码),结果发现 Director 其实是有目的用一个类别的语句解决了这个问题,这组语句是Timeouts。
首先我们看到是timeoutlength,它可以设定超时的时间大小,例如设置一个五秒的超时。
the timeoutlength = 5 * 60 (如果不设定 the timeoutlength 将缺省为三分钟,也就是 3 * 60 * 60)。
这时不再需要对时间进行过程监测,只需要在每个用户事件后都写上超时设置,这样在最后一个用户事件后固定事件系统便发出一个超时请求。
一般用处理程序 on timeout 来接收他,没有接收程序将什么都不发生。
on timeout
beep
end
接下来马上存在一个问题,每一次都设定 the timeoutlength 是十分繁琐和没有效率的,我们更注意到无论在那里只要最後改过 the timeoutlength 的值,他将在整个movie里一值有效直到再次改变他,新开一个文件只创建一个movie脚本在里面写:
on startmovie
the timeoutlength = 5 * 60
end
on timeout
beep
end
返回的结果是每隔5秒定时返回一次蜂鸣,是一个简单的超时定时器。
我们在每次鼠标点击事件后加上the timeoutlength的设定起到两个作用,一是只是对超时的重置,另一是设定超时的时间长度,其实每次超时的时间长度都是一样的,可以统一设置,只需要在有鼠标点击就重置the timeoutlength的值,timeoutmouse就实现了这个功能。
timeoutmouse的值一旦设置为真,将在整个movie里都有效,代表当鼠标点击时重置超时定时器,同样我们在startmovie统一设置超时的时间长度,把上面的movie脚本改成:
on startmovie
the timeoutmouse = true
the timeoutlength = 5 * 60
end
on timeout
beep
end
把这段代码整合到任何不冲突的movie中,他都能达到问题提出的效果,看起来很像一个屏保,提出的问题已经解决了。但是可能还会有些小问题。
通常我们不可能只是没有用户事件 5 秒的时间来执行一个跳转,这个时间太短,我们需要的是五分钟或更长,虽然我们已经深信自己的代码,但花五分钟去等待一个无提示的画面总显的格外的漫长,而且你不要期望客户会有这个耐心,timeoutLapsed解决了这个问题,他记录了超时重置后经过的时间,我们可以用一个文本显示他,对于新建的文本我们写代码:
on exitframe me
member("time").text = string(the timeoutLapsed / 60)
go to the frame
end
改写上面代码 the timeoutlength = 5 * 60 为 5 分钟超时 the timeoutlength = 5 * 60 * 60 见timeout1.dir
还有很多情况,超时后要做的一件事情比如提示是在整个程序中好些地方要调用的,为了方便把他写成了:
on clewfor
dothing(也许代表100行的代码)
end
那么把这些代码在拷贝到on timeout里就太不精简了,the timeoutScript解决了这个问题,只要写the timeoutScript="clewfor"就可以了。
to be continue......
编辑历史:[这消息被54zq编辑过(编辑时间2003-09-10 18:59:26)]
[这消息被54zq编辑过(编辑时间2003-09-10 19:00:43)]
[这消息被54zq编辑过(编辑时间2003-09-10 19:02:07)]
[这消息被54zq编辑过(编辑时间2003-09-10 19:03:19)]