(as3) спрайту нужен добавленный дочерний элемент, чтобы быть видимым, но только если я установил альфа в 0? - PullRequest
0 голосов
/ 30 сентября 2018

Версия Flash: 31.0.0.108

Итак, у меня есть спрайт, и при наведении курсора мыши я устанавливаю альфа на 0, а при развертывании я устанавливаю его на 1.

Если у меня нет дочернего элемента, он не появится снова, когда я откатывался, но трассировка показывает, что альфа действительно установлена ​​на 1.

Если у меня есть дочерний элемент, добавленный кэто (текстовое поле здесь), и текстовое поле не касается моего спрайта, оно работает как ожидалось.

Если оно касается спрайта, то, когда я снова наведу курсор мыши, только часть спрайта вграница текстового поля снова появится.

И я только заметил это во время набора текста - изменение размера окна вообще заставит его полностью появиться.

И у меня вообще не возникнет этой проблемы, если я установлю альфана что-нибудь еще, например 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 рисует спрайт, он имеет название «кнопка».Функции «mouseOn» и «mouseOff» просто добавляют и удаляют прослушиватели событий для друг друга.mouseOn добавляет прослушиватель событий «MouseEvent.CLICK» для параметра «clickFunction».и mouseOff удаляет его.

параметр "rollOn" просто вызывается, когда вызывается "mouseOn".то же самое для "rollOff" и "mouseOff"

Весь массив, помещаемый в конец этого метода, просто помещает функции в массив для использования в функциях "addMenu" и "removeMenu".«buttonP» - это простой и быстрый способ получить доступ к «кнопке» из основного класса.

метод removeMenu: Использует цикл для удаления всех прослушивателей событий, которые могли быть добавлены.(Если я удаляю EventListener, который не был добавлен, я думаю, что ничего не происходит. Пожалуйста, скажите мне, если я ошибаюсь.)

Метод 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;

Я вызываю"addButton "метод с" mainMenu ":

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

и я добавляю" playText "как дочерний элемент к только что созданной кнопке:

mainMenu.buttonP.addChild(playText)

Функции, которые вызываются при нажатии кнопкинаведен и отключен: именно здесь изменение альфа «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; }

вызовите "addMenu" для mainMenu, добавьте mainMenu как дочерний."playStart" - это функция, которая запускается при нажатии кнопки.

mainMenu.addMenu();
addChild(mainMenu);

function playStart():void 
{
    mainMenu.removeMenu();
    removeChild(mainMenu);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...