PDA

Просмотр полной версии : Button, on() and this


Notna
23.07.2002, 14:40
Прошу прощения, если вопрос этот уже задавался и обсуждался, поиск я уже успел просмотреть, но прямого ответа не нашел.

В AS Reference написано, что когда для бутона вызывается on(), то this внутри вызова ссылается на текущую сцену. Можно ли как-то, без хардкодового обращения к названию инстанса кнопки, все таки обратиться к ее параметрам?

Конкретней, я пытаюсь в кнопке btnStop сделать хинт на hover, и пишу такое:

on(rollOver) {
createTextField("txtHint",1, this._x+10, this._y+10, 0, 0);
txtHint.autoSize = true;
txtHint.text = " Press to Stop ";
}

Но вот this._x и this._y возвращают х и у для сцены, т.е. нули. Можно ли как-то добраться до х и у кнопки, без написания btnStop._x и btnStop._y? Не хотелось бы это делать, плохая практика кодирования, а меня это беспокоит в разработке флеш-приложений (я только начал в нем разбираться, но исследую возможность создания серьезных вещей, которые легко тестить и модифицировать).

Заранее благодарен за ответ.

Nox Noctis
23.07.2002, 14:58
можно например снаружи написать

btnStop.onRollOver = function () {
createTextField("txtHint",1, this._x+10, this._y+10, 0, 0);
txtHint.autoSize = true;
txtHint.text = " Press to Stop ";
}

тогда роллОверная функция будет методом и this будет указывать куда надо...

DeliMIter
23.07.2002, 15:06
Noooooooox!!!!!

Я даже запостить не успел.

Notna
23.07.2002, 15:10
Спасибо обоим, огромное :)

А "снаружи" - это где? Мне надо еще время, чтобы въехать в структуру кода. Вариант, который кажется наиболее вероятным - "Actions for Frame 1 of Layer Name Layer 1". Так?



Update: Попробовал, заработало!!! Действительно так и надо? В данном случае у меня одна сцена, один лейер и один кадр (вся жизнь происходит за счет программной анимации ходячего человечка вправо и влево). В более сложных случаях обработчики событий надо навешивать в первом кадре той сцены и того лейера, в который эти объекты положены (или, если создаются динамически, то в том же коде, где они и создаются), да?

Nox Noctis
23.07.2002, 15:16
DeliMIter, спокойно, все хорошо :) убери руку с затвора и верни предохранитель на место :)

2Notna
"снаружи" - это в любом скрипте таймлайна, в котором у тебя лежит этот символ с кнопкой...
...номер кадра и название лэйера не имеют никакого значения - главное:
— определить функцию ДО того, как она может быть использована
— в кадре с этим скриптом кнопка для которой мы это пишем должна присутствовать :)

Notna
23.07.2002, 15:29
А кадр - это один лейер или все видимые в данный момент лейеры?

И еще, расхрабрюсь почувствовав реальную помощь, можно ли объявить function showHint(txt) и hideHint(), а потом написать:

btnLeft.onRollOver = showHint("Go left");
btnRight.onRollOver = showHint("Go right");

и т.п. (ну, и с onRollOut тоже)? Я сделал, но почему-то функции showHint и hideHint вызываются в момент назначения события (трейсом проверил), а по самим событиям не вызываются :(

--
Вообще, чувствую, надо мне создать класс btnWithHint, в котором хранить текст хинта, и мувик картинки (бутоны не текстом разнятся, а видом), и самому по этому мувику двигаться по разным событиям, а потом создать каждую кнопку как объект этого класса. Надо попробовать.

Notna
23.07.2002, 15:41
Получилось вот так:

function showHint(txt,btn) { ... }

btnLeft.onRollOver = function() {
showHint("Go left", this);
}

Nox Noctis
23.07.2002, 15:46
> А кадр - это один лейер или все видимые в данный момент лейеры?
есть таймлайн. (цепочка кадров)
слои в таймлайне нужны по большому счету только для удобства редактирования.
все слои одного таймлайна проигрываются синхронно.

> btnLeft.onRollOver = showHint("Go left");
> btnRight.onRollOver = showHint("Go right");
получается, что ты свойствам onRollOver и onRollOver объекта btnRight присваиваешь результат выполнения функций, а НЕ ссылки на функции

...а с классом попробуй :) может быть будет удобнее :)