Как дать динамически создаваемым кнопкам действия для каждой - часть 2

Привет снова, ребята, флешеры :)

Мой первый вопрос, заданный здесь, в StackOverFlow, касался этой проблемы, у меня был массив, который создавал несколько разных кнопок. Однако я не знал, как назначать им действия: Как дать динамически создаваемым кнопкам действия для каждой - часть 1

Благодаря Джоэлу Хуксу мне удалось заставить свой код работать. Однако на этот раз вместо того, чтобы использовать импортированную графику в качестве класса из моей библиотеки, я вместо этого создаю movieClip, рисуя градиент * (не нужно импортировать jpg) *. Теперь я снова получаю ужасную ошибку "не компилируется постоянная времени". Я считаю, что это как-то связано с тем, как я пытаюсь определить экземпляр кнопки, который был нажат или свернут.

Код создания (работает) предыдущей кнопки:

for (var i: Number = 0; i ‹myXMLArray.length; i ++) {navButton = new NavButton; navButton.name = "кнопка" + я; 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: NavButton = event.target как NavButton; var id: Number = Number (button.name.split ("button") 1); if (кнопка) TweenLite.to (buttonRolls [id], .4, {альфа: 1, легкость: 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.

Любая помощь или указатели здесь были бы весьма признательны! Заранее спасибо за то, что взглянули на мой код.


person Leon Gaban    schedule 23.09.2009    source источник
comment
Я предлагаю вам немного прочитать об ООП в сценарии действий - это вам очень поможет. Есть готовые образцы во флэш-документации. Просто присмотри за классом.   -  person Konrad    schedule 13.10.2009


Ответы (2)


Я думаю, поскольку ключевое слово as предназначено для приведения, вместо этого вам нужна эта строка:

var button:MovieClip = event.target as MovieClip;

blueGradient похоже на имя переменной, а не на имя класса.

person a paid nerd    schedule 23.09.2009

Ваша проблема в том, что вы путаете класс 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], и ​​когда вы работаете с этим объектом, вам всегда нужно обращаться к нему по имени, а не по типу. Если у вас нет статического класса со статическим методом, но он немного более продвинутый.

Итак, вкратце: замените blueGradient на «button» в этих двух местах вашего нового обработчика, и это должно решить ваши проблемы. Надеюсь, это помогло!

person Myk    schedule 25.09.2009
comment
Myk, если я могу предложить вам: используйте MovieClip, а не NavButton, отвечая на вопрос - это может ввести в заблуждение новичков;) - person Konrad; 13.10.2009