Здравствуйте, гость ( Вход | Регистрация )

Свернуть

Новости

Форум Лучшее из галереи Уроки и статьи
07.12.2015 Выставочный зал: кошарик - персональная выставка
31.08.2015 Интересные ссылки для рисовальщиков
21.01.2015 Выставочный зал 2: Игрушки Олеси Гавриленко

27.12.2014 Выставочный зал: кошарик - персональная выставка
17.11.2014 Дуэль "Рыбки" - победитель Лисичка
05.11.2014 Конкурс иллюстраций "Снежная королева", до 31 января
30.10.2014 Дуэль "Рыбки" до 16 ноября
14.07.2014 Мастер-класс Мини-мишка в технике фелтинга
26.05.2013 Ау! Мы ищем таланты! – приглашаем модераторов!
«日本, или страна восходящего солнца»
tn_gallery_3_3_202628.jpg
Дуэль: «日本, или страна восходящего солнца»
© NAKOFRISH
06.01.2016 Виртуальный Музей: Русский живописец Василий Дмитриевич Поленов
28.12.2015 Виртуальный Музей: Нидерландский живописец Квентин Массейс
16.12.2015 Виртуальный Музей: Итальянский живописец Франче́ско Айец
17.11.2015 Виртуальный Музей: Луи Анкетен (Louis Anquetin)
11.11.2015 Виртуальный Музей: Русский живописец Алексей Иванович Корзухин
Файловый архив
06.09.2013 Прочее: Файлы к уроку "Чайная церемония"
05.09.2013 Журнал Art Tower: ArtTower Magazine #8
16.05.2013 Adobe Photoshop: Кисти: Reid Southen brush
16.05.2013 Adobe Photoshop: Кисти: Goro Fujita brush
16.05.2013 Adobe Photoshop: Кисти: Кисти для рисования в Photoshop
Блоги Новости в цифровом мире и мире дизайна
02.12.2014 Дама с каменьями: Вести с крыши 2
08.11.2014 Timenews: Вассерман: прежняя модель мировой экономики исчерпала себя
06.11.2014 Дама с каменьями: Приятные вести с крыши))) от Гаргула)
02.11.2014 Spell: Книги Дж. Кэмерон
22.10.2014 Vjaz: от ФУ до МА
25.11.2015 Комментарий от Foxx в Costa Rica Adventure Divers, Логотип для компании и рисунок на майку (maria_mer)
18.11.2015 Комментарий от maria_mer в Spellforce - майка, для фанов игры (maria_mer)
18.11.2015 Комментарий от maria_mer в Белая книга. Целитель - любительский прект (maria_mer)
09.04.2015 Комментарий от Romana в Книги Дж. Кэмерон (Spell)
08.04.2015 Комментарий от Romana в Я решил вернуться... (Элбирет)
16.03.2015 ФОТОФОРУМ-2015
01.01.2015 ARQUTE.com и ArtTalk.ru закрываются
19.01.2017 Конкурс дизайна логотипов
26.12.2016 ру/Ководство: О творческом развитии
14.10.2016 ру/Ководство: Разнообразие

 
Добавить ответ в эту темуОткрыть тему
> Основоположения программирования - часть V.3, События в AS2 - продолжение. this и switch
V
Des
сообщение 24.06.2009 - 12:07
Сообщение #1


тритониус
****

Звезда писателя I степениЗа вклад в развитие ArtTower.ru
Группа: Почетные граждане
Сообщений: 728
Регистрация: 9.12.2007
Из: Москва \ Питер
Пользователь №: 6553
дышу под водой
Галерея Блог


Симпатии:  68  


Предыдущая часть: Основоположения программирования - часть V.2
Начало: Основоположения программирования - часть I

Продолжаем изучать события в AS2, а заодно знакомимся с такими необходимыми вещами, как this и switch.
Исходники к уроку: buttonsArray3.fla

1. Переключатель - решение посимпатичней

И все же, перебирать id (см. предыдущий урок) - не самое хорошее решение. Попробуем воспользоваться другой возможностью: использованием ключевого слова this. Но сначала нарисуем кнопку, которая может переключаться, т.е. - две позиции каждой кнопочки: "вкл." и "выкл".
Подготовка сцены и фона описана в предыдущем уроке.

Создаем новый MovieClip ([Ctrl] + [F8]), присваиваем ему библиотечное имя "ind" и сразу же включаем "связывание с Action Script" - т.е. ставим "галочку" на опции "экспортировать для Action Script".
Я нарисовал в символе-кнопке - кнопку в положении "выкл" (см. исходник к уроку), а в отдельном MovieClip с библиотечным именем ind - в положении "вкл.", причем первый кадр этого MovieClip-а - пустой, а сам "индикатор" - во втором кадре. В первом же (вызвав по клавише [F9] редактор скриптов) пишем stop();



