三、片头动画的交互设计
常用的片头动画类型一般有两种:利用3D MAX等软件制作的三维动画以及利用Flash软件制作的Flash动画。在这里,我们讲解Authorware 7.0中实现Flash片头动画的交互控制。
1.导入Flash片头动画
单击“Insert(插入)→Media(多媒体)→Flash Movie…(Flash影片)”菜单命令,在打开的“Flash Asset Properties(Flash道具)”对话框中导入即可。为了加快Flash动画的运行速度,减少内存占用,在该对话框中可以选中Flash动画属性的“Direct to Screen(直接返回屏幕)”选项。这里把插入流程线中的Flash动画图标命名为“Flash动画”。
2.Flash动画交互控制设计
作为多媒体教学光盘系统的片头动画,我们需要实现这样的操作控制:在片头动画的播放过程中,允许用户直接通过单击鼠标左键,跳过Flash片头动画的播放而直接进入光盘程序的主流程界面;若用户不执行任何操作,则Flash片头动画播放完毕后自动进入执行光盘程序的主流程。
在片头流程线图中,在“Flash动画”图标后添加一个决策图标“判断”,同时在决策图标右边添加一空内容的群组图标。按下Ctrl+I组合键打开决策图标“判断”的属性面板,设置决策图标“Repeat(重复)”的属性为Until True直到条件为真,“Branch(分枝)”属性为Sequentially顺序执行,并设置其判断条件为:
~GetSpriteProperty(@"Flash动画", #playing)|MouseDown
这样,无论是在用户单击鼠标左键“干预”的情况,还是自动播放完毕都将自动进入程序主流程。在进入程序主流程之前,我们必须利用“擦除”图标清除不再起作用的Flash片头动画,并放置一个等待图标,让程序暂停0.5秒达到和谐的过渡效果,之后才进入光盘的主流程界面执行其他程序内容。最后的参考流程如图5所示。
四、光盘背景音乐的交互设计
多媒体教学光盘一般都需要背景音乐及内容解说,内容解说一般多以预先录制的WAV等格式的声音文件,在Authorware 7.0中只要使用声音图标导入,并利用MediaPause、MediaPlay、MediaSeek等系统函数即可轻松控制。因此我们不做详细介绍,这里我们更加关心的是整个光盘背景音乐的交互控制设计。
光盘背景音乐主题常常与光盘教学内容主题相关,让用户更加专心融入光盘的主题内容上。为了防止与内容解说产生格式冲突,一般选取MIDI作为背景音乐,下面我们以MIDI作为背景音乐,讲解其在多媒体教学光盘中的交互控制设计思路。
背景音乐的交互控制包括对背景音乐的随机选曲播放、停止等功能;另外当光盘程序处于非活动状态时,还应该暂停背景音乐的播放,当再次进入活动状态时则重新播放背景音乐。
对于MIDI背景音乐进行播放、停止的控制方法也许读者早有所闻,利用Authorware的外部扩展函数即可实现。但是对于上述的另外一个功能,读者听了肯定“不知所以然”,其实利用API函数也是一件容易实现的事情,且看图6所示的程序流程图,它即可实现上述所说的背景MIDI音乐控制功能,一起来剖析一下其设计过程。
首先讲述Authorware外部扩展函数库MidiLoop.u32与budapi.u32。MidiLoop.u32是一个循环播放MIDI音乐的外部扩展函数库,它虽然只封装了两个函数:LoopMidi、StopMidi,但是对于常规背景音乐的控制却已经足够了。budapi.u32则是一个功能强大的API扩展函数库,其封装的API函数种类繁多,在Authorware中只要灵活运用它们,常常可以实现不可思议的功能。
1.MIDI背景音乐的播放
如图6所示的程序流程,在计算图标“播放音乐”中我们利用LoopMidi函数进行MIDI音乐的播放,但是为了充分考虑用户机器的不同配置情况,因此必须首先利用budapi.u32的baSoundCard函数判断用户机器是否已经安装了声卡,如果已经安装则执行背景音乐播放,否则不允许播放任何背景音乐操作。“播放音乐”的程序代码如下:
--//如果安装了声卡则播放音乐
if baSoundCard() then
midi:=1 Test(midi,LoopMidi(FileLocation^"music\\music_"^Random(1, 5, 1)^".mid"),StopMidi())
end if
上述代码中自定义变量midi是作为Test系统函数的判断参考变量。Test系统函数的语法为:
Test(condition, true expression, false expression)
因此,当条件变量midi=1时执行Test函数的条件真分支;当midi=0时则执行Test函数的条件假分支。而系统函数Random则是作为随机取值,并由此处理产生一随机MIDI文件名然后进行播放。
2.MIDI背景音乐的交互控制
背景音乐的交互控制是通过交互响应来实现的。在光盘程序的执行过程,用户始终可以通过按钮控制MIDI音乐的播放与停止。如图6所示,在计算图标“播放音乐”后添加一交互图标并命名为“音乐控制”,接着在交互图标右边添加三个计算分支。
设置“停止/播放”分支为按钮响应交互,其功能是实现对MIDI背景音乐的停止与播放。在整个光盘程序执行过程中它都是有效的,因此必须设置其为永久按钮,即选择“Perpetual”属性选项,同时设置“Active If”条件为:baSoundCard(),即检测到用户没有安装声卡的情况下该按钮及响应分支无效。计算图标“停止/播放”的程序代码如 midi:=~midi Test(midi,LoopMidi(FileLocation^"music\\music_"^Random(1, 5, 1)^".mid"),StopMidi())
交互图标“音乐控制”的另外两个永久条件响应分支是处理光盘程序窗口在活动与非活动状态下的MIDI背景音乐控制问题。这里会涉及到一个难题:如何判断光盘程序窗口的活动状态变化呢?单靠Authorware 7.0的系统变量函数是无法实现的,因此我们借助了强大budapi.u32的一个API函数baActiveWindow,并结合Authorware方便的条件交互判断来实现。
当光盘程序窗口处于非活动状态时,根据Windows系统的窗口消息机制,此时的活动窗口句柄值一定不等于Authorware的句柄变量WindowHandle,因此只要在光盘程序运行期间时时地检测当前活动窗口的句柄值,并与Authorware本身的句柄变量WindowHandle做比较,即可判断当前光盘程序处于活动还是非活动状态。此时又出现一个问题:如何让Authorware程序实时进行条件分支判断?这里有一个小技巧,那就是利用系统变量Sec,因为Sec变量本身就是一个时时变化的变量,正是它的时时变化性迫使程序不断地检测条件的变化情况,从而响应相应的分支。
当光盘程序窗口由活动状态切换到非活动状态时,此时需要停止MIDI背景音乐的播放,其响应判断条件是:baActiveWindow()+Sec<>WindowHandle+Sec,其执行代码如下: if baSoundCard() then
midi:=0
StopMidi()
end if
当光盘程序窗口再次从非活动状态切换到活动状态时,此时需要重新播放MIDI背景音乐,其响应判断条件是:baActiveWindow()+Sec=WindowHandle+Sec,其执行代码如下: if baSoundCard() then
midi:=~midi
Test(midi,LoopMidi(FileLocation^"music\\music_"^Random(1, 5, 1)^".mid"),StopMidi())
end if
最后需要提醒的是,需要预览上述的程序窗口切换过程对背景音乐的影响,必须打包程序然后执行才能预览到效果,因为它使用了API窗口函数,而某些API函数在Authorware文件编辑状态下是不起任何作用的,必须打包后才有效。
五、光盘内容的导航设计
一个完整的多媒体教学光盘往往内容繁多,因此必须设计一个合理的教学内容导航,否则用户学习操作起来会比较麻烦。
1.主文件与各章节之间的导航设计
在光盘结构规划中我们讲述了《电子技术基础》多媒体教学光盘章节内容的栏目划分,因此,在流程设计中,我们必须为这些栏目设计导航,图7所示即为主程序光盘内容导航的一个典型设计流程图。我们通过Authorware 7.0的导航图标,为各章节内容设置交互导航,这样的流程设计使整个主程序流程结构清晰,可读性强。《电子技术基础》多媒体教学光盘的文件结构是主—分结构,即主文件调用各章节模块文件的方式,因此在主文件的章节内容中实际存放的是一个起链接桥梁作用的调用脚本,而具体的教学内容则放在各章节的模块文件内,以下即为某章节的调用参考代码,通过系统函数JumpFileReturn调用执行第一章的程序模块文件Part1.exe。
JumpFileReturn(FileLocation^"Part"^"\\Part1.exe")
2.各章节的内容导航设计
一般根据光盘教学内容,各章节栏目下还细分具体小节内容,这部分如何实现导航呢?如果依然按照主界面的排列按钮导航方式,必定会占用栏目界面的空间,而各章节栏目的界面应该把更多的地方留给教学内容的演示,因此这里我们采用弹出菜单来实现章节各小节内容的导航。
首先,我们介绍Authorware外部扩展函数库tMsControls.u32,这是一个专门创建Windows标准弹出菜单的外部扩展函数库,其弹出菜单效果如图8所示。下面我们看看具体的流程设计。
(1)创建弹出菜单
在弹出菜单的过程中,首先利用tMsControls.u32的tMsCreatePopupList函数创建弹出菜单,创建完毕后会返回一句柄值并保存在自定义变量popupHandle中,此句柄即可代表弹出菜单本身,是一个重要参数。
创建完毕后接着就是添加具体菜单项内容,参考代码如下:
--//创建弹出菜单,并返回其标识句柄
popupHandle:=tMsCreatePopupList(WindowHandle)
--//设置一级菜单内容
tMsAddItem(popupHandle, 1, 0, "《电子技术基础》多媒体课件")
tMsAddItem(popupHandle, 2, 0, "-")
tMsAddItem(popupHandle, 3, 0, "第一章 半导体二应用")
tMsAddItem(popupHandle, 4, 0, "-")
tMsAddItem(popupHandle, 5, 0, "第1节 半导体二极管")
tMsAddItem(popupHandle, 6, 0, "第2节 特殊二极管")
tMsAddItem(popupHandle, 7, 0, "第3节 整流滤波电路")
tMsAddItem(popupHandle, 8, 0, "-")
--//设置第1节的二级菜单内容
tMsAddItem(popupHandle, 5, 1, "(1) 半导体的基础知识")
tMsAddItem(popupHandle, 5, 2, "(2) 二极管的单向导电性")
tMsAddItem(popupHandle, 5, 3, "(3) 二极管的伏安特性")
tMsAddItem(popupHandle, 5, 4, "(4) 二极管的重要结论")
(2)菜单交互导航设计
菜单建立完毕后,此时菜单是不可见的,当需要时让菜单弹出即可。我们把弹出菜单的操作以及相关菜单项的选择交互设计在一个按钮响应交互分支中,如图8所示,单击“内容选择”按钮即可弹出内容导航菜单,需要时弹出,不需要则自动隐藏消失。其参考代码如下:
--//弹出显示菜单
result:=tMsDisplayControl(popupHandle,380,CursorY-132,150, 100,1)
--//根据用户选择菜单跳转显示相关小节内容
if result="第1节 半导体二极管:(1) 半导体的基础知识" then GoTo(IconID@ChildNumToID(@"第一章内容",1,0))
if result="第1节 半导体二极管:(2) 二极管的单向导电性" then GoTo(IconID@ChildNumToID(@"第一章内容",2,0))
if result="第1节 半导体二极管:(3) 二极管的伏安特性" then GoTo(IconID@ChildNumToID(@"第一章内容",3,0))
if result="第1节 半导体二极管:(4) 二极管的重要结论" then GoTo(IconID@ChildNumToID(@"第一章内容",4,0))
if result="第2节 特殊二极管" then GoTo(IconID@ChildNumToID(@"第一章内容",5,0))
if result="第3节 整流滤波电路" then GoTo(IconID@ChildNumToID(@"第一章内容",6,0))
在上述代码中,自定义变量result用于保存用户选择的菜单项对应的菜单标题;另外各小节的具体内容是存放于框架图标下的,因此根据result值的判断,利用系统函数GoTo即可进入对应的小节进行内容演示与学习。最后的菜单导航参考流程如图9所示。 |