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 を組み合わせて 1 つにする方法はありますか? 私の考えでは、非常に多くの EventListener を使用すると、PC のリソースが大幅に消費されます。

2 番目の質問は、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] などとして使用します。また、クリックをリッスンする複数のスプライトがあり、同様のリスナーがある場合は、そのようなすべてのスプライトを単一のリスナーに接続し、event.target を使用してそれらを区別できます。ここで、event は MouseEvent です。または、それらをコンテナーに配置し、そのコンテナーに 1 つのリスナーを作成します。ここでも、event.target はどのスプライトがクリックされたかを通知します。
それでも 2 つのこと - が表示されるたびnew Array()に に置き換えてください[]- より速く、より短いです。そして、すべてのコードをクラス本体ではなくコンストラクターに配置します - より高速に実行されるようにコンパイルされます。

于 2012-06-08T05:04:58.273 に答える
0

コードを簡素化するための 1 つのオプションは、 Dictionaryspを使用して、とResインスタンスを ID で関連付けることです。これにより、配列インデックスを追跡する作業を回避できます。これは、個別のイベント ハンドラー メソッドを使用する理由の半分です。インスタンスが ID によって関連付けられると、ディスパッチされたイベントのcurrentTargetプロパティを使用して、ディクショナリ内のどの要素をステージに表示するかを決定できます。

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 に答える