简单电路的元件设计与代码实现

      Flash课件设计 2008-11-13 11:28

  原本打算写一个 if 语句的简单例子,想起以前没完成的电路元件,拿出来应用一下。

场景中放三个元件:电源、灯泡(light_mc)、开关(switcher_mc),再画上一些边线。

灯泡和开关分别具有两种状态,用两帧来表示,第一帧“off”为断电的状态,第二帧“on”为加电的状态,利用空白关键帧设定好帧标签,并统一元件的尺寸,做成统一的宽度。然后进行代码的编写:

//初始属性的设定

switcher_mc.gotoAndStop("off");//断开开关
switcher_mc.isOnline = false;

light_mc.gotoAndStop("off");//关闭灯泡

switcher_mc.buttonMode = true;

//添加侦听,响应用户的操作

switcher_mc.addEventListener(MouseEvent.CLICK,onTurnON);
function onTurnON(evt:MouseEvent) {
 if ( switcher_mc.isOnline ) {// 根据开关的状态,进行相关操作
  light_mc.gotoAndStop("off");
  switcher_mc.gotoAndStop("off");
  switcher_mc.isOnline = false;
 } else {
  light_mc.gotoAndStop("on");
  switcher_mc.gotoAndStop("on");
  switcher_mc.isOnline = true;
 }
}

效果图:

应用扩展:如果电路上不止一组开关和灯泡呢?怎么来修改代码呢?

首先,灯泡需要与开关相关联,因为我们只对开关进行操作,所以对于每一个开关应该控制一个灯泡,换句话说就是一个开关拥有一个灯泡(属性对象)。

将前面的代码修改一下得到下面的代码:

var mc = switcher_mc;// 用变量来引用对象,简化代码。

mc.gotoAndStop("off");
mc.isOnline = false;

mc.linkLGT = light_mc;    // 对灯泡进行引用,代码中不再直接使用灯泡。
mc.linkLGT.gotoAndStop("off");

mc.buttonMode = true;

mc.addEventListener(MouseEvent.CLICK,onTurnON);
function onTurnON(evt:MouseEvent) {
 var mc = evt.target;   //   利用 evt.target 来表示发生事件的对象 switcher_mc,从而实现代码的通用性。
 if ( mc.isOnline ) {
  mc.linkLGT.gotoAndStop("off");
  mc.gotoAndStop("off");
  mc.isOnline = false;
 } else {
  mc.linkLGT.gotoAndStop("on");
  mc.gotoAndStop("on");
  mc.isOnline = true;
 }
}

接下来我们将灯泡的开关组进行复制粘贴,并排摆放3组,依次修改实例名为

switcher_mc1   light_mc1 

switcher_mc2   light_mc2

switcher_mc3   light_mc3

接下来使用 for 循环来一次性给三组元件添加控制代码,代码修改如下:

for (var i = 1; i<=3; i++) {
 var mc = this["switcher_mc"+i];    // 这样的用法似乎有些过时,但依旧有效,因为所有的元件位于同一层舞台上,this代表舞台。
 mc.gotoAndStop("off");
 mc.isOnline = false;
 
 mc.linkLGT = this["light_mc"+i];
 mc.linkLGT.gotoAndStop("off");
 
 mc.buttonMode = true;
 mc.addEventListener(MouseEvent.CLICK,onTurnON);
}
function onTurnON(evt:MouseEvent) {    //  侦听函数是通用的,所以一个就足够了,这是典型的一个函数负责处理多个事件的例子。
 var mc = evt.target;
 if ( mc.isOnline ) {
  mc.linkLGT.gotoAndStop("off");
  mc.gotoAndStop("off");
  mc.isOnline = false;
 } else {
  mc.linkLGT.gotoAndStop("on");
  mc.gotoAndStop("on");
  mc.isOnline = true;
 }
}
侦听函数如果写到 for 循环中去,实际上只是在不断的覆盖同一个函数,起作用的是最后一次循环定义的函数,所以放在循环体外面就可以了。侦听函数中不宜使用直接的对象引用比如 this["switcher_mc"+i] ,初学者经常容易出现这样的问题,因为函数通常并不是在定义它的时候就立即执行,等到执行该函数时,变量i 的值早已经变化了,所以会找不到对应的目标。

完成之后的效果如下:

回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}