Eventlisteners不在主Sprite AS3上工作

时间:2014-06-16 06:19:43

标签: actionscript-3 flash event-listener

我一直在寻找一些文章和SO问题,以便掌握我在项目中遇到的确切内容,但没有找到答案。

我正在创建一个主精灵,作为我这个特定项目的根目录(我正在使用术语,因为我现在理解它。如果我错了,请纠正我)。在那个sprite类中,我添加了一个MouseEvent监听器,以便我可以用鼠标以某种方式操作。问题是,主精灵的行为好像它无法读取我的鼠标事件或它没有大小,因此无法注册鼠标事件。这是我的课程和我已经完成的测试。

============
Main Class =
============

package 
{
    import flash.display.Sprite;
    import Fu;

    [SWF(backgroundColor = "0xffffff", width = "550", height = "400")]
    public class Main extends Fu 
    {

        public function Main():void 
        {
            super();
            addMouseListener();
        }

    }

}


==========
Fu Class =
==========

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class Fu extends Sprite
    {
        private var display_height:uint;
    private var display_width:uint;
    private var default_background_color:uint;

        public function Fu(display_height:uint = 400, display_width:uint = 550, default_background_color:uint = 0x2e2e2e)
        {


            this.display_height = display_height;
            this.display_width = display_width;
            this.default_background_color = default_background_color;

            if (stage) {
                init();
            }
            else {
                addEventListener(Event.ADDED_TO_STAGE, init);
            }
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            graphics.beginFill(default_background_color, 1);
            graphics.drawRect(0, 0, display_width, display_height);
        }


        public function addMouseListener():void {
            trace("Added Mouse Listeners");
            addEventListener(MouseEvent.CLICK, onMouseEvent); 
                    // Also tried MouseEvent.MOUSE_OVER, MouseEvent.ROLL_OVER
                    // with no results either.
        }


        private function onMouseEvent(e:Event):void {
            trace("Mouse Event Fired.");
        }

    }

}

所有内容编译好并运行正常,直到我尝试激活鼠标事件(例如点击),在这种情况下,没有任何内容输出到控制台。

================
Console Output =
================

Added Mouse Listeners
//Event messages should appear here...

如果我然后使用以下代码将第二个精灵添加到Main类...

===========================
Added to Main constructor =
===========================

var s:Sprite = new Sprite();
s.name = "s";

s.graphics.beginFill(0x000000);
s.graphics.drawRect(0, 0, 200, 200);

addChild(s);

然后点击s我收到“Mouse Event Fired”。在控制台窗口中,但不是当我在s'200x200框外面点击时。

我也尝试将监听器添加到舞台上(这不是我想要的,因为我希望这些监听器只影响这个特定SWF文件的主精灵)并追踪...

trace(e.target, " ", (e.target as DisplayObject).name);

sprite未覆盖的区域在控制台中显示“[object Stage] null”,单击s时显示“[object Sprite] s”。

一个明显的解决方法是使用s作为我的“舞台”并将其称为一天,但我很好奇为什么事件侦听器不能在主精灵上工作以及为什么它没有像其他精灵一样的默认实例名称

有什么想法吗?

1 个答案:

答案 0 :(得分:-2)

你的文档类不能扩展Fu,因为Fu需要两个参数而一个文档类不能有一个。除此之外,文档类扩展Sprite或MovieClip以外的任何内容是没有意义的,因为在应用程序的层次结构中不能有任何更高的对象。但是如果你必须扩展一个自定义超类,超类不能参数。而是创建一个单独的init方法,您可以自己调用它来注册您的事件并绘制您的内容。

文档类是一种特殊情况。当用作应用程序中的主条目(而不是外部加载的swf)时,它们被设置为不直接接收交互式事件并且表现得像Singleton。它们也被设置为应用程序的根,并且是唯一具有在构造函数中直接可用的阶段的DisplayObject。设计理念是它应该是您的应用程序的容器,而不是直接的一部分。层次结构是阶段 - > root(文档类) - >你的app元素。 在您的情况下,例如,如果您要将Fu实例添加为文档类实例的子实例,那么它将正常接收mouseevent,并且文档类也会在它们传播时捕获这些事件。

相关问题