【问题标题】:AS3 Dispatch Custom Event from class to classAS3 将自定义事件从一个班级分发到另一个班级
【发布时间】:2011-04-20 09:35:50
【问题描述】:

我想将 Country() 中的自定义事件发送到 MenuButton();

国家事件

package  {
import flash.events.Event;

public class CountryEvent extends Event {

    public static const COUNTRY_HOVERED:String = "onCountryOver";

    private var _countryName:String = "";

    public function CountryEvent(type:String, countryName:String, bubbles:Boolean=true, cancelable:Boolean=false) {
        super(type, bubbles, cancelable);
        _countryName = countryName;
    }

    public function get countryName():String {
        return _countryName;
    }

    public override function clone():Event
    {
        return new CountryEvent(type,countryName,bubbles,cancelable);
    }
}

} 国家级

package 
{

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Country extends MovieClip
    {
        private var countryEvent:CountryEvent;


        public function Country()
        {
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        }

        private function onMouseOver(e:MouseEvent):void
        {

                countryEvent = new CountryEvent("onCountryOver",this.name);

                dispatchEvent(countryEvent);

            }
        }

        private function onMouseOut(e:MouseEvent):void
        {

        }
    }

}

菜单按钮类

package  {

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import CountryEvent;


    public class MenuButton extends MovieClip {

        public var countryName:String = "";

        public function MenuButton() {

            this.buttonMode = true;
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
            this.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
        }

        private function onCountryOver(e:CountryEvent):void {
            if(e.countryName == countryName) {
                this.gotoAndPlay(2);
            }
        }

        private function onMouseOver(e:MouseEvent):void {
            this.gotoAndPlay(2);

        }

        private function onMouseOut(e:MouseEvent):void {
            this.gotoAndPlay(11);
        }
    }

}

当悬停一个国家/地区时,将调度一个自定义事件,我希望 MenuButton 监听该事件,并且如果传递的参数与其名称相同,则高亮显示。 Country Class 是我在舞台上拥有的国家电影剪辑的基类,MenuButton 是菜单按钮的基类

这个活动好像一直打不通

提前致谢

【问题讨论】:

  • 您好,您的不同元素(国家、菜单按钮)是如何添加到舞台的?他们有同一个父母吗?您可能还想从示例中删除补间,因为它们独立于您遇到的问题并降低了问题的可读性。
  • 它们不是由代码添加的,而是世界动画剪辑的一部分。 world.Germany , world.Spain 等。我会从不相关的东西中清除代码。

标签: actionscript-3 events dispatch


【解决方案1】:

你必须做两处修改:

首先,将您的事件bubbles 属性设置为true,这样当Country 剪辑分派一个事件时,它将上升到顶层。

那么你的MenuButtons 应该听stage,而不是听他们自己。因此,当Country 调度一个事件时,它会上升到stage 并且可以被按钮捕获。如果你想听这个舞台,你必须对你的代码做些小改动:

public function MenuButton() {

    this.buttonMode = true;
    this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
    this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
    this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}

private function onAddedToStage(e:Event):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    stage.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver); 
}

【讨论】:

  • 谢谢你摇滚!一个问题,为什么我必须等待 added_to_stage 事件?
  • 因为如果你不这样做,stage 还不存在。
  • 我明白了......所以我想初始化舞台。感谢帮助我理清了一些事情
  • 只是做一个小的修正。它没有阶段初始化。当 menuButton 被添加到舞台时。 Stage 应该在任何东西被添加到它的显示列表之前很久就被初始化。通过等待 ADDED_TO_STAGE 触发,我们实际上是在等待许多进程完成。 ADDED_TO_STAGE 只是确保舞台是可访问的。
【解决方案2】:

解决此问题的最佳且简单的方法是简单地将阶段引用作为类级别参数传递,并将事件添加到阶段引用并将事件分派到阶段引用。

国家级

package{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class Country extends MovieClip
{
    private var countryEvent:CountryEvent;
    private var _stageRef:Stage;


    public function Country(pStageRef:Stage)
    {
        _stageRef = pStageRef;

        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
    }

    private function onMouseOver(e:MouseEvent):void
    {

            countryEvent = new CountryEvent("onCountryOver",this.name);

            _stageRef.dispatchEvent(countryEvent);

        }
    }

    private function onMouseOut(e:MouseEvent):void
    {

    }
}

菜单按钮类

package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import CountryEvent;


public class MenuButton extends MovieClip {

    public var countryName:String = "";
    private var _stageRef:Stage;

    public function MenuButton(pStageRef:Stage) {
        _stageRef = pStageRef;
        this.buttonMode = true;
        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        _stageRef.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
    }

    private function onCountryOver(e:CountryEvent):void {
        if(e.countryName == countryName) {
            this.gotoAndPlay(2);
        }
    }

    private function onMouseOver(e:MouseEvent):void {
        this.gotoAndPlay(2);

    }

    private function onMouseOut(e:MouseEvent):void {
        this.gotoAndPlay(11);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多