根据不同的需要,可以在各种脚本中处理自动系统事件。由于Director中的脚本种类繁多,包括了影片脚本、帧脚本、角色脚本、演员脚本和父代脚本,所以很容易构成多重触发,其最终结果经常难以预计。
下面将通过具体的测试来分析各种情况下自动系统事件的多重触发,从而为处理好这些事件奠定基础。
由于本文并未涉及面向对象的相关技术,所以stepFrame事件与父代脚本均不在讨论范围之内。
一、构建测试环境
测试影片中包含了影片脚本、演员脚本(依附于位图演员)、角色脚本和帧脚本各一个,分别写入了全部自动系统事件的处理程序。在影片播放过程中,只要触发了相应的事件,就会在消息窗口中显示事件处理程序的运行结果,进而即可判定来源,同时也能够确定事件触发的顺序。
为了便于测试,请关闭影片的循环播放模式。
二、确定标准流程
回转并播放测试影片,结束后消息窗口中的内容如下所示:
-- "Movie's prepareMovie"
-- "Frame's beginSprite"
-- "Sprite's beginSprite"
-- "Sprite's prepareFrame"
-- "Frame's prepareFrame"
-- "Movie's startMovie"
-- "Sprite's enterFrame"
-- "Frame's enterFrame"
-- "Sprite's exitFrame"
-- "Frame's exitFrame"
-- "Movie's stopMovie"
-- "Frame's endSprite"
-- "Sprite's endSprite"
以上便是自动系统事件的标准流程,即这些事件触发的先后顺序。下面的测试将基于此流程进行。
三、进行测试
首先列出所有可能的脚本组合,然后通过对脚本代码的注释与取消注释来构建这些组合,影片播放完毕之后记录消息窗口中相应的内容。为了遍历所有的情况,共需进行15次测试。

图1 测试记录
在测试记录中,除了Flow列按标准流程依次列出了全部自动系统事件之外,其他各列均记录了某种脚本组合(在第2行用粗体表示)下事件的触发情况。以MFSC列为例,MFSC表明测试时激活了全部四种脚本,即影片脚本(Movie Script)、帧脚本(Frame Script)、角色脚本(Sprite Script)和演员脚本(Cast Meber Script),而整个测试过程中被触发的事件依次为:影片脚本中的prepareMovie事件,帧脚本中的beginSprite事件,角色脚本中的beginSprite事件,角色脚本中的prepareFrame事件,帧脚本中的prepareFrame事件,影片脚本中的startMovie事件,角色脚本中的enterFrame事件,帧脚本中的enterFrame事件,角色脚本中的exitFrame事件,角色脚本中的exitFrame事件,影片脚本中的stopMovie事件,帧脚本中的endSprite事件,角色脚本中的endSprite事件。
四、测试记录分析
从1X下各列可以看到:prepareMovie、startMovie和stopMovie事件只有置于影片脚本中才会被触发;beginSprite和endSprite事件只有置于帧脚本和角色脚本中才会被触发;prepareFrame、enterFrame和exitFrame事件置于任何脚本中都会被触发。
从beginSprite与endSprite行可以看到:如果beginSprite或endSprite事件被同时置于帧脚本和角色脚本中,那么帧脚本中的将先被触发。
从prepareFrame、enterFrame与exitFrame行可以看到:对于prepareFrame、enterFrame或exitFrame事件,如果被同时置于帧(或影片)脚本和角色(或演员)脚本中,那么角色(或演员)脚本中的将先被触发;如果被同时置于帧脚本和影片脚本中,那么只有帧脚本中的会被触发;如果被同时置于角色脚本和演员脚本中,那么只有角色脚本中的会被触发。
五、自动系统事件的处理建议
prepareMovie、startMovie和stopMovie事件应置于影片脚本中;beginSprite和endSprite事件需要置于帧脚本或角色脚本中,帧脚本中的处于高优先级;prepareFrame、enterFrame和exitFrame事件可以置于任何脚本中,角色脚本和演员脚本的处于高优先级,帧脚本和影片脚本的处于低优先级,同优先级下前者抑制后者。