Освоившись с программной частью этого урока, вы сможете по-другому организовать создание кнопок, или, напр., нарисовать анимацию плавного включения\выключения каждой кнопки, соответствующим образом изменив программу.

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

CODE
var num:Number = 12;
var btns:Array = new Array();
var tf:TextField = _root.createTextField("tf",_root.getNextHighestDepth(),10,100,530,50);



Пишем самое интересное - функцию создания кнопки. В дальнейшем для создания кнопочки (и размещения ее на сцене - в отличие от AS3, в AS2 все созданное мгновенно оказывается на сцене и беспощадно визуализируется) нам понадобится только вызвать эту функцию - и кнопа готова...

CODE
function createButton(target:MovieClip,name:String,id:Number, depth:Number) {
var ret:MovieClip = target.createEmptyMovieClip(name,depth);
ret.attachMovie("btn","btn_"+name,this.getNextHighestDepth());
ret.attachMovie("ind","ind",this.getNextHighestDepth()+1);
ret.id = id;
ret.onRelease = btnOnReleaseHandler;
return ret;
}


Что тут происходит? А все очень просто: первой строкой функция создает новый пустой MovieClip, дочерний по отношению к target-у - первому переданному аргументу, ссылке на тот ролик (MovieClip), "в котором" мы будем создавать кнопку.
depth - это "глубина", на которую помещается создаваемый пустой ролик.
Вообще говоря, "глубина" - очень хитрое свойство: это своего рода "номер в иерархии объектов". Чаще всего важно, чтобы эта самая "глубина" была свободна - т.е. не занята уже каким-либо MovieClip-ом (иначе тот ролик, который был на этой "глубине", "уйдет в небытие", новый "перезапишется" на его место... в общем, начнется путаница и кавардак). Для определения наименьшей "свободной" глубины (depth) служит функция (метод) getNextHighestDepth(), который используется в следующих строках нашей программы.
Но вернемся к первой строке функции createButton(). В ней, помимо создания нового пустого ролика с именем name на "глубине" depth, еще и объявляется локальная (т.е. действующая только "внутри" функции при ее вызове, невидимая "снаружи") переменная ret, в которую помещается ссылка на вновь созданный пустой ролик.
Следующими строками мы "прицепляем" (attachMovie()) к вновь созданному пустому ролику кнопку (присваивая ей имя "btn_"+name) и "индикатор" ind с именем "ind" из библитеки. Они размещаются на наименьших свободных "глубинах" соданного ранее "пустого" ролика.
И вот здесь впервые появляется ключевое слово "this", играющее довольно важную роль в программировании вообще и в AS в часности.
Для понимания значения этого слова в программировании проще всего, наверное, вспомнить его значение в обычном английском языке - "этот", "эта". Собственно, в этом значении оно в программировании и употребляется - this означает буквально "этот объект" - т.е. тот объект, "из которого" вызвана функция или метод.
В нашем случае метод getNextHighestDepth() вызван из объекта-ролика, на который ссылается переменная ret - значит, именно наименьшая свободная глубина этого ролика и будет этим методом определена - ведь слово this указывает именно на него.
Разобрались? Поехали дальше...
А дальше мы двумя строчками (о, великая свобода AS2!) добавляем новое свойство к нашей кнопке - идентификатор id, которому тут же и присваиваем значение из аргумента функции, и назначаем этой кнопке обрабочик события onRelease. Да, вот так просто. Апологеты строгого ООП рвут и мечут, плачут и плюются, но - да, в AS2 можно, ничтоже сумняшеся, присвоить имя функции (оно же - глобальная, т.е. "видимая отовсюду", переменная!) свойству onRelease! - и все, как вы убедитесь, будет работать.1

И - возвращаем объект ret - ссылку на все, что "натворила" наша функция, т.е. объект с приаттаченными кнопкой btn и индикатором ind, номером-идентификатором id и присоединенным обработчиком события мыши onRelease, который нам еще предстоит написать.

2. Обработчик onRelease - оператор switch

CODE
function btnOnReleaseHandler () {
_root.tf.text = "Кнопка " + this.id + " нажата";
switch (this.id) {
case 0: {
// code for btn 0 here
break;
}
case 1: {
// code for btn 1 here
break;
}
/*
<...>
other cases
<...>
*/
default: {
//
break;
}

}
for (var ii:Number = 0;ii<num;ii++) {
btns[ii].ind.gotoAndStop(1);
}
this.ind.gotoAndStop(2);
}


