AS3 - 有没有办法用较少的代码编写它

时间:2014-11-24 15:55:07

标签: actionscript-3 flash

有没有办法用较少的代码写这个?因为如果我在菜单中添加更多按钮,我会的 需要更多的事件执行者和功能,感觉还有其他方法来实现这一点。

代码:

    private function addMenu():void
    {
        var menu:Sprite = new Sprite();
        var resumeButton:Sprite = new Sprite();
        var exitFullscreenButton:Sprite = new Sprite();
        var exitButton:Sprite = new Sprite();

        resumeButton.addEventListener(MouseEvent.CLICK, resumeButtonHandeler);
        exitFullscreenButton.addEventListener(MouseEvent.CLICK, exitFullscreenButtonHandeler);
        exitButton.addEventListener(MouseEvent.CLICK, exitButtonHandeler);

        menu.addChild(exitFullscreenButton);
        menu.addChild(exitButton);
        stage.addChild(menu);

        menu.x = stage.stageWidth / 2 - menu.width / 2;
        menu.y = stage.stageHeight / 2 - menu.height / 2;
    }

    private function resumeButtonHandeler(e:MouseEvent):void
    {
        trace("Im the resumeButton");
    }

    private function exitFullscreenButtonHandeler(e:MouseEvent):void
    {
        trace("Im the exitFullscreenButton");
    }

    private function exitButtonHandeler(e:MouseEvent):void
    {
        trace("Im the exitButton");
    }

2 个答案:

答案 0 :(得分:0)

您可以封装按钮创建,例如:

private function addButton(menu:Sprite, clickHandler:Function):void {
    var button:Sprite = new Sprite();
    button.addEventListener(MouseEvent.CLICK, clickHandler);
    menu.addChild(button);
}

此外,您可以使用这样的匿名函数:

button.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
    doStuff();
});

但我不建议使用匿名功能。也许它会保存一些代码行,但源代码将更难读(imho)并且它可能会发生一些内存泄漏。

一般来说,我建议你不要忘记你可以将逻辑分成不同的类。

答案 1 :(得分:0)

保留设置功能(addMenu),但删除侦听器并添加新行:

private function addMenu():void
{
    var menu:Sprite = new Sprite();
    var resumeButton:Sprite = new Sprite();
    var exitFullscreenButton:Sprite = new Sprite();
    var exitButton:Sprite = new Sprite();

    //you are missing the resume button? intentional?
    menu.addChild(exitFullscreenButton);
    menu.addChild(exitButton);
    stage.addChild(menu); // !!!

    menu.addEventListener(MouseEvent.CLICK, handleMenuClick); //added line

    menu.x = stage.stageWidth / 2 - menu.width / 2;
    menu.y = stage.stageHeight / 2 - menu.height / 2;
}

然后只需创建一个handleMenuClick函数,该函数将负责处理菜单上的每次点击(其子项):

private function handleMenuClick(e:MouseEvent):void {
    switch(e.target) {
        case exitFullscreenButton:
            trace("exitFullscreenButton click");
            break;
        case exitButton:
            trace("exitButton click");
            break;
    }
}

请注意,您需要将按钮作为类变量,而不是局部变量!否则你将无法比较参考文献。或者,您可以为其分配.name属性,然后对其进行比较(e.target.name

我劝你把你的物品添加到舞台上,顺便说一句。始终将它们添加到您的舞台所有者(也就是您的主/文档/类)。 (我在代码中将其标记为//!!!