Как улучшить структуру кода AS3, чтобы сделать ее более эффективной?

Я сделал код 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 будет стоить гораздо больше ресурсов ПК.

Мой второй вопрос: я установил 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:Скачать Как бы то ни было, спасибо вам, ребята!


person Nick    schedule 08.06.2012    source источник
comment
Вы можете найти эту ветвь Stack Exchange полезной.   -  person Marty    schedule 08.06.2012


Ответы (4)


Реструктуризация:

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, чтобы различать их, где событием является MouseEvent. Или поместите их в контейнер и создайте один слушатель для этого контейнера — опять же, event.target сообщит, какой спрайт был нажат.
И еще две вещи — каждый раз, когда вы видите new Array(), заменяйте его на [] — так быстрее и короче. И поместите весь код в конструктор, а не в тело класса - он будет скомпилирован для более быстрого выполнения.

person alxx    schedule 08.06.2012

Вы можете/должны использовать словарь для ассоциаций между серыми прямоугольниками и отображаемыми изображениями.

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
      }
    }
  }
}
person Florian Salihovic    schedule 08.06.2012

Один из вариантов упрощения кода — связать экземпляры sp и Res друг с другом по идентификатору с помощью Словаря. Это позволяет вам избежать работы по отслеживанию индексов массива, что является половиной причины, по которой у вас есть отдельные методы обработчика событий. После того, как экземпляры связаны по идентификатору, вы можете использовать свойство 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 экземпляров вы, вероятно, мало что выиграете от цикла.

person Kevin Bray    schedule 08.06.2012

Я бы выбрал более простую версию; добавьте только один прослушиватель событий и используйте Event.target, чтобы определить, какой элемент нажат, используя оператор switch.

Это полезно, если кнопки должны выполнять разные функции.

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, и все они должны делать одно и то же (например, вызывать функцию), но с параметром, основанным на его идентификаторе.

Это полезно, если кнопки должны делать одно и то же.

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
        }
    }
}

Надеюсь, это поможет.

Совет. Всегда начинайте имя класса и файла с заглавной буквы. Переменные начинаются с заглавных букв. Это очень распространено в мире actionscript.

person Mark Knol    schedule 12.06.2012