Как передать переменные в функцию, вызываемую ENTER_FRAME, без переопределения

ОБНОВЛЕНО

У меня есть большой загроможденный код, который я хочу ускорить, создав экземпляр класса CubeEaseOut один раз. Делаю это через фф:

var myClass = new CubeEaseOut()

myClip.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
myClip2.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
myClip3.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);

function onMouseOver(e:Event){
    //made changes here
    myClass.initializer(e.currentTarget, ["scaleX",1.5,"height",200]); 
}

Поэтому всякий раз, когда я перемещаю мышь на любой из этих клипов, вызывается функция с именем initializer() внутри класса CubeEaseOut.

Внутри класса CubeEaseOut у меня есть код, который один раз запускает ENTER_FRAME, а затем периодически вызывает функцию animateThis().

package;

import goes here...

class CubeEaseOut extends Sprite {

    var here...

    public function new(){
        super();
        addEventListener(Event.ENTER_FRAME, animateThis);
    }

    public function initializer(mc:Dynamic, vars:Array<Dynamic>()){

        vars[1] //this is a Float with value 1.5
        mc[vars[0]] //is mc.scaleX

        //some other code
        //notice many variables received here are needed by other functions
        //but if I make this public, or placed outside functions, every call
        //on this function will overwrite previous values

        //other variables here

        var sp:Float = (vars[1] - mc[vars[0]])/50
    }
    private function animateThis(e:Event){
            //some other code
            //many variables from initialize() function is needed here

            iter++
            mc[vars[1]] += sp*iter

    }

}

Дело в том, что для работы animateThis() нужны переменные из initializer(). Как передать переменные из initializer() в animateThis(), чтобы следующий вызов initializer() не переопределял предыдущие переменные?

Попытки:

  1. Я пытался использовать Global vars, но это все портит.
  2. Поместите ENTER_FRAME внутрь функции initializer(), но окажется, что ENTER_FRAME будет называться my times - интенсивное использование процессора.
  3. Создано несколько экземпляров класса - также интенсивно использующих ЦП.
  4. Пытался использовать this.aVar, aVar переопределяется следующим вызовом.

Дополнительная информация:

Полный код, который я делаю, похож на этот

Код анимации не запускается, когда мышь находится вне клипа 1, но находится внутри клипа 2

но сейчас я реализую класс и ENTER_FRAME.


person Jones G    schedule 25.08.2015    source источник
comment
да, я буду, я завершаю портирование моего кода, используя ваши предложения. Я вернусь, как только будут результаты.   -  person Jones G    schedule 25.08.2015
comment
Пользователи @GurtejSingh, которые задают вопрос, уведомляются о полученных ответах. Нам не нужно спамить сайт, посмотрите мой ответ! Комментарии.   -  person null    schedule 25.08.2015
comment
@null Прости за это! Я просто следил за тем, чтобы пользователи видели ответ, который я опубликовал. Будет осторожно двигаться вперед. Извинения.   -  person Gurtej Singh    schedule 25.08.2015


Ответы (1)


Обновленный код ниже. Насколько я понимаю, вы хотите использовать один и тот же класс CubeEaseOut для управления несколькими анимациями. Что я пробовал (не тестировал), так это создать массив объектов данных, передаваемых этому классу. В каждом объекте я сохраняю переданный мувиклип и данные, переданные для каждого мувиклипа. Каждый раз, когда вызывается инициализатор, он проверяет, существуют ли уже данные для этого фрагмента ролика в массиве. Если это не так, он добавляет клип и его данные в массив. Если он находит фрагмент ролика, он просто назначает объект текущим анимационным объектом из массива и не перезаписывает его данные. Обратите внимание, что это может привести к тому, что анимация будет запускаться только для одного фрагмента ролика за раз.

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

import goes here...

class CubeEaseOut extends Sprite {

    private var objectsToAnimate:Array = new Array(); 
    private var currentMcData:Object;    

    public function new(){
        super();
        addEventListener(Event.ENTER_FRAME, animateThis);
    }

    public function initializer(mc:Dynamic, vars:Array<Dynamic>()){
        for (var i:uint = 0; i < objectsToAnimate.length; i++)
        {
              if (objectsToAnimate[i].movieClip != mc)
              {
                   var dataObj:Object = new Object(); 
                   dataObj.movieClip = mc; 
                   dataObj.dataVars = vars; 
                   objectsToAnimate.push(dataObj);
              }
              else if (objectsToAnimate[i].movieClip == mc)
                   this.currentMcData = objectsToAnimate[i];
        }
    }
    private function animateThis(e:Event){
            //codes here
            trace(this.currentMcData.vars);
            // or run a loop and animate all the movie clips.
    }

}

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

person Gurtej Singh    schedule 25.08.2015
comment
Выполненное тестирование с использованием this.aVar не работает в моем коде. Хотя this.aVar была получена функцией, она переопределяется после активации немедленного вызова функции initializer(), я должен передать ее, как локальную переменную для двух функций (?) - person Jones G; 26.08.2015
comment
Прежде всего, спасибо за голосование. Во-вторых, позвольте мне лучше понять вашу потребность. Вы хотите, чтобы эта переменная обновлялась только один раз? Некоторые дополнительные детали, безусловно, могут помочь мне обновить мой ответ. Спасибо. - person Gurtej Singh; 26.08.2015
comment
У меня есть около 10 переменных, к которым animateThis() должен получить доступ из initializer(). Некоторые либо обновляются, а другие статичны. Я думаю, может быть, я мог бы передать событие ENTER_FRAME в initializer(), а затем передать ему аргумент. Но я столкнулся с двумя проблемами (1) я не могу передать аргументы, как это было из setInterval(), и (2) я не мог установить int identifier для каждого addEventListener, который был запущен. - person Jones G; 26.08.2015
comment
@DominicGuana Статические переменные могут быть определены внутри самого вашего класса, и вы можете инициализировать их в самом CubeEaseOut, и они никогда не изменятся. Однако мне неясны те, которые вы хотите обновить. Когда вам нужно их обновить? Если вы хотите сделать это в методе инициализатора, то, поскольку этот метод вызывается при каждом наведении курсора мыши, он будет обновляться. И у вас есть только один экземпляр класса CubeEaseOut - person Gurtej Singh; 26.08.2015
comment
Я внес некоторые изменения в вышеизложенное сейчас. - person Jones G; 26.08.2015
comment
@DominicGuana Я обновил свой ответ. Пожалуйста, дайте мне знать, правильно ли я понимаю. Надеюсь, что это работает для вас! - person Gurtej Singh; 26.08.2015
comment
Я обновлю свой код и вернусь за результатами. - person Jones G; 26.08.2015
comment
Я получаю сообщение об ошибке, когда пытаюсь его скомпилировать: Невозможно сравнить динамический с неизвестным‹0›. - person Jones G; 31.08.2015
comment
@DominicGuana может быть проблемой приведения типов, не могли бы вы попробовать отладить ее с помощью точек останова и посмотреть? В какой строке вы получаете эту ошибку? - person Gurtej Singh; 31.08.2015