AS3 - выпуск события отправки
У меня есть проект 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 ответа
Вы правы в том, что они должны функционировать одинаково, что оставляет гигантский вопрос о том, что еще происходит в приложении. Кажется, будто проблема не здесь, а в другом месте.
Ненавижу задавать подобные вопросы, но вы уверены, что событие запускается из корневого экранного объекта? Если он не стреляет оттуда, вы не услышите это снаружи.
Извините, но я не могу дать вам гораздо больше, не увидев более актуальный код или не узнав больше о ситуации.
Тайлер.
Я думаю, что вы установили bubbles
приписывать false
, Это предотвратит всплывание события дальше, чем контейнер, в котором оно находится.
Попробуйте это вместо этого:
dispatchEvent(new Event("nextPresentation", true));
Кроме того, что касается организации, я бы сделал PresentationEvent
класс и есть SKIP_PREVIOUS
а также SKIP_NEXT
константы событий на них. Это в большей степени согласуется с моделью событий, используемой ActionScript, и сокращает избыточность. Таким образом, вы можете передать текущую презентацию и другие полезные данные, связанные с презентацией, как часть мероприятия.
Я также использую пользовательское событие рассылки, но иногда оно работает, а иногда нет. Например:
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);
}
}
}
}