AS3 - Проблема отправки события - PullRequest
0 голосов
/ 12 мая 2009

У меня есть проект Flash AS3, который загружает внешние SWF-файлы и контролирует их различными способами. В некоторых загруженных SWF-файлах имеется кнопка «Следующий выбор», которая позволяет перейти к новой презентации. На моем основном внешне загруженном SWF у меня есть код:

setTimeout(function() {dispatchEvent(new Event("nextPresentation", false));}, 4000);

, которые автоматически переходят к следующему выбору в наборе. Этот код работает именно так, как я хочу.

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

function nextSelectionClick(evt:MouseEvent) {
    trace('here123');
    dispatchEvent(new Event("nextPresentation", false));
} 

По какой-то причине это событие никогда не попадает в файл, который загрузил SWF. Я уверен, что добираюсь до события click, потому что я получаю трассировку, но событие никогда не составляет его, даже если кажется, что оно должно быть точно таким же, как и время ожидания. Что мне здесь не хватает? Почему этот код ведет себя иначе, чем нажатие кнопки, а не время ожидания?

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 мая 2009

Вы правы в том, что они должны функционировать одинаково, что оставляет гигантский вопрос о том, что еще происходит в приложении. Кажется, будто проблема не в этом, а в другом месте.

Мне неприятно задавать такой вопрос, но вы уверены, что событие запускается из корневого экранного объекта? Если он не стреляет оттуда, вы не услышите его извне.

Извините, но я не могу дать вам гораздо больше, не увидев более актуальный код или не узнав больше о ситуации.

Тайлер.

1 голос
/ 12 мая 2009

Я думаю, вы установили атрибут bubbles на false. Это предотвратит всплытие события дальше, чем контейнер, в котором оно находится.

Попробуйте вместо этого:

dispatchEvent(new Event("nextPresentation", true));

Также, что касается организации, я бы создал класс PresentationEvent и имел бы константы событий SKIP_PREVIOUS и SKIP_NEXT. Это больше соответствует модели событий, используемой ActionScript, и сокращает избыточность. Таким образом, вы можете передать текущую презентацию и другие полезные данные, связанные с презентацией, как часть события.

0 голосов
/ 20 марта 2012

Я также использую пользовательское событие рассылки, но иногда оно работает, а иногда нет. Например:

private function rollBackAction
{
  var atd:Class =  getDefinitionByName("com.utils."+CreateList.currentClass) as Class;
  dispatchEvent(new AppEvent("RollBackAction",{}));

}

и функция использования

package com.utils
{

import com.components.mouseOverAct;
import com.model.CreateList;
import com.SequenceCheck.SeqCheck;
import com.events.AppEvent;


import flash.display.MovieClip;

import flash.events.MouseEvent;

import flash.events.Event;


public class RightRotate extends mouseOverAct
{
    private var rotateBool:Boolean;
    private var XposIntial:Number;
    private var A:Number;
    private var An:Number;
    private var angle:Number;
    var mc:MovieClip;
    private var frameCount:int;

    public function RightRotate()
    {
        trace("main")
        this.buttonMode = true;
        this.addEventListener("RollBackAction",rollingBack);
        knob_mc.addEventListener(MouseEvent.MOUSE_DOWN,turn);
    }
    private function rollingBack(e:AppEvent)
    {
        trace("Abc")
        knob_mc.rotation = An;
        rotation_01.gotoAndStop(A);
    }
    private function turn(e:MouseEvent):void
    {
        mc = simulator.activityAssets.spw.neddle;
        CreateList.excerciseName = "Right_Bottom_Right";
        CreateList.currentClass = "RightRotate";
        A = rotation_01.currentFrame;
        An = knob_mc.rotation;
        this.stage.addEventListener(MouseEvent.MOUSE_MOVE,turn);
        this.stage.addEventListener(MouseEvent.MOUSE_UP,endTurn);
        var position:Number = Math.atan2((mouseY - knob_mc.y),mouseX - knob_mc.x);
        //trace(position);
        angle = (position / Math.PI) * 180;
        knob_mc.rotation = angle;
        if (CreateList.stepId >= 3)
        {
            if (mc.currentFrame > 3)
            {
                mc.gotoAndStop(mc.currentFrame + 5);

            }
        }
        mainProcess();
    }

    private function endTurn(e:MouseEvent):void
    {
        rotateBool = false;
        rotation_01.gotoAndStop(rotation_01.currentFrame);
        knob_mc.removeEventListener(MouseEvent.MOUSE_DOWN,turn);
        this.stage.removeEventListener(MouseEvent.MOUSE_MOVE,turn);
        knob_mc.addEventListener(MouseEvent.MOUSE_DOWN,turn);
        var sqChck:SeqCheck = new SeqCheck(CreateList.stepId);

    }

    private function mainProcess()
    {
        if (! rotateBool)
        {
            rotateBool = true;
            rotation_01.gotoAndPlay(rotation_01.totalFrames / 2 + rotation_01.currentFrame);
        }
    }


}

}
...