主题:  请教:如何判断是否有交互行为????

小虫儿

职务:普通成员
等级:1
金币:0.0
发贴:16
注册:2003/8/28 11:59:22
#12003/9/1 13:29:25
在一段时间内(比如1分钟),如果没有任何的交互行为(比如:鼠标事件)就让它跳转到别的帧,应该怎么写呀,我不知道该如何判断是否有交互。谢谢各位高手。 :confused:

编辑历史:[这消息被小虫儿编辑过(编辑时间2003-09-01 13:45:45)]


吃鱼专家

职务:普通成员
等级:6
金币:11.0
发贴:5312
注册:2004/1/17 13:07:16
#22003/9/1 13:41:50
时间线上先WAIT 60秒,然后运行到下一帧,帧中设跳转



小虫儿

职务:普通成员
等级:1
金币:0.0
发贴:16
注册:2003/8/28 11:59:22
#32003/9/1 16:10:45
这个问题我明白了:用的是the lastevent事件,
可是当我加上这个事件时,为什么鼠标放在有交互的地方时,鼠标状态没有改变呢?(不执行这个语句而别的语句都好用)我常常会遇到这种情况,请问这是为什么呢?是跟交互行为的先后有关吗?怎么解决这样的问题呢?

编辑历史:[这消息被小虫儿编辑过(编辑时间2003-09-01 16:12:17)]


HolyKnight

职务:普通成员
等级:1
金币:1.0
发贴:175
注册:2002/12/25 12:38:14
#42003/9/2 9:48:37
我写了这个看看对你有没有帮助?!!
在电影一开始
global gMouseloc,gFrame
on startmovie--在电影开始,保存当前鼠标位置和当前标记号
gFrame=the framelabel
gMouseloc=the mouseloc
the timeoutlength=60*5--设置等待时间,5为等待秒数
end
在出现行为时
global gMouseloc,gFrame
on exitframe
if gMouseloc <> the mouseloc then--鼠标是否移动了?
the timeoutlength=60*5 --鼠标移动,设置等待时间,5为等待秒数
go to gFrame --返回进入标记
else--没有移动鼠标停止不动
go to the frame
end if
end
on keydown--键盘按下返回进入标记
go to gFrame
end



小虫儿

职务:普通成员
等级:1
金币:0.0
发贴:16
注册:2003/8/28 11:59:22
#52003/9/3 8:53:51
非常感谢对我有很大帮助的



genhua

职务:普通成员
等级:1
金币:0.0
发贴:113
注册:2003/4/17 21:22:52
#62003/9/6 9:36:26
如何定义当前鼠标的位置和当前帧的标志,也就是说电影开始的时候如何让程序获得gMouseloc,gFrame的信息?能不能讲讲一下?



HolyKnight

职务:普通成员
等级:1
金币:1.0
发贴:175
注册:2002/12/25 12:38:14
#72003/9/9 17:15:07
可以在 "准备播放电影"这个事件(具体事件名计不清了)
用一个全局变量保存鼠标的当前值,以后鼠标的位置改变了是相对这个值的变化!



D计划-混沌

职务:管理员
等级:6
金币:15.2
发贴:3528
注册:2007/4/9 9:48:37
#82003/9/10 18:40:02
提问中讲的事件都是指的都是用户触发的事件,可以分几种,鼠标移动,键盘点击事件,鼠标点击事件。
  我们现在以鼠标点击事件为例,上面的问题可以看为:点鼠标最一次点击后超过一定时间便触发相应处理。
  那么怎么去得到这些判断,首先我们得了解 Director 的时间和超时。
  Director 里缺省用 ticks 为时间单位,ticks 是秒的60分之一,但是 Director 的最小的计时单位为毫秒 milliseconds 是秒的 1000 分之一。
  Director 里用分别用 the ticksthe 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)]


D计划-混沌

职务:管理员
等级:6
金币:15.2
发贴:3528
注册:2007/4/9 9:48:37
#92003/9/30 11:18:38
注意到以上只能判断鼠标点击和键盘点击,但很多情况我们或许要用到任何事件的监测,或鼠标移动的监测,(注意任何事件其实就是鼠标移动+鼠标点击+键盘点击)这就需要写更多的程序,很遗憾在director没有具体的语句比如on mousemove来监测鼠标移动,但是不要紧,办法有很多,比如the lastRoll ,这个系统参数返回鼠标最后一次动作到现在的时间
to be continue......