Версия 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);
}