李书有
本文介绍化学课件设计中的一种重要情形——实验仪器组装部分的设计理论和设计技术。文中的示例《氧气的实验室制法》模拟课件(效果如右图所示),以Flash 8.0作为创作工具,使用影片剪辑的相关方法,实现技术要求,达到适应开放式教学、给学生更多探究和分析空间,以实现以学生为主体的教学目标的设计目的。具体的效果及源文件,请到http://www.i-wing.com.cn/dispbbs.php?boardid=5&id=36page=1页面下载。
● 实验需求分析
要设计出仪器组装模拟课件,需要实现两方面的内容:一是设计组装实验装置所需要的相关元件。这些所需元件,都可以使用Flash的绘制工具进行绘制。需要注意的是,这些元件都需要设置为影片剪辑类型的元件,方便后面的程序控制。二是动作脚本方面。通过设计相应的动作脚本,实现如下方面的技术需求:①元件能够被拖动。此处使用影片剪辑对象的startDrag方法和stopDrage方法来实现。②元件能够进行接触测试,即实现将元件拖动到指定位置时,通过碰撞测试,确认元件是否被放到了指定的位置。③元件能够进行顺序测试,即判断拖动和释放的元件的顺序是否符合实验装置组装的一般顺序。④能够给出反馈提示。反馈提示包括当前拖动的元件是哪一个、释放的位置是不是正确、是不是按照正确的顺序进行组装等。
● 设计框架
一个实验仪器组装类的探究课件可分为三大块:元件区,组装区和提示区。
元件区:用于放置原始元件的区域,在放置错误后,元件会自动回到原始的位置。
组装区:用于放置组装正确的元件,并在此区域实现实验仪器的组装。
提示区:此区域主要放置一个动态文本框,用于显示出错后的文本内容。
● 核心技术
本课件的核心是通过接触测试,确认拖动的仪器是不是按照指定的顺序,放在了指定的位置。所以在设计中,重点要处理的就是这方面的技术。
仪器的拖动顺序:首先对每一个仪器元件附加一个thisindex属性,表示正确拖动的位置索引,从1开始,其后一直增加。接着定义一个全局变量_global.sx,确认当前应该摆放的仪器的序号,如果此序号与仪器的thisindex属性相同,则表示顺序正确,全局变量_global.sx加1,继续下一个仪器的摆放,直到全部完成。
仪器的拖动和接触测试:使用影片剪辑的startDrag方法进行拖动,使用影片剪辑的hitTest方法进行接触测试。这样就需要在正确的位置摆放与此相对应的元件,不过在没有检测到正确摆放之前,正确的元件透明度设置要比较低,基本无法看到。然后在元件摆放到正确的位置之后,设置拖动的元件消失,而正确的元件完全显示出来。这样就能够实现元件的拖动和碰撞测试效果。由于在使用过程中需要多次使用此段程序,所以用类的继承方法实现了一个继承自MovieClip类的方法hit,实现拖动、接触测试、文本提示等相应的效果。此方法有两个参数,参数mc表示要被接触到的真实仪器的实例名称,而txt表示提示文本框的实例名称。运用此方法时,先创建全局变量_global.sx,然后对要拖动的元件设置其thisindex属性(拖动正确顺序)和tip属性(表示仪器名称),最后执行hit方法,就能够实现效果了。具体代码及相应的说明如下所示。
MovieClip.prototype.hit = function(mc:MovieClip, txt:TextField) {//自定义一个hit类函数
this.tempx = this._x;//获得要移动的mc的初始坐标
this.tempy = this._y;
this.onPress = function() {
txt.text = this.tip;
this.startDrag();//按下鼠标,拖动mc
};
this.onRelease = function() {//释放鼠标
if (this.hitTest(mc)) {
if (_global.sx == Number(this.thisindex)) {
//如果接近要接触的mc,停止拖动,设置mc的坐标为接近的mc的坐标
this.stopDrag();
this._x = mc._x;
this._y = mc._y;
mc._alpha = 100;
this._alpha = 0;
_global.sx++
txt.text = "恭喜你,你的摆放正确,继续进行哦!";
} else {
this.stopDrag();
this._x = this.tempx;
this._y = this.tempy;
txt.text = "很遗憾,你的摆放顺序不正确,继续努力哦!";
}
} else {
//如果没有接近,停止拖动,回到原来的位置
this.stopDrag();
this._x = this.tempx;
this._y = this.tempy;
txt.text = "很遗憾,你的摆放位置不正确,继续努力哦!";
}
};
};
下面是对一个仪器的简单示例代码,其中m1为要拖动的铁架台元件的实例名称,m2为处于正确位置的隐形元件的实例名称,其他的与此相类,不再赘述。
_global.sx = 1;
m1.thisindex = 1;
m1.tip = "铁架台";
m1.hit(mc1, txt);