Вот здесь ключевое слово this уже играет самую важную роль: определяет, от какой именно кнопки пришло событие. Ведь this - это ссылка на конкретный экземпляр объекта-кнопки, а не "кнопку вообще".
И для начала обработчик события2 выводит в текстовое поле tf, которое создано в самом начале нашего скрипта, номер-идентификатор этой кнопки (т.е. this.id)
Дальше нужно, чтобы было выполнено действие, за которое отвечает именно эта, нажатая, кнопка. И здесь мы используем контструкцию switch/case, которая заменит множество условных переходов if (...) {...} else {...}
Этот оператор работает так: в зависимости от значения операнда (в данном случае - от this.id) выполняется соответствующая "ветка" case3. Если среди case нет того, значение которого совпадает со значением операнда, переданного в switch - выполнится блок кода, заданный веткой default ("по умолчанию") - если этот блок задан, конечно. А оператор break, "проставленный" в конце каждого блока case, служит для того, чтобы после выполнения соответствующей ветки оператор switch прекратил свою работу и программа выполнялась дальше. Если забыть поставить этот оператор, то, выполнив блок кода, соответствующий нужному case, программа начнет выполнять все оставшиеся в switch блоки кода case, а потом еще и default - что нам, очевидно, совсем не нужно.
Я советую вам внимательно разобраться в том, как работает, и запомнить, как оформляется (это несложно, если понять логику работы) switch - это веьма часто встречающаяся контрукция. Представьте себе, сколько if (...) {...} else {...} нужно было бы написать, не будь этого удобного оператора - и вы поймете, почему его очень даже стоит освоить.
После выполнения нужной функции (которую вы, конечно, придумаете сами и вызов которой напишете в тех местах, где в соответствующих case стоит комментарий "code for btn ... here") позаботимся, наконец, о внешнем виде переключателя. В цикле "выключаем" все кнопки, после чего "включаем" одну - ту, которая нажата. Ко всем кнопкам обратимся, используя массив ссылок на них, который мы заполним при создании кнопок, а чтобы обращаться именно к тому "индикатору", кнопка которого была нажата - опять используем ключевое слово this.

Все?
Почти...

3. Инициализация.

Осталось насоздавать самих кнопок функцией createButton(), ссылки на них "затолкать" (push) в массив4 и расставить их по нужным местам.
Пишем:

CODE
function init() {
for (var ii:Number = 0; ii<num;ii++) {
btns.push(createButton(_root,"btn"+ii.toString(),ii,_root.getNextHighestDepth()));
btns[ii]._x = 10+btns[ii]._width*ii;
}
}


Функция init() добавляет в цикле новые кнопки на наименьшую свободную глубину "корня" сцены, причем идентификатор ее - это счетчик цикла, а имя, которое будет использовано функцией createButton - это "btn_" + значение счетчика цикла, после чего ставит их рядышком, причём нам даже не надо задумываться о ширине этих кнопок - функция сама возьмет эту ширину из свойства _width свеженькой только что созданной кнопки и посчитает соответствующую координату _x.

Вот теперь - все. Дописываем

CODE
init();
stop();


и нажимаем [F12].




Продолжение



------------------------------------
1 поясню обилие восклицательных знаков: подобное лихое присвоение просто немыслимо в "более серьезных" ООП-языках. В AS3, напр., чтобы завести новое свойтво объекта, нужно писать пользовательский класс этого объекта, а такой вещи, как "свойство onRelease", нет и быть не может в принципе: все события - только как порождаемые EventDispatcher-ами объекты-Event-ы, чья "жизнедеятельнось" контролируется EventListener-ами... Впрочем, сие иногда, конечно (когда нужно "обкодить" две кнопки, не теряя времени на выписывание всего аппарата обработки событий "по-взрослому") - преимущество, но в проектах посерьезнее - большой недостаток AS2: напр., уже трехуровневое динамическое меню на AS3 пишется куда веселее.
2 для тех, кто, несмотря на явную необходимость smile.gif , не читал предыдущего урока: т.е. функция, которая вызывается при наступлении определенного события, напр., в данном случае - при отпускании кнопки мыши.
3 switch по-английски - "переключатель", case - "случай" (в том смысле, в котором это слово входит в выражение "в этом случае...").
4 см. Основоположения программирования, часть IV.2 - Что можно делать с массивами?

___________________________________


Автором урока является Des.
Запрещается копирование и публикация урока на других сайтах без письменного согласия автора и размещения ссылок.


The tutorial is written by Des.
No part of this tutorial can be copied/pasted on any other website without the author's express written permission.


Сообщение отредактировал Des - 29.07.2009 - 10:06


--------------------
"Высшая мудрость - умение разговаривать с людьми" ((с) Ямамото Цунэтомо (Дзётё), "Хагакурэ")
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Быстрый ответДобавить ответ в эту темуОткрыть тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия форума Сейчас: 17.10.2017 - 06:53