0

你好,闪光的朋友们:)

我在 StackOverFlow 提出的第一个问题就是处理这个问题,我有一个数组,它创建了几个不同的按钮。但是我不知道如何为它们分配操作: 如何为每个按钮动态创建按钮操作 - 第 1 部分

感谢Joel Hooks,我能够让我的代码正常工作。然而这一次,我没有将导入的图形用作我的库中的类,而是通过绘制渐变*(不需要导入 jpg)*来创建影片剪辑。现在我又遇到了另一个可怕的“非编译时间常数”错误。我相信这与我如何尝试确定单击或翻转的按钮实例有关。

上一个按钮创建(工作)代码:

for (var i:Number=0; i < myXMLArray.length; i++) { navButton=new NavButton ; navButton.name="按钮" + i; navButton.x=i * navSIZE; navButton.y=navBtnY; navButton.buttonMode=true; thumbsMov.addChild(navButton);

按钮.push(navButton); 按钮[i].addEventListener(MouseEvent.MOUSE_UP,handleButtonClick); 按钮[i].addEventListener(MouseEvent.ROLL_OVER,handleButtonOver); 按钮[i].addEventListener(MouseEvent.ROLL_OUT,handleButtonOff); }

以前的侦听器(工作)代码:

function handleButtonOver(event:MouseEvent):void {

var button:NavButton = event.target as NavButton; var id:Number = Number(button.name.split("button") 1 ); if(button) TweenLite.to(buttonRolls[id], .4, {alpha:1, ease:Strong.easeOut}); cataText[id].defaultTextFormat = a12Green; cataText[id].text = myXMLArray[id].id; }

当前按钮创建代码:

for (var i:Number = 0; i < num; i++) {
trace("loop number = "+i);

var blueGradient:MovieClip = new MovieClip();
 blueGradient.name = "button" +i;
 blueGradient.graphics.beginGradientFill(bGrad, bColors, bAlphas, bRatios ,bMatrix)
 blueGradient.graphics.drawRect(0, 0, 266, 40);
 blueGradient.x = i * navSIZE;
 blueGradient.y = navBtnY;
 blueGradient.buttonMode = true;
addChild(blueGradient);

buttons.push(blueGradient)

buttons[i].addEventListener(MouseEvent.MOUSE_UP, handleButtonClick);
buttons[i].addEventListener(MouseEvent.ROLL_OVER, handleButtonOver);
buttons[i].addEventListener(MouseEvent.ROLL_OUT, handleButtonOff);

}

当前按钮侦听器代码:

function handleButtonOver(event:MouseEvent):void {
var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)
 cataText[id].defaultTextFormat = navFontRoll;
 cataText[id].text = myArray[id].id;

}

只有在注释掉以下行时,当前电影才会正常运行:

var button:blueGradient = event.target as blueGradient;

因为这就是导致出现非编译时间常数错误的原因。但是,通过删除该行,所有按钮都是 button1,而不是动态创建的 2 个名为 button0 和 button1 的按钮。

此处的任何帮助或指示将不胜感激!提前感谢您查看我的代码。

4

2 回答 2

2

您的问题是您将 blueGradient 类与按钮对象混淆了。在原始处理程序中,您的代码说:

var button:NavButton = event.target as NavButton;
var id:Number = Number(button.name.split("button")[1]);
if(button)....

但是在你的新代码中,

var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)

你看得到差别吗?在这两种情况下,您都将按钮对象称为“var button” - 但在新版本中,您编写“blueGradient.name.split...”而不是“button.name.split...”,并且相同对于您的 if() 语句。

var 关键字定义对象的名称。语法是 var [objectName]:[objectType],当您使用该对象时,您总是希望通过其名称而不是其类型来引用它。除非你有一个带有静态方法的静态类,但这有点高级。

所以,简而言之:在你的新处理程序的这两个地方用“button”替换“blueGradient”,它应该可以解决你的问题。我希望这有帮助!

于 2009-09-25T00:25:15.170 回答
1

我认为,由于as关键字用于强制转换,因此您需要此行:

var button:MovieClip = event.target as MovieClip;

blueGradient似乎是变量名,而不是类名。

于 2009-09-23T21:18:09.867 回答