如何为每个动作创建按钮动作 - 第2部分

时间:2009-09-23 21:03:29

标签: flash actionscript-3 button compile-time compile-time-constant

嗨,同事弗拉瑟斯:)

我在StackOverFlow处的第一个问题处理了这个问题,我有一个数组创建了几个不同的按钮。但是我不知道如何为他们分配动作: How to give dynamically created buttons actions for each one - part 1

感谢Joel Hooks,我能够让我的代码正常运行。但是这次不是使用导入的图形作为我的库中的类,而是通过绘制渐变*(不需要导入jpg)来创建movieClip *。现在我再次遇到另一个可怕的“not compile time constant”错误。我认为这与我如何确定点击或滚动的按钮实例有关。

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

for(var i:Number = 0; i< myXMLArray.length; i ++){   navButton = new NavButton;   navButton.name =“button”+ i;   navButton.x = i * navSIZE;   navButton.y = navBtnY;   navButton.buttonMode = TRUE;   thumbsMov.addChild(navButton);

buttons.push(navButton);   按钮[I] - 阅读进度 - (侦听MouseEvent.MOUSE_UP,handleButtonClick);   按钮[I] - 阅读进度 - (MouseEvent.ROLL_OVER,handleButtonOver);   按钮[I] - 阅读进度 - (MouseEvent.ROLL_OUT,handleButtonOff);  }

上一个侦听器(工作)代码:

function handleButtonOver(event:MouseEvent):void {

var按钮:NavButton = event.target为NavButton;   var id:Number = Number(button.name.split(“button”)1);   如果(按钮)    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而不是动态创建的名为button0和button1的2个按钮。

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

2 个答案:

答案 0 :(得分: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按钮” - 但是在新版本中你编写了“blueGradient.name.split ...”而不是“button.name.split ...”并且相同对于你的if()语句。

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

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

答案 1 :(得分:1)

我认为,由于as关键字用于投射,因此您需要此行:

var button:MovieClip = event.target as MovieClip;

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