实用Flash应用程序—打字练习 |
Flash的ActionScript给flash的功能增强提供了更大的空间,有了强大的编程功能作后盾,广大的Flasher终于可以振臂一挥,向世人说明:Flash不仅仅只是网络动画工具,出色的闪客一样可以用Flash做出实用的程序。 今天我们就一起来看看怎样用Flash制作打字练习的实用程序。 第1节、程序概述 在这篇教程的每一节,都会向程序中添加新的功能或特点,这样我们可以循序渐进地学习和讨论用到的技术,承前启后,保证你能完全理解整个进程,轻松掌握每一节内容。 编写的ActionScript需要完成下面这些事情: 让玩家对练习内容、练习时间及难易程度都有充分的控制权力; 第2节、预备知识 学会从外置的文本文件中引入变量: TypeTest的玩家总是一边不停的敲击键盘,一边参照原文内容。 原文从何而来呢?我们设原文是字符型变量。既然是变量,那么变量的保存方式应该有以下几种。 1.放在ActionScript中,并将其作为Flash电影的一部分。 从现在我们程序的目标而言,选用第二个方案有着不可比拟的优势: 原文的更新将会比ActionScript变量形似书写简单——只需要更改外置文本文件即可,而不需修改源代码,使玩家能够更新自己的练习库。又没有牵涉到数据库等一大堆复杂的内容。要被引用的文本文件的格式必须是 变量名= 这样的形式,如果一个文本文件中有多个变量必须用 & 符号分开。 例如:Variable1=typeTest&Variable2=12344Variables3=English text file . 记住,所有的变量都是字符型的变量,如果要用在数字运算中我建议使用函数 Number(Variables2). 该函数返回 Variables2 所代表的数字 12344 。导入变量应使用函数:loadVariablesNum()。例如: fileName="English.txt"; loadVariablesNum(fileName,level); 从文本文件 English.txt 中导入变量到 Flash电影的level层中, level 大于等于0的整型数据。我这里把数据都导入到第 0 层中。即 loadVariablesNum(fileName,0)。 Ok,预备知识到此结束,下面开始我们激动人心的程序吧! 效果如图1 所示 制作过程: 1.新增一个名为 typeSpaceMovie 的电影剪辑 2.在 typeSpaceMovie 新增一图层,添加两个文字区域 /:text1 和 /:text2 . 并设置他们的大小, 和字体,字符大小完全一样。 在变量名前加 /: 表示这是告诉Flash这个变量在主 TimeLine 中也是可用的,而不仅仅是typeSpaceMovie 电影剪辑中的局部变量。 第3节.制作练习场景 效果如图1 所示。实例(源文件)制作过程: 1.新增一个名为 typeSpaceMovie 的电影剪辑 2.在 typeSpaceMovie 新增一图层,添加两个文字区域 /:text1 和 /:text2 . 并设置他们的大小, 和字体,字符大小完全一样。 在变量名前加 /: 表示这是告诉Flash这个变量在主 TimeLine 中也是可用的,而不仅仅是typeSpaceMovie 电影剪辑中的局部变量。图1
3.设置text1属性为“动态文本区域,多行,自动换行”。设置 text2属性为“输入文本、多行、自动换行”。 4.回到主场景,引用电影剪辑 typeSpaceMovie 到主场景中, 并在text1中显示原文内容。 引用电影剪辑并将其显示到屏幕上可以使用 attachMovie 来完成这项任务。不过在引用之前,要正确的设置库。 选中库中的某个Symbol(元件),然后在库窗口的Options(选项)菜单中选择Linkage...(联接)。在 Symbol Linkage Properities (符号连接属性)对话框中选择 Export this Symbol (导出这个符号), 然后赋予它一个标志符。 这ActionScript 就能通过这个标着符访问这个被导出的元件了。例如 :我们把电影剪辑 typeSpaceMovie 的标志符 设为 typeSpaceM 再 通 过attachMovie("typeSpaceM","typeSpace",depth); 这条命令将符号 typeSpaceM复制到主场景上,命名为typeSpace,并给其设定一个深度值 depth(整数型变量)。 Flash必须为每一个电影剪辑分配一个深度值。当多个电影在屏幕上重叠时,具有最高深度值的电影剪辑将会显示在最上面。并且同个层只能有一个剪辑,如果尝试使用一个已存在的层次,新的电影剪辑将会取代原有的。 5.整理代码:主场景只有一各关键帧: attachMovie( "typeSpaceM","typeSpace",0 ); loadVariablesNum("English.txt",0); stop();3.6.预览结果,哈!在text1 文字区域显示了 English.txt中的变量, text2文字区域可以进行键盘输入了。到此,练习场景的制作学习完毕。 第4节、菜单选项和成绩判断 预览上一节的成果,好像太单调了点。现在我们将做出类似于 windows 应用程序那样的菜单选项,增添以下效果: 4.1 创建声音效果 4.1.1.从flash以外导入声音文件。 通过:文件/导入... ,打开你想要的声音文件,Flash5支持的格式有 .wav 和.mp3。导入后的 .wav 文件会被Flash压缩, 即变成mp3格式。导入后,这个声音文件的一份被压缩的拷贝将出现你的元件库里。 同样, 选取这个声音元件,联接它,为它设一个标志符,使其在 ActionScript 中可用。我们导入了两个声音: error.wav 和 type.wav. 4.1.2.创建声音对象并播放。必须创建声音对象方可使用。 error = new Sound() // 创建一个声音对象; 4.1.2 判断当前玩家输入是否正确; 在主场景中用以下代码判断每次输入是否正确: var tempText1=text1.charAt(Selection.getBeginIndex()-1); if(tempText1!=tempText2 && textLength!=text2.length) 这段代码有点复杂,但务必要理解,本程序的核心代码就在此了。函数 charAt的原型是 myString.charAt(index);返回字符串 myString中由 index参数 指定位置的字符。 如果index 不是一个 从0到字符串长度减 1的数,就返回字符串。 属性length: 原型String.length . 返回字符串String的长度。 Selection: 它是个对象,让你设置和控制当前焦点可编辑文本域。当前聚焦的可编辑文本域是指用户的鼠标目前选中的可编辑文本区域。一次只允许有一个当前焦点可编辑文本域。所以,Selection对象不用创建。 Selection.getBeginIndex():返回光标位置。 var:用于声明局部变量;这下初见端倪了吧。局部变量tempText2返回的是text2文本区域当前光标闪动位置的字符。tempText2返回的是文本区域text2相应位置上的字符。每当键盘输入一次,text2.length也会变化一次,我们在条件语句 if中添加代码 &&textLength!=text2.length 保证了只有键盘输入时才 判断tempText1和tempText2是否相等,达到了及时判断正误的效果。 友好的界面是程序重要的组成部分。我们预制了一个背景电影剪辑,两个菜单电影剪辑和一个typeSpace电影剪辑。
4.2.1 背景如图2所示。它主要的功能是作为下面两个电影剪辑menuE和 menuSettingE的背景。另外,还有一个按钮Exit,用于退出此程序。 on (release)
4.2.2 如上图3:按钮Setting : on (release) showType也是个全局变量,在程序主场景的第一帧就给其赋予初值。showType用于菜单menuE和菜单 menuSettingE之间的切换, 当按下并释放按钮Setting ,showType就等于"menuSetting". 当主场景侦测到这个变化,就立刻切换到菜单 menuSetting.同理,按钮Starttest响应的事件也只是为了切换到显示typeSpace的场景上。同时还设置其他一些全局变量。 on (release)
4.2.3 图 4显示了电影剪辑menuSettingE的效果。这里就是玩家设定练习时间和选择原文的场面。代码比较简单,就不一一作介绍了。
4.2.4 图5 显示typeSpace。这才是整个程序的核心。 在这个剪辑中,最重要的是提供了练习的场所和向玩家显示剩余时长。前面提到过函数 getTimer(); 他返回此Flash程序从开始到调用他所经历的时长。因此,在主场景第一帧就要调用一次,在开始练习时又不停的调用,直到二者的差值达到预先设定的时长。
4.2.5 图 6是本程序最后一个 电影剪辑 showScores;不言而喻,它用于在每次练习结束后返回成绩。 4.2.5.1.第一帧,用于初始化全局变量。 fscommand ("fullscreen", "true"); back = false; 4.2.5.2 第二帧到第三帧; 第2帧设一个标签“mainLoop": if(loadText==true) 4.2.5.3第3个循环段: 从第5帧到第6帧。 第5帧标签“typeLoop"; if (backToFram == true) 1.让原文文本向上卷动。 if(Key.isDown(Key.PGDN)) 2.排除SHIFT键码错误。 SHIFT用于大小写转换,但他也有自己的键码值。所以我们必须屏蔽掉SHIFT的返回值: if(Key.getCode() !=Key.SHIFT ) 3.判断何时结束一次练习,并进行成绩统计 if (tempTime-nowTimer>=(time*60000)) 4.让时间棒准确的显示剩余时长: _root.typeSpace.timeBar._width = (1-(tempTime- nowTimer)/(60000*time))*timeBarWidth; 第6帧,标签“typeEnd" gotoAndPlay("typeLoop"); 4.2.5.4 第4个循环段第8帧到第10帧. 第8帧 标签“loadNum" text1="load..."; 第9帧 标签“empty" 第10帧 标签“loadNumEnd" if(text1=="load...") 5.结束语 到此程序分析完毕。全部代码总共也只有100行左右。发布成的可执行文件大小也不过30k左右。让人想到了在可爱的dos时代,一张软盘行遍天下的历史。Flash编程的特点就是要兼顾帧和层的概念,控制好帧的移动,就控制了程序的走向;掌握了“层”就是掌握了Flash动画技术的精髓。 |