1

是的,我在这里看到了一些关于类似问题的主题,但我的问题不同。我在 FlashDevelop 中建立了一个 AIR 项目并写了这个:

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

    public class Main extends Sprite {     
        public function Main():void {
            graphics.beginFill(0)
            graphics.drawRect(0, 0, 100, 100)
            graphics.endFill()
            addEventListener(MouseEvent.CLICK, onEvt)
        }
        private function onEvt(e:MouseEvent):void {
            trace("yahoo")
        }
    }
}

我编译了这个项目,点击黑色方块,什么也没发生。没有什么。然后我将所有这些代码移到另一个类 RealMain 并将其添加为子类:

public function Main():void {
    addChild(new RealMain())
}

它奏效了。那么,如果类是文档类,为什么我的事件监听器不起作用?是的,我可以使用 stage.addEventListener(),但为什么呢?

4

3 回答 3

1

尝试不使用 Sprite 的图形属性,而是制作一个 Shape,在其上绘制并将其 addChild() 添加到您的 Sprite。我希望具有零个子项的 Sprite 表现得像一个形状,而形状本身不能监听事件。

public class Main extends Sprite {     
    public function Main():void {
        var sh:Shape=new Shape();
        sh.graphics.beginFill(0);
        sh.graphics.drawRect(0, 0, 100, 100);
        sh.graphics.endFill();
        addChild(sh);
        addEventListener(MouseEvent.CLICK, onEvt);
    }
    private function onEvt(e:MouseEvent):void {
        trace("yahoo");
    }
}

应该以这种方式工作。

于 2012-12-05T16:00:47.237 回答
1

addEventListener 是 EventDispatcher 类的函数,需要调用 EventDispatcher 的实例。

Main 的行为有所不同,因为它以静态方式调用。为了有一个 Main 的实例,我们必须做一些像下面这样的工作(不是很优雅)

package {
    import flash.display.Stage;
    import flash.display.MovieClip;
    public class Main extends MovieClip {
        private static var _instance:Main = null;
        public function Main() {
            _instance = this;
        }
        public static function getInstance():Main { return _instance; }
        public static function getStage():Stage { return getInstance().stage; }
    }
}

addchild 有助于创建一个普通的类。

于 2012-12-05T16:43:36.177 回答
-1

文档类必须不MovieClip扩展Sprite

于 2012-12-06T00:47:32.677 回答