在authorware中,表达式和程序语句一般应用于以下3类场合:
(1)用于【运算】设计图标和附属【运算】设计图标中。
(2)嵌入到文本对象中。将表达式用花括号({})括起来后嵌入到文本对象中,当该文本对象被显示在【演示】窗口中时,花括号连同其中的内容就会被转换为相应的计算结果显示出来。
(3)用于各种属性检查器中。可以使用表达式灵活地控制各种对象的属性,例如设置激活条件或定位坐标。
如果需要在【演示】窗口中显示出变量的值或者函数和表达式的计算结果,就必须将它们嵌入到文本对象中。
嵌入到文本对象中的表达式必须包围在花括号({})之中,当authorware显示该文本对象时,将对花括号中的表达式进行运算,并且显示运算结果,图3-24描述的是同一个文本对象处在两种不同状态时显示出的内容。如果不使用花括号,authorware将显示出变量名、函数名或表达式本身,而不对它们进行运算,这一点很容易从图3-24(b)中观察到。
对于嵌入到文本对象中的数值型表达式,authorware允许设置其运算结果的显示精度。选中文本对象之后,执行text>number format菜单命令,可以调出【number format】(【数字格式】)对话框,如图3-25所示。在这里设计人员可以设置所需的数字格式:是否显示小数部分,是否显示千位分隔符,以及小数点后保留几位有效数字等。在这里进行的设置仅影响数值型表达式运算结果的显示精度,在实际运算时,authorware总是使用最大的精度。
在【number format】对话框中,将小数点后保留的有效数位设置为6位时,上述文本对象的显示结果如图3-26所示。
(a)编辑状态 (b)非编辑状态
图3-24 向文本对象中嵌入表达式示意图
图3-25 【数字格式】对话框窗口
向文本对象中嵌入变量或函数最常用的方式是使用【变量】面板窗口或【函数】面板窗口。首先进入文本对象编辑状态,将插入点光标定位在需要插入变量或函数的位置,然后在【变量】面板窗口或【函数】面板窗口中双击所需的变量或函数,对应的变量或函数就被粘贴在文本对象中插入点光标所在的位置,并且自动被包围在花括号之中,如图3-27所示。
如果在向【显示】设计图标或【交互作用】设计图标中粘贴变量或函数时,没有进入文本对象编辑状态,则authorware为被粘贴的变量或函数创建一个新的文本对象。
也可以不通过【变量】面板窗口或【函数】面板窗口而采用直接输入的方法,在文本对象中嵌入变量、函数和表达式,此时必须手工输入花括号,注意花括号不能嵌套使用。
图3-26 调整数值显示精度
图3-27 向文本对象中粘贴变量
在默认情况下,程序只在运行到某个设计图标时,才对该设计图标中包含的文本对象进行计算和显示。如果文本对象中内嵌的变量的值或表达式的计算结果在后来发生变化,那么除非程序再次执行该设计图标,否则【演示】窗口中依然显示先前的内容。通过打开设计图标属性检查器中的【update displayed variables】复选框,可以使程序在运行期间自动根据嵌入到文本对象中的变量的当前值,更新文本对象的显示结果。这里有一个最典型的例子:通过在文本对象中嵌入反映系统当前时间的系统变量fulltime,并设置对应设计图标的【update displayed variables】属性,可以实现在【演示】窗口中实时显示当前时间的功能,如图3-28所示。
图3-28 自动更新文本对象的显示
上述文本对象存在于chapter03文件夹内的范例程序textobject.a7p中。
在各种属性检查器中,许多属性可以通过变量、函数或表达式进行设置,利用这一特性,在程序运行过程中可以使用表达式对各种对象(设计图标、显示对象等)的属性进行灵活设置。如图3-29所示,“graphic”设计图标之中包含有一个具有不规则形状的几何图形(由一个圆形对象和一个多边形对象组成),在【显示】设计图标属性检查器中,按照以下方式将设计图标初始定位坐标设置为:
random(displaywidth/2,windowwidth-1-displaywidth/2,1) --initial x
random(displayheight/2,windowheight-1-displayheight/2,1) --initial y
其中windowwidth、windowheight分别是【演示】窗口当前的宽度与高度。displaywidth、displayheight分别是设计图标占据的显示区域的宽度和高度。因此表达式displaywidth/2和displayheight/2分别计算出能够保证几何图形得以完全显示的最小横坐标与纵坐标,表达式windowwidth-1-displaywidth/2和windowheight-1-displayheight/2分别计算出能够保证几何图形得以完全显示的最大横坐标与纵坐标。再通过函数random()在上述坐标范围内产生一个随机坐标之后,程序每次执行到该设计图标时,几何图形所处的位置均不相同,同时无论【演示】窗口的大小如何改变,几何图形总是显示在【演示】窗口的内部(绝不会超出【演示】窗口的范围)。
chapter03文件夹下的范例程序random.a7p演示了如何实现这一过程。
图3-29 随机定位显示对象
另一个比较典型的例子是使用变量控制【等待】设计图标暂停的时间,如图3-30所示,在【等待】设计图标属性检查器中的【timelimit】文本框中输入变量icontitle,以后就可以在设计窗口中直接修改【等待】设计图标的暂停时间——不必反复打开设计图标属性检查器,只需修改设计图标的名称即可,这一措施可以大大提高设计效率。图3-30中所示的【等待】设计图标其暂停时间已经被设置为2秒,如果在【timelimit】文本框中使用自定义变量,在程序运行期间就可以根据具体情况,对变量赋予不同的数值,灵活控制程序暂停的时间。
图3-30 利用变量设置暂停时间
第三种典型的应用是使用表达式控制设计图标链接的外部多媒体文件。例如在制作多媒体程序时,设计人员总是希望能够使【演示】窗口占据整个屏幕,除了将【演示】窗口设置为use full screen,还需要根据屏幕分辨率选择不同分辨率的背景图像。假设程序文件所在的文件夹中有一系列不同分辨率的图像,从a12801024.jpg到a640480.jpg,分别用于5种常用的屏幕分辨率(1 280×1 024、1 152×864、1 024×768、800×600和640×480),利用以下条件语句可以实现根据屏幕分辨率选择图像文件的功能:
if screenwidth=1280&screenheight=1024 then filename:= "a12801024 "
else if screenwidth=1152&screenheight=864 then filename:= "a1152864"
else if screenwidth=1024&screenheight=768 then filename:= "a1024768"
else if screenwidth=800&screenheight=600 then filename:= "a800600"
else filename:= "a640480"
end if
然后在图像对象的【file】属性中输入表达式=filelocation^filename^".jpg"就可以达到目的了。但是这并不是一种好的解决办法,原因有两个:一是程序中可能有许多图像对象需要根据屏幕分辨率选择不同的图像文件(包括同一设计图标中的多个图像对象),如果为每个图像对象都创建一个变量,会使代码维护工作量大为增加。二是上述代码无法输入到图像对象属性对话框的【file】文本框中,必须为每个图像对象都创建一个【运算】设计图标容纳这些代码,这同样增加了代码维护工作量,同时也造成了代码和数据不恰当地分离。
实际上,上述代码应该和图像对象捆绑在一起,只要将它们由多行转换为一行,就可以保存在图像对象的【file】属性之中。利用test函数可以实现这种转换要求,只需在【file】文本框内输入(如图3-31所示)。
图3-31 由图像对象选择不同的图像文件
=filelocation^"a"^test(screenwidth=1280&screenheight=1024, "12801024", ﹁
test(screenwidth=1152&screenheight=864, "1152864", ﹁
test(screenwidth=1024&screenheight=768, "1024768", ﹁
test(screenwidth=800&screenheight=600, "800600", "640480"))))^".jpg"
【file】文本框最大可以容纳长达255个字符的表达式(路径的最大长度可达410个字符),因此保存这一行代码不会遇到任何问题。
chapter03文件夹中提供了与本例对应的范例程序dynamicbackground.a7p和图像文件。另外,在光盘的/materials/image/background文件夹内,提供了从a到f共6个系列的背景图像。
分离字符"a"的目的是便于在不同的图像系列之间进行切换,只要在【file】文本框中将字符"a"替换为字符"c",就可以使用c系列的背景图像,按照同样的命名规则,读者可以制作应用于更多屏幕分辨率的图像。只要为各种可能的屏幕分辨率都准备了专用的图像文件,就可以将【file】文本框中的表达式简化为:
=filelocation^"a"^screenwidth^screenheight^".jpg"
不是所有对象的属性都可以通过表达式进行控制,图像对象就是一个例子。人们一直期望能够通过表达式控制图像对象的缩放比例,但即使在authorware 7.0中,图像对象的【size】和【scale】属性仍然不能使用表达式进行控制。本例实际上提供了对于图像缩放问题的解决方法:由图像对象自己选择不同大小的图像文件。
对于不同的设计图标,图标变量可以有不同的取值,因此在许多情况下,设计人员需要对特定的设计图标进行引用,以读取或设置相应图标变量的值。例如在一个【显示】设计图标“graphic”中包含一组显示对象,而在一个【数字化电影】设计图标“movie”中包含了一段数字化电影,如图3-32所示,此时(displayx@"graphic", displayy@"graphic")将返回“graphic”设计图标中显示对象的中心坐标,而(displayx@"movie", displayy@"movie")将返回“movie”设计图标中数字化电影的中心坐标。
图3-32 引用设计图标
通常是利用引用符号"@"和设计图标的名称来完成对特定设计图标的引用,因此,以该方式被引用的设计图标其名称在整个程序中必须是惟一的,否则将导致错误出现。
如果通过设计图标名称建立了图标变量与设计图标之间的引用关系,则在程序设计期间,authorware始终监视着被引用的设计图标,一旦其名称被改动,authorware立即将新的名称更新到所有的引用表达式之中,程序设计人员不必对此存在额外的担心。如果删除了存在引用关系的设计图标,则在所有的引用表达式中该设计图标的名称将自动被“deletedicon”所代替,以指出这是一个无效的引用。
如果想阻止上述自动更新操作,可以将设计图标的标题包围在一对括号之内,例如表达式displayx@("graphic"),这时无论是删除“graphic”设计图标还是对其进行重命名,都无法影响该表达式。这一功能主要用于在不同程序文件之间复制设计图标和程序代码时保持固定的引用关系。
在引用设计图标时,可以使用变量或表达式代替设计图标的标题,程序语句
result:=displayx@"graphic"
和下面的程序语句是等效的:
title:= "图形"
result:= displayx@title
或者
id:=iconid@"图形"
result:= displayx@id
如果图标变量引用的是自身所在的设计图标(这种情况在图标变量嵌入到文本对象中或在附属【运算】设计图标内使用时经常出现),此时就可以省略引用符号和设计图标的名称(请参阅图3-9)。
新闻热点
疑难解答