Петля активируется при движении мыши - PullRequest
0 голосов
/ 17 марта 2011

Я просто собираюсь объяснить контекст, чтобы он был понятнее.

Я сделал это меню: Мое меню

Я ищу, чтобы улучшить иболее продвинутая версия того же меню.

Я сделал анимацию волн на поверхности кофе и ищу, чтобы она зациклилась, когда мышь двигалась, и перестала зацикливаться, когда она не движется.Извините за отсутствие спецификаций, так как я совсем новичок в ActionScript, но я надеюсь, что кто-нибудь сможет мне помочь.:)

Спасибо, Матье

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Ну, вы это сказали - используйте MouseEvent.MOUSE_MOVE, чтобы установить условие в вашей циклической процедуре.

    private var _isMoving:Boolean = false;

    stage.addEventListener(MouseEvent.MOUSE_MOVE, checkMouse);
    this.addEventListener(Event.ENTER_FRAME, doLoop);

    private function checkMouse(e:MouseEvent):void 
    {
        _isMoving = true;
    }
    private function doLoop(e:Event):void 
    {
        trace("moving =" + _isMoving);

         if(_isMoving)
         {
           // loop animation
         }

        _isMoving = false;
    }
0 голосов
/ 18 марта 2011

в зависимости от того, как вы хотите, чтобы это работало, я сделал бы это следующим образом:

  1. создать анимацию волнистого кофе
  2. обеспечить анимацию циклов
    • обратите внимание, что клип по умолчанию зацикливается, поэтому все, что вам нужно сделать, это сопоставить первый и последний кадры!
  3. поместите клип на край вашей текущей кофейной графики
    • двойной щелчок по графику для его редактирования
    • перетащите экземпляр цикличной анимации из библиотеки на «край» графика
    • ИЛИ просто замените всю свою светло-коричневую графику на анимированную, которая зацикливается
  4. когда мышь движется, вызовите воспроизведение на анимированном цикле клипа
  5. когда мышь останавливается, вызовите остановку на анимированном цикле

Пример кода будет выглядеть следующим образом:

    public function init():void {
        menuClip.addEventListener(MouseEvent.MOUSE_OVER, onMenuRollOver);
        menuClip.addEventListener(MouseEvent.MOUSE_OUT, onMenuRollOut);
    }

    public function onMenuRollOver(event:MouseEvent):void {
        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
        /* do the stuff you're currently doing to animate the clip here.
        something like: coffee graphic height = ease to mouseHeight */

    }

    public function onMenuRollOut(event:MouseEvent):void {
        /* do the stuff you're currently doing to stop the clip here. */
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
        coffeeClip.stop();
    }

    public function onMove(event:MouseEvent):void {
        resetTimer();
        coffeeClip.play(); //note: play has no effect when movie is playing (that's ideal in this case)
    }

    public function resetTimer():void {
        if(mouseMovementTimer == null) createTimer();
        mouseMovementTimer.reset();
        mouseMovementTimer.start();
    }

    public function createTimer():Timer {
        mouseMovementTimer = new Timer(DELAY, 1); //fiddle with the delay variable. Try 500, at first
        mouseMovementTimer.addEventListener(TimerEvent.TIMER, stopAnimationLoop);
    }

    public function stopAnimationLoop(event:TimerEvent):void {
        mouseMovementTimer.removeEventListener(TimerEvent.TIMER, stopAnimationLoop); //optional but recommended
        mouseMovementTimer = null;
        coffeClip.stop();
    }

Конечно, вам необходимо выполнить такие действия, как вызов init(), импорт flash.utils.Timer и инициализация переменных, таких как mouseMovementTimer, menuClip, coffeeClip и DELAY.

Предупреждение. Этот код находится на моей голове и не проверен. Таким образом, в нем могут быть небольшие ошибки, но вы должны получить общее представление:

  • добавить слушателя мыши, когда пользователь наводит мышью на меню
  • удалить этого слушателя, если пользователь выходит из меню
  • попросить слушателя воспроизвести зацикленный видеоклип
  • вызвать событие, которое остановит зацикливание клипа, если движение не было обнаружено в течение некоторого времени
  • как только сработает триггер, остановите клип

Ключ в обнаружении, когда мышь перестает двигаться. Flash хорошо обнаруживает взаимодействие, но не обнаруживает отсутствие взаимодействия по очевидным причинам. Один из простых способов решить эту проблему - запустить таймер, который сработает, если прошло слишком много времени с момента последнего действия. Затем, когда срабатывает таймер, вы знаете, что действие остановлено!

Я думаю, что это ключ к решению вашей проблемы. Я надеюсь, что это кому-то поможет.

~ gmale

...