(as3)Sprite需要添加一个子元素以使其可见,但仅当我将alpha设置为0时才有效?

时间:2018-09-30 15:26:31

标签: actionscript-3

Flash版本:31.0.0.108

所以我有一个精灵,通过鼠标滑过,将alpha设置为0,并通过滚动将其设置为1。

如果我没有添加任何孩子,则在我回滚时它不会再次出现,但是跟踪显示alpha确实设置为1。

如果我确实添加了一个孩子(此处为文本字段),并且该文本字段未触及我的精灵,则它的工作原理与预期的一样。

如果它正在触摸精灵,那么当我再次将鼠标悬停在上方时,只会在文本字段边框中重新显示精灵的一部分。

我只是在键入时注意到这一点-完全调整窗口大小将使其完全重新显示。

如果我将alpha设置为其他值(例如0.01),我根本不会遇到这个问题。如果将其设置为0.001,我确实有它,但是跟踪显示这只是将其设置为0。

这是我的代码:

主类:

package
{

    import flash.display.Sprite;
    import flash.events.Event;
    import Menu;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    public class Main extends Sprite 
    {
        private var mainMenu:Menu = new Menu;
        private var playText:TextField = new TextField;

        public function Main() 
        {
            playText.autoSize = TextFieldAutoSize.LEFT;

            playText.selectable = false;
            playText.text = "Play";

            playText.x = 660 - playText.width * 0.5;
            playText.y = 100;
            playText.border = true;

            mainMenu.addButton(600, 100, 120, 60, 0x914B00, playStart, playButtonOn, playButtonOff);
            mainMenu.buttonP.addChild(playText);

            function playButtonOn():void { mainMenu.buttonArray[0].alpha = 0.001; trace(mainMenu.buttonArray[0].alpha); }
            function playButtonOff():void { mainMenu.buttonArray[0].alpha = 1; }

            mainMenu.addMenu();
            addChild(mainMenu);

            function playStart():void 
            {
                mainMenu.removeMenu();
                removeChild(mainMenu);
            }


        }

    }

}

菜单类:

package 
{
    import flash.display.Sprite;

    import flash.events.MouseEvent;

    public class Menu extends Sprite
    {
        public var buttonArray:Array = new Array;
        private var functionArray:Array = new Array;
        private var functionOnArray:Array = new Array;
        private var functionOffArray:Array = new Array;
        private var rollOnArray:Array = new Array;
        private var rollOffArray:Array = new Array;

        public var buttonP:Sprite;


        public function Menu() 
        {}

        public function addSprite(xPos:Number, yPos:Number, width:Number, height:Number, color:int):void 
        {
            var background:Sprite = new Sprite;
            background.graphics.beginFill(color);
            background.graphics.drawRect(xPos, yPos, width, height);
            background.graphics.endFill();  addChild(background); 
        }

        public function addButton(xPos:Number, yPos:Number, width:Number, height:Number, offColor:int, clickFunction:Function=null, rollOn:Function=null, rollOff:Function=null):void 
        {
            var button:Sprite = new Sprite;

            button.graphics.beginFill(offColor);
            button.graphics.drawRect(xPos, yPos, width, height);
            button.graphics.endFill();


            addChild(button);

            function mouseOn():void 
            {
                trace("on");
                if (rollOn != null) { rollOn(); }

                button.addEventListener(MouseEvent.CLICK, clickFunction);
                button.removeEventListener(MouseEvent.ROLL_OVER, mouseOn);
                button.addEventListener(MouseEvent.ROLL_OUT, mouseOut);

            }

            function mouseOut():void 
            {
                if (rollOn != null) { rollOff(); trace("off");}

                button.removeEventListener(MouseEvent.CLICK, clickFunction);
                button.removeEventListener(MouseEvent.ROLL_OUT, mouseOut);
                button.addEventListener(MouseEvent.ROLL_OVER, mouseOn);
            }

            buttonP = button;
            buttonArray.push(button);
            functionArray.push(clickFunction);
            functionOnArray.push(mouseOn);
            functionOffArray.push(mouseOut);
            rollOnArray.push(rollOn);
            rollOffArray.push(rollOff);
        }


        public function removeMenu():void 
        {
            for (var i:uint = 0; i < buttonArray.length; i++) 
            {
                buttonArray[i].removeEventListener(MouseEvent.CLICK, functionArray[i]);
                buttonArray[i].removeEventListener(MouseEvent.ROLL_OVER, functionOnArray[i]);
                buttonArray[i].removeEventListener(MouseEvent.ROLL_OUT, functionOffArray[i]);

                if (rollOnArray[i] != null) 
                {
                    buttonArray[i].removeEventListener(MouseEvent.ROLL_OVER, rollOnArray[i]);
                    buttonArray[i].removeEventListener(MouseEvent.ROLL_OUT, rollOffArray[i]);
                    rollOffArray[i]();
                }
            }
        }


        public function addMenu():void 
        {
            for (var i:uint = 0; i < buttonArray.length; i++) 
            { 
                buttonArray[i].addEventListener(MouseEvent.ROLL_OVER, functionOnArray[i]);
            }
        }


    }

}

编辑:

菜单类:

addSprite方法:仅绘制一个新的精灵。在这里不相关

addButton方法: 方法“ addButton”绘制一个精灵,其名称为“ button”。 “ mouseOn”和“ mouseOff”函数只是为彼此添加和删除事件侦听器。 mouseOn为参数“ clickFunction”添加“ MouseEvent.CLICK”事件侦听器。 然后mouseOff将其删除。

仅在调用“ mouseOn”时调用“ rollOn”参数。 “ rollOff”和“ mouseOff”相同

此方法末尾的所有数组推送都只是将函数推送到数组中,以供“ addMenu”和“ removeMenu”函数使用。 “ buttonP”只是从主类访问“ button”的一种快速简便的方法。

方法删除菜单: 使用循环删除可能已添加的所有事件侦听器。 (如果我删除了尚未添加的事件监听器,我认为什么也没发生。请告诉我我是否错了。)

方法addMenu:

使用循环为所有按钮的“ mouseOn”添加事件监听器。 (functionOnArray是mouseOn被推入的数组)

主要类别:

在构造函数上方:

mainMenu-我创建一个新的“菜单”

playText-我创建一个新的“ TextField”

构造函数:

我设置了文本字段:

playText.autoSize = TextFieldAutoSize.LEFT;

playText.selectable = false;
playText.text = "Play";

playText.x = 660 - playText.width * 0.5;
playText.y = 100;
playText.border = true;

我通过“ mainMenu”调用“ addButton”方法:

mainMenu.addButton(600, 100, 120, 60, 0x914B00, playStart, playButtonOn, playButtonOff);

然后我将“ playText”作为孩子添加到我刚刚创建的按钮中:

mainMenu.buttonP.addChild(playText)

将鼠标悬停在按钮上并关闭时调用的函数: 这是更改alpha“ 0.001”可以解决问题的地方。 0.1、0.01、0.5等均可使其正常工作。但是将其设置为0会带来问题。 (如轨迹所示,0.001实际上将其设置为0。)

function playButtonOn():void {mainMenu.buttonArray[0].alpha = 0.001; trace(mainMenu.buttonArray[0].alpha); }
function playButtonOff():void {mainMenu.buttonArray[0].alpha = 1; }

为mainMenu调用“ addMenu”,将mainMenu添加为子项。 “ playStart”是单击按钮时运行的功能。

mainMenu.addMenu();
addChild(mainMenu);

function playStart():void 
{
    mainMenu.removeMenu();
    removeChild(mainMenu);
}

0 个答案:

没有答案