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);
}