0

我已经制作了一个 AS3 代码作为一个函数。但我认为我的代码太长了。你能帮忙改进吗?谢谢!

我首先创建了 test.fla,并在舞台上添加了 5 个灰色块(来自 PSD 的外部图片)。我的功能是将鼠标悬停在相应的灰色块上时显示不同的图片。

我将这 5 个灰色块转换为影片剪辑,并将实例名称设置为 sp1、sp2、sp3、sp4 和 sp5。然后我创建了一个文档类 test.as 并设置了 5 个 EventListener。

sp1.addEventListener(MouseEvent.MOUSE_OVER,clickmouse1);
sp2.addEventListener(MouseEvent.MOUSE_OVER,clickmouse2);
sp3.addEventListener(MouseEvent.MOUSE_OVER,clickmouse3);
sp4.addEventListener(MouseEvent.MOUSE_OVER,clickmouse4);
sp5.addEventListener(MouseEvent.MOUSE_OVER,clickmouse5);

所以我的第一个问题是我有什么方法可以将这 5 个 EventListener 组合成一个吗?因为在我看来,这么多的 EventListener 将花费更多的 PC 资源。

我的第二个问题是我将 5 张目标图片设置为 5 类。

在 test.as 我创建了下面的代码:

public class EuroCup extends Sprite{
    var arr:Array=new Array();
    var Res1:Result609=new Result609();
    var Res2:Result610=new Result610();
    var Res3:Result611=new Result611();
    var Res4:Result612=new Result612();
    var Res5:Result613=new Result613();
    var i:int=0;

    public function EuroCup() {
        arr[1]=Res1;
        arr[2]=Res2;
        arr[3]=Res3;
        arr[4]=Res4;
        arr[5]=Res5;
    }
}

我认为这太冗长了。有什么办法可以简化吗?这里是 test.fla 和 test.as:随便下载 ,谢谢你们!

4

4 回答 4

2

您可以/应该使用字典来关联灰色矩形和要显示的图像。

package {
  public class EuroCup {

    private var _children:Array, _current:Sprite, _map:Dictionary;

    public function EuroCup() {
      super();
      initialize();
    }

    protected function initialize():void {
      _children = [];
      _map = new Dictonary();

      // i don't know the image's symbol name.
      // _map[_children[_children.length] = new Result609()] = new SYMBOL_NAME();

      for each(var child:Sprite in _children) {
        child.addEventListener(MouseEvent.CLICK, click_handler);
      }
    }

    private function click_handler(event:MouseEvent):void
    {
      if (_current) {
        _current.visible = false; // or use fading, etc
      }

      _current = _map[event.currentTarget] as Sprite;

      if (_current) {
        _current.visible = true; // or use fading, etc
      }
    }
  }
}
于 2012-06-08T05:46:52.317 回答
2

重组:

public class EuroCup extends Sprite {
    private var arr:Array;

    public function EuroCup() {
        arr = [ new Result609(), new Result610(),
                new Result611(), new Result612(), new Result613()
              ];
    }
}

然后将结果用作 arr[0]、arr[1] 等。此外,如果您有多个 sprite 来监听点击,并且具有类似的侦听器,您可以将所有这些 sprite 连接到单个侦听器并使用 event.target 来区分它们,其中 event 是 MouseEvent。或者将它们放入容器并为该容器创建一个侦听器 - 再次, event.target 将告诉单击了哪个精灵。
然而有两件事 - 每次你看到new Array(),替换它[]- 它更快更短。并将所有代码放入构造函数,而不是类体 - 它将被编译以更快地执行。

于 2012-06-08T05:04:58.273 回答
0

我会选择更简单的版本;仅添加一个事件侦听器并使用Event.targetswitch 语句确定单击了哪个项目。

如果按钮应该做不同的事情,这很有帮助。

package  
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Test extends Sprite
    {
        public var sp1:Sprite;
        public var sp2:Sprite;
        public var sp3:Sprite;

        public function Test()
        {  
            this.addEventListener(MouseEvent.MOUSE_OVER, handleClick);
        }

        private function handleClick(event:MouseEvent):void
        {
            trace("Clicked on: " + event.target)
            switch (event.target)
            {
                case this.sp1:
                {
                    // do something here
                    break;
                }
                case this.sp2:
                {
                    // do something here
                    break;
                }
                case this.sp3:
                {
                    // do something here
                    break;
                }
                default
                {
                    trace("No handler defined for: " + event.target)
                }
            }   
        }
    }
}

但是,您也可以巧妙地使用它的类型。假设所有按钮都扩展了一个名为 的自定义类CustomButton,并且它们都需要执行相同的操作(例如调用函数),但是使用基于其 id 的参数。

如果按钮基本上应该做同样的事情,这很有帮助。

package  
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Test extends Sprite
    {
        public function Test()
        {  
            this.addEventListener(MouseEvent.MOUSE_OVER, handleClick);
        }

        private function handleClick(event:MouseEvent):void
        {
            if (event.target is CustomButton)
            {
                var button:CustomButton = event.target as CustomButton; // you're now sure it's a CustomButton
                this.showById(button.id); // let's say CustomButton has a public var 'id'
            }
        }

        private function showById(id:int):void
        {
            // do something
        }
    }
}

希望有帮助。

提示:始终以大写字母开头您的类+文件名。变量以大写字母开头。这在动作脚本世界中很常见。

于 2012-06-12T09:14:12.223 回答
0

简化代码的一种选择是使用Dictionarysp按身份将和Res实例相互关联。这使您可以避免跟踪数组索引的工作,这是您拥有单独的事件处理程序方法的一半原因。一旦实例通过身份关联,您就可以使用已调度事件的currentTarget属性来确定您希望在舞台上显示 Dictionary 中的哪个元素。

package  {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.utils.Dictionary;

public class test extends Sprite
{
    var dict:Dictionary = new Dictionary();
    var visibleResult:MovieClip;

    public function test()
    {
        dict[sp1]=new Result609();
        dict[sp2]=new Result610();
        dict[sp3]=new Result611();
        dict[sp4]=new Result612();
        dict[sp5]=new Result613();

        sp1.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
        sp2.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
        sp3.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
        sp4.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
        sp5.addEventListener(MouseEvent.MOUSE_OVER,clickmouse);
    }

    private function clickmouse(evt:MouseEvent):void
    {
        if(visibleResult)
        {
            removeChild(visibleResult);
        }
        var Res:MovieClip = dict[evt.currentTarget] as MovieClip;
        addChild(Res);
        Res.x=300;
        Res.y=400;
        visibleResult=Res;
    }
}
}

如果您希望应用程序中有超过 5 个sp实例,那么您可以使用循环来分配事件侦听器。但是对于少于 10 个实例,您可能不会从循环中获得太多收益。

于 2012-06-08T05:08:25.290 回答