AS3 - 派遣事件问题

时间:2009-05-11 23:41:13

标签: flash actionscript-3 event-handling dispatchevent

我有一个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 个答案:

答案 0 :(得分:3)

你是对的,他们应该运作相同,这留下了一个巨大的问题,即应用程序中还有什么。好像虽然问题不在这里,但在其他地方。

我不想问这样的问题,但你确定事件是从根显示对象中被触发的吗?如果没有从那里开火,你将无法从外部听到它。

很抱歉,但如果没有看到更多实际代码或了解有关情况的更多信息,我就无法再为您提供更多信息。

泰勒。

答案 1 :(得分:1)

我认为您已将bubbles属性设置为false。这样可以防止事件冒出来而不是它所在的容器。

请改为尝试:

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

另外,关于组织,我会创建一个PresentationEvent类,并且对它们有SKIP_PREVIOUSSKIP_NEXT个事件常量。这与ActionScript使用的事件模型更加一致,并且减少了冗余。通过这种方式,您可以将当前演示文稿和其他方便的演示文稿相关数据作为活动的一部分传递。

答案 2 :(得分:0)

我也在使用调度自定义事件,但有时它的工作,有时它不是。例如:

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


}

